1. 程式人生 > >Jenkins iOS 打包環境跳坑記錄

Jenkins iOS 打包環境跳坑記錄

Jenkins 安裝

本人使用的是 dmg 安裝包,好處是會自己設定開機啟動,並且關聯 8080 埠。

下載方法很簡單,開啟 https://jenkins.io 找到下載,然後在下載頁找對應平臺就可以了。

我本人用的是 Java 10,但是 Jenkins 執行環境是 Java8。所以需要下載對應的 JDK。

安裝完成後可以通過 /usr/libexec/java_home -v 1.8 獲取到 Java 8 的路徑。

使用 dmg 安裝會在 /Library/Application Support/Jenkins 路徑下生成一個 jenkins-runner.sh 檔案。在這裡可以配置 Jenkins 執行相關的引數。首先設定 JAVA_HOME export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home"

或者 JAVA_HOME=`/usr/libexec/java_home -v 1.8`

然後修改最後兩行為(也不一定是最後,自己按實際情況對應)

echo "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/bin/java" $javaArgs -jar "$war" $args
exec "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/bin/java" $javaArgs -jar "$war" $args

然後就可以正常執行 Jenkins。 localhost:8080

概覽

Jenkins 自身有一個 Xcode integration,最開始使用的這種方案,過程中遇到了許多不可描述的問題,也沒有解決思路,所以放棄。

Jenkins 類似一個流程管理器,順序排好了流程,每個流程會觸發預設好的任務或者指令碼等。因為可以執行指令碼,所以這裡最終選擇了使用 xcodebuild 指令碼化編譯的方案。

因為使用的是測試工程,所以沒有設定觸發條件等。簡單的流程為:首先拉取最新的倉庫,然後執行定義好的指令碼。(屬實有點簡單。。。)。

整個指令碼如下:

cd hssdf;
path=`pwd`;
cd ../../../archives;
archivePath=
`pwd`; dataString=`date +%Y-%m-%d-%H-%M-%S`; archivePath=`echo $archivePath/${dataString}.xcarchive`; cd $path; echo `pwd`; /usr/bin/security unlock-keychain -p 123456 /Users/Shared/Jenkins/Library/Keychains/login.keychain-db xcodebuild clean; xcodebuild archive -allowProvisioningUpdates -project ./hssdf.xcodeproj -scheme hssdf -configuration Debug -archivePath $archivePath; xcodebuild -archivePath $archivePath -exportArchive -exportOptionsPlist ./hssdf/export.plist -exportPath ~/

具體問題

最開始看到網上的教程為,拷貝 login.keychain 到 jenkins 使用者對應的目錄下。當時不清楚為什麼,照做後出現不能簽名的問題。

後來靈光一現(很重要的靈異現象,每跳過一個坑都靠它幫忙),拷貝的目的是為了獲取開發證書和私鑰。So。。。。生成 p12 然後在 jenkins 使用者下安裝。證書問題解決

你以為這樣就解決問題了?naive!因為對 xcodebuild 這個命令不熟悉,就隨後 man 了下,我了個乖乖,引數要翻好幾頁,還要比較清晰。然後噼裡啪啦指定了一堆引數。然後悲劇來了,-target 和 -scheme 不能同時用,指定 -exportArchive 後必須同步要有 -exportOptionsPlist 各種不協調。。。。。 反正就是一副你猜引數怎麼用的情況,想砸電腦有木有!!!奈何人窮電腦貴,還能怎麼辦,一個引數一個引數調唄。

等等 -exportOptionsPlist 是什麼鬼?哼哼,xcodebuild -help 自己看吧

終於引數調完,你以為就能跑起來了嗎?怎麼可能!簽名失敗瞭解下。簽名失敗是什麼鬼?於是各種谷歌百度、百度谷歌。所幸,搜尋結果不是很多,但是情況千奇百怪每一個對的上的,我就跪了。

於是鬼使神差,試了下把編譯命令直接放到終端執行。我擦,彈了個授權窗!我日!需要授權!!!擦擦淚,怎麼把這茬給忘了。還有,沒有授權用不了 keychai 你丫為啥不報錯,為啥不報錯!剩下的就很簡單了 /usr/bin/security unlock-keychain -p 123456 這行命令瞭解下。

還要經過一下午的奮鬥,這個流程終於跑通了。

為了表示開心 -exportOptionsPlist 檔案貼出來做個參考

<?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>teamID</key>
    <string>你的 team id</string>
    <key>signingStyle</key>
    <string>automatic</string>
    <key>method</key>
    <string>development</string>
</dict>
</plist>

收工

來瓶零度慶祝下