Jenkinsをログイン時にlaunchdで自動起動させる

MacOSX上にて自分のアカウントでJenkinsを稼働させる話。最近のJenkinsはインストーラで"jenkins"ユーザが作られるようになっているので、データの書き込みを伴うテスト等の実行が容易になっている。(もちろん、システム起動時に自動起動する)

What's new in 1.449 (2012/01/23)

  • OS X installer can optionally create a new user "jenkins" and use it. This user has a writable home directory, making it possible to set up ssh for Jenkins.
Changelog

しかしながら、既存のデータの都合とかプロジェクトの制約により、自分のアカウントで動かして自分の権限下のファイルにアクセスして貰いたいことがある。MacOSXの場合は、Xcodeからキーチェーンへのアクセスを要求するiOSのビルドがその典型的な例ではないだろうか。対処方法はいろいろ有るが、今回はJenkinsを自分のアカウントで実行させるようにしてみた。

動作環境は下記の通り。

単にJenkinsを起動させるだけなら下記のコマンドを叩けば良い。

$ java -jar jenkins.jar

しかし、これではログインの度に手動で起動させる必要があり面倒だ。そこでlaunchdを使って、ログイン時には自動起動するように設定した。具体的には、~/Library/LaunchAgents/com.foo.jenkins.plist というxmlファイルを作り、下記を記載しておけば良い。(Jenkins本体は、上記のインストーラで導入したものを使う)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.foo.Jenkins</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/bin/java</string>
		<string>-jar</string>
		<string>/Applications/Jenkins/jenkins.war</string>
		<string>--httpPort=9000</string>
		<string>--ajp13Port=9001</string>
		<string>--prefix=/jenkins2e</string>
	</array>
	<key>OnDemand</key>
	<false/>
</dict>
</plist>

しかし、この方法でJenkinsを起動させると環境変数を渡すことが出来ず、任意のJenkinsディレクトリを指定出来ない。そこでlaunchdからはシェルスクリプトを呼び出すようにしておき、そのスクリプトからJenkinsを起動するようにした。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.foo.Jenkins</string>
	<key>ProgramArguments</key>
	<array>
		<string>/bin/sh</string>
		<string>/Users/foo/bin/launchLocalJenkins.sh</string>
	</array>
	<key>OnDemand</key>
	<false/>
</dict>
</plist>
export LC_ALL=en
export JENKINS_HOME=/Users/foo/path/to/jenkins2e
export JENKINS_BASE=/Applications/Jenkins
java -jar ${JENKINS_BASE}/jenkins.war --httpPort=9000 --ajp13Port=9001 --prefix=/jenkins2e

これで下記のような目標が達成出来た。

  • ログイン時にJenkinsが自動起動すること。
  • Jenkinsのジョブとして、XcodeiOSのアプリケーションをビルド(署名)出来ること。

なお、上記の例では元々のJenkins (http://localhost:8080/jenkins) とは別ポート、別のパスで稼働させており両者の共存が可能だ。(個人的には表のJenkinsと裏のJenkinsを(大人の事情で)使い分けていたりする)