Botsを使っていた私ですが,なんだか色々使いにくいので,Jenkinsに戻ることにしました.
しかし,そのJenkinsについても証明書の取り扱いが面倒だったりする点が問題なのですが・・・・.今回はそれを回避するためにハマったポイントの備忘録です.

Jenkinsをまず消す

JenkinsでiOSバイナリをビルドする時に問題になってくるのが,証明書関連です.
Jenkinsのデフォルトのインストーラを使うと,Jenkinsユーザが作成され,そのJenkinsユーザによって実行されるデーモンとしてJenkinsが起動されます.
これが・・・・大問題.Jenkinsユーザで実行すると,デフォルトでキーチェーンにインストールした証明書等にアクセスできないためキーチェーンを修正したり,プロビジョニングプロファイルのパスを変更したりする必要があります.

この問題点を解消するため,まずデフォルトのJenkinsを削除し,再インストールします.削除は,インストーラを使っていれば,アンインストールスクリプトが付属しています.

/Library/Application Support/Jenkins/Uninstall.command

Jenkinsをユーザで起動する

まず,インストーラでもバイナリでもいいのですが,Jenkinsをインストールします.
インストーラを使う前提で説明しますが,インストールするとき,jenkins daemonで起動しないようにしておきます.
そして,このインストールしたJenkinsを自分のユーザ権限で起動するように設定します.

参考:Jenkins をOS X のログインユーザー権限のデーモンで自動起動しておく設定

インストーラを使うと,/Library/Application Support/Jenkinsに起動スクリプトjenkins-runner.shがインストールされます.
編集する前に,/Library/Application Support/Jenkins/jenkins-runner.shは,sudo chmodとかで書き込み権限を追加しておきましょう.
おそらく,tmpdirの値を変更しないと起動しないと思います.

#!/bin/bash
#
# Startup script used by Jenkins launchd job.
# Mac OS X launchd process calls this script to customize
# the java process command line used to run Jenkins.
# 
# Customizable parameters are found in
# /Library/Preferences/org.jenkins-ci.plist
#
# You can manipulate it using the "defaults" utility.
# See "man defaults" for details.

defaults="defaults read /Library/Preferences/org.jenkins-ci"

war=`$defaults war` || war="/Applications/Jenkins/jenkins.war"

javaArgs="-Dfile.encoding=UTF-8"

minPermGen=`$defaults minPermGen` && javaArgs="$javaArgs -XX:PermSize=${minPermGen}"
permGen=`$defaults permGen` && javaArgs="$javaArgs -XX:MaxPermSize=${permGen}"

minHeapSize=`$defaults minHeapSize` && javaArgs="$javaArgs -Xms${minHeapSize}"
heapSize=`$defaults heapSize` && javaArgs="$javaArgs -Xmx${heapSize}"

tmpdir=`${HOME}/.jenkins/tmp` && javaArgs="$javaArgs -Djava.io.tmpdir=${tmpdir}"

home=`$defaults JENKINS_HOME` && export JENKINS_HOME="$home"

add_to_args() {
    val=`$defaults $1` && args="$args --${1}=${val}"
}

args=""
add_to_args prefix
add_to_args httpPort
add_to_args httpListenAddress
add_to_args httpsPort
add_to_args httpsListenAddress
add_to_args ajp13Port
add_to_args ajp13ListenAddress

echo "JENKINS_HOME=$JENKINS_HOME"
echo "Jenkins command line for execution:"
echo /usr/bin/java $javaArgs -jar "$war" $args
exec /usr/bin/java $javaArgs -jar "$war" $args

このスクリプトをlaunchdで起動するように登録します.
次に参考サイトにならって,/Users/sonson/Library/LaunchAgents/jenkins.plistを以下の内容で作成し,保存します.

<?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>EnvironmentVariables</key>
        <dict>
            <key>JENKINS_HOME</key>
            <string>${HOME}/.jenkins</string>
        </dict>
        <key>GroupName</key>
        <string>staff</string>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>jenkins</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/bash</string>
            <string>/Library/Application Support/Jenkins/jenkins-runner.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>UserName</key>
        <string>sonson</string>
    </dict>
</plist>

次にlaunchdに以下のコマンドで起動登録しておきましょう.

launchctl load -wF -D user  ~/Library/LaunchAgents/jenkins.plist
launchctl start jenkins

これで今,実行しているユーザ権限でJenkinsが起動するようになりました.
証明書の権限やパスで悩むことはないはずです!!!!!

JenkinsでTestFlightに自動アップロードする

Jenkinsのすばらしいところは,充実したプラグインです.iOSのビルド用のプラグインも充実しているので安心です.
まずは,Xcode build pluginでビルドの仕方を設定しましょう.

すでにJenkinsはログイン中のユーザ権限で実行されるため,署名の実行も簡単です.

Code sign identityには,キーチェーンで見られるiPhone Distribution: Hoge Bar (XXXXXXXXX)のようなタイトルを入力し,プロビジョニングプロファイルもそのままフルパスで入力してしまいましょう.

jenkins_codesign_01.png

TestFlight用にIPAファイルを作成するようにします.
後でアップロードするために,明示的にビルド先を指定しておきました.

jenkins_xcode_01.png

TestFlightにアップロードするためのTestFlightのトークンを設定しておきます.
TestFlightのプラグインをインストールしておけば,Jenkinsのルートから,Jenkinsの設定→システムの設定→下の方にTestFlightのトークンを入力するフォームがあるはずです.

jenkins_testflight_02.png

次に,ビルドしたIPAファイルと,dSYMファイルをアップロードするように設定します.

jenkins_testflight_01.png

これで自動アップロードの設定完了です.