==========================================
Hudson CI server installation step by step
==========================================

Why Hudson
==========

One of the advantages of `Hudson <hudson-ci.org/>`_ over 
`Buildbot <http://buildbot.net/>`_, for instance, is that
almost everything is done via its web interface. So anyone can
manage the continuous integration server easily.
Another advantage over the other alternatives is Hudson has many
`available plugins <http://wiki.hudson-ci.org/display/HUDSON/Plugins>`_,
so you don't need to write your own.

Hudson runs on Java, so the next step is to install Java and its dependencies.


Java and its dependencies
=========================

You can install all Java related packages this [not recommended] way::

    $ [sudo] apt-get install ca-certificates-java daemon default-jre\
    > default-jre-headless gcj-4.4-base gcj-4.4-jre-headless gcj-4.4-jre-lib\
    > icedtea-6-jre-cacao java-common libaccess-bridge-java\
    > libaccess-bridge-java-jni libgcj-common libgcj10 libjline-java \
    > openjdk-6-jre openjdk-6-jre-headless openjdk-6-jre-lib\
    > rhino tzdata-java tzdata
    

Or try installing with the information in the next section and
if you have problems, run::
    
    $ [sudo] apt-get install -f




Installation
============

The recommended installation from `Hudson site for Debian users
<http://hudson-ci.org/debian/>`_ is installing through the `.deb` package.
The advantages are: you can automatically upgrade hudson via apt and
use the `service` or `/etc/init.d` resource to start the daemon on boot.

To install Hudson as they recommend, do the following:

* Add the key to your system::
    
    $ wget -O /tmp/key http://hudson-ci.org/debian/hudson-ci.org.key
    $ [sudo] apt-key add /tmp/key


* Then install Hudson::

    $ wget -O /tmp/hudson.deb http://hudson-ci.org/latest/debian/hudson.deb
    $ [sudo] dpkg --install /tmp/hudson.deb


When you reboot the computer the web daemon will be started at
http://localhost:8080. If you don't want to reboot the computer, run::

    $ [sudo] service hudson start
    or
    $ [sudo] /etc/init.d/hudson start




Apache
======

It is not necessary for all users, but if you want to set up apache to run
the web interface, you should follow this tutorial:
http://wiki.hudson-ci.org/display/HUDSON/Running+Hudson+behind+Apache


Plugins
=======

Installing plugins in Hudson is very easy.
Just click *Manage Hudson*, then *Manage Plugins*.
The tab *Updates* shows all available updates to installed plugins.
But what we need now is to install plugins. So we must go to the
*Available* tab and check what we want to be installed and then press the
*Install* button in the end of the page.

The Hudson server hosted at http://ci.cloudsilverlining.org has the following
plugins installed for pip project:

* Hudson IRC Plugin
* Green Balls
* Hudson Continuous Integration game
* Hudson instant-messaging plugin
* Hudson Jabber notifier plugin
* Hudson Email Extension Plugin
* Hudson Mercurial plugin


Creating a Job
==============

Before Creating a Job for pip
-----------------------------

Hudson manages "jobs". Jobs are complete builds to Hudson. For instance,
you want to build pip project and run its tests with nosetests.
This section  assumes you have all needed `dependencies installed`_.

You need to set up some configuration in Hudson before creating your first job.
Go to Hudson home page, "Manage Hudson", then "Configure System".

In the Mercurial section, fill the "Add Mercurial" section with:

* Name: `hg`
* Installation directory: `/usr`
* Executable: `INSTALLATION/bin/hg`

In the Shell section fill the shell executable with `/bin/bash`.

Then press the "Save" button in the bottom of the page.


    
    
Configuring a Job Step by Step
------------------------------

* Go to the home of the Hudson web interface
* Click *New Job*
* Pick a name for the job - pip, for instance
* Mark the option "Build a free-style software project"
* Press "OK" button

Now you were redirected to the job's configuration page. Here you will
tell Hudson how it will build your job. The most important
steps are listed (assume Mercurial plugin is installed):

* Check "Mercurial" in Source Control Management section
* Fill in the repository URL with **https://github.com/pypa/pip**
* Mark "Build periodically" in *Build Triggers* section
* Add "0 0 \* \* \*" (without quotes) to tell hudson you want to
  run your build everyday at midnight
* Click "Add Build Step" in the *Build* section and pick "Execute Shell"

This box will contain all code you want your build run. To run pip's tests
we need to install pip tests's depencies and run nosetests.
Add the following lines to the box (it assumes you have virtualenv
in your system's python)::

    python -mvirtualenv --no-site-packages pip_virtualenv
    source pip_virtualenv/bin/activate
    cd $WORKSPACE/..
    easy_install -U pip
    cd $WORKSPACE
    pip install virtualenv scripttest nose
    nosetests tests -v
    
The *$WORKSPACE* environment variable is the current build workspace,
in the case above it is the clone repository path. The `cd` stuff is
a work around to a pip's bug.

The process execute above means:

* create a virtualenv called **pip_virtualenv** without shared site-packages
* activate the environment
* updates system's pip
* install pip tests's dependencies
* run nosetests in the current directory


Press the "Save" button and in the next page test if the build is correct
by clicking "Build now" button.

In the left sidebar will appear the run builds and the running (if exists).
Click the top build, then "Console Output". Now you can
watch what Hudson is doing to build your job and watch the results.




Notes
=====

If you change anything in your system environment, like updating
your environment configuration files, and realize Hudson
didn't catch your changes, try restarting it::

    $ [sudo] service hudson stop
    $ [sudo] service hudson start
    
If when you run the `start` command you get an error telling you the port
is being used, wait about 2 or 3 seconds and try the command again - it's the
time the port releasing may take.

What is covered here is the basic knowledge to start setting up and using
a Hudson server, the goal is not teaching all about Hudson or all about
how to set up every detail.

There is a running Hudson server aimed for pip project here:
http://ci.cloudsilverlining.org/view/pip


Creating a Windows Slave to Run Jobs
====================================

After starting Hudson on Linux, start your Windows machine and access the
Hudson web interface.

Adding a Windows Node to Hudson CI Server
-----------------------------------------

Click "Manage Hudson", "Manage Nodes", "New Node". The **Node name** value
must be the Windows machine domain name - mywindowsslave.myhost.com, for
instance.

The "Launch method" should be **Launch slave agents via JNLP**

.. image:: _static/launch-jnlp-slave.JPG
   :width: 500px
   :target: _static/launch-jnlp-slave.JPG

Then press the **Add** button, and in the next page click
the **Launch** icon.

.. image:: _static/slave-launch-icon.png
   :width: 500px
   :target: _static/launch-jnlp-slave.JPG

Now you are able to create jobs tied to this Windows machine.


Creating Tied Jobs
------------------

The process of creating a job is almost the same as the list in the
`Creating a Job`_ section, the only difference is that you need
to mark the **Tie this project to a node** option and select what
node you want to run that build.

There is a difference in build commands, relying on variables. On Linux
they all start with `$`, like `$WORKSPACE`.
In Windows they will be enclosed by `%`,  like `%WORKSPACE%`. And everything
you were doing depending on Bash, you will need to change to DOS
prompt commands and batch files.



.. _dependencies installed: running-tests.html#system-requirements
.. _creating a job: #creating-a-job
