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>
收工
來瓶零度慶祝下