Jenkins in your Dock!
Are you a Mac user? Do you like Mac applications because they are easy to install, uninstall, start and stop?
Are you a Mac user who likes Jenkins? Do you find Jenkins a bit hard to install, uninstall, start and stop? Then Jenkins.app is for you.
(What is Jenkins? Jenkins is software for continuous integration. You can learn more about it at http://jenkins-ci.org)
News
Jenkins.app is not properly codesigned, which prevents you from running it on 10.8 Mountain Lion. The workaround is to right-click Jenkins.app and choose Open.
Builds < 49 have a partial (and thus broken) codesignature, which prevents even the right-click open from working. Build 49 has been properly codesigned, but until I cough up $99 for Apple, we have to settle for a self-signed signature.
I am finally convinced ant was a poor choice for a build tool. Ant is gone, make is the new ant.
Installation
From ready-to-run packages:
- Download Jenkins_NN.zip from http://jenkins-app.s3-website-eu-west-1.amazonaws.com/.
- Double-click Jenkins_NN.zip to unpack Jenkins.app.
- (Optional) Move Jenkins.app wherever you want.
- You're done!
Or you can also build it from the source using make:
make
- You're done!
Starting Jenkins
- Double-click on Jenkins.app
- If this is the first time you have run Jenkins.app, it will download the actual Jenkins server software.
- When the Jenkins server is ready to run, a dialog will be shown, asking if you want to customize the JVM options. This is where you can increase heap size or set jmx ports.
- Next, another dialog is shown asking if you want to customize the command-line used to start the Jenkins server. The command-line is explained at https://wiki.jenkins-ci.org/display/JENKINS/Starting+and+Accessing+Jenkins. You can also leave the command-line empty to go with the defaults.
- When Jenkins is up and running, your web browser will automatically open the Jenkins UI.
All the dialogs above wait for your input for maximum of 15 seconds. This makes it possible to start Jenkins.app automatically and unattended.
Jenkins.app will remember the JVM and command-line settings and the next time you start, it will default to the same command-line you used the last time.
Stopping Jenkins
Quit Jenkins.app. It will warn you if Jenkins is busy building something, to keep you from killing that long build you did not know was running.
Upgrading Jenkins
Because Jenkins.app is just a front-end for the actual Jenkins server, they are updated independently of each other.
The Jenkins project usually releases a new version every week. You can upgrade Jenkins normally in the Manage Jenkins page. Just tell Jenkins to restart itself. You do not have to stop and restart Jenkins.app.
Jenkins.app will check for new version of itself every time it starts. If there is a new version available, a prompt will appear. If you want to upgrade Jenkins.app, a browser window will open to the Jenkins.app download site. Download the new version, unpack and drop it on the old version.
Uninstalling Jenkins
Drag Jenkins.app to the Trash.
If you used Jenkins for building software, running tests and such, there are some files in ~/.jenkins that you may want to move to Trash too.
How do I make Jenkins.app start automatically?
Jenkins.app is a Mac application, and you can make any app start automatically when you log in by making it a login item. You do this by right-clicking on the app's Dock icon when it is running and choose to open it upon login.
If you need Jenkins.app to start automatically on boot, you need to configure one user account to automatically log in on boot. You probably also want to set up screensaver with a short idle period to prevent anyone unauthorized from using the Mac.
Why would I want to use Jenkins.app?
The official Jenkins installer for Mac sets up Jenkins as a launch daemon running under a dedicated user account. This has the advantage that it starts up automatically when the Mac boots up. It also has the disadvantage of not being able to access things in a user context, like Keychain for code signing or the Windowserver for drawing windows.
Jenkins.app runs Jenkins in your user session, so Jenkins and the processes started by Jenkins have full access to e.g. Keychain or Windowserver.
Jenkins.app is an alternative way to run Jenkins on the Mac. Or you can use the official installer. You can choose the best for your situation.
Security considerations
Jenkins executes commands as you and the commands can be controlled using the Jenkins web UI. This is a security nightmare, unless you trust the network where your Mac sits and everyone in that network.
What can you do?
First, you could create a dedicated user account for running Jenkins. If you enable fast user switching, you can continue using your Mac while Jenkins runs as another user.
If you are the only one who needs to use Jenkins, you could tell
Jenkins to bind to loopback interface only:
--httpListenAddress=127.0.0.1
If Jenkins needs to be usable to people on the network, you can turn on Jenkins security, forcing people to log in before they can see interesting things or make any changes. You can even assign people to groups that have various permissions. See https://wiki.jenkins-ci.org/display/JENKINS/Securing+Jenkins for the details.
For extra security, you could do both of the above and run a reverse proxy, which controls access to Jenkins. Proxy servers often have more sophisticated access control mechanisms than Jenkins has.
A sample Apache config file for setting up such a proxy would be something like:
ProxyPass /jenkins http://localhost:8080/jenkins ProxyPassReverse /jenkins http://localhost:8080/jenkins ProxyRequests Off <Proxy http://localhost:8080/jenkins*> Order allow,deny Allow from localhost Allow from 192.168.1 Allow from .local </Proxy>
You could combine this with Jenkins command line:
--httpListenAddress=127.0.0.1 --ajp13Port=-1 --prefix=/jenkins
There is no need to disable HTTPS port, because it is disabled by
default. The --prefix
is needed to for Jenkins to operate
correctly after it is no longer at the root of the server.
Tips
If you want to move JENKINS_HOME directory (the directory where
Jenkins keeps the builds and job configurations), you can do it
by setting JENKINS_HOME
environment variable. Because Jenkins.app
uses launchd to run Jenkins, you must ask launchd to set JENKINS_HOME
.
launchctl setenv JENKINS_HOME /new/path/to/jenkins_home
You have to do it before starting Jenkins.app. If you wan to make the change
permanent, study man launchctl
and man launchd.conf
Actually, I've found launchd does not execute the commands in launchd.conf and this tip does not work across logouts.
Technical details
Jenkins.app is a simple AppleScript application. (Meaning, you start AppleScript Editor, create a script, then save it as application bundle.)
It is a stay-running-kind-of script. It just downloads jenkins.war,
asks the user to specify the command-line and then runs
java -jar jenkins.war
.
Or it doesn't actually run Jenkins, it outsources the responsibility to launchd, which is better equipped to handle this anyway. An AppleScript cannot wait until a subprocess dies and then restart it. Launchd can. Another benefit is that anything written to stdout and stderr by Jenkins automatically goes to system log. (You can easily view the system log using the Console.app in /Applications/Utilities.)
TODO
Improvement ideas and bugs can be submitted to https://github.com/stisti/jenkins-app/issues
There are already a few and some of them are such that I think they are beyond the capability of a simple AppleScript. I may have to create an actual Cocoa app. (Although I have managed to push the AppleScript much further than I originally thought possible.)
Contact me
Either open an issue like described above or contact me in Twitter. My handle is @sti. If you tweet about Jenkins.app, you might want to use #jenkinsapp hashtag.