Jenkins是一個基于Java的開源持續(xù)集成工具位他。
本文采用是fastlane的腳本構建方式踊赠。
關于Xcode integration插件的構建方式园蝠。
Jenkins基礎環(huán)境搭建
注意事項:開發(fā)軟件的環(huán)境搭建應盡量按照官方的步驟添瓷。有的開發(fā)者梅屉,學習一樣新東西,直接網(wǎng)上一搜鳞贷,找一個第三方教程來走坯汤,結果遇見更多問題。
Jenkins的官方Guided Tour搀愧。
- 安裝Java8惰聂,使用終端安裝
- 檢查java版本
~java -version
No Java runtime present, requesting install.
表示未安裝Java疆偿。
- 安裝java8
~brew cask install java8
java8,必須帶8搓幌,不然就會安裝java最新版本java9杆故。
如果未安裝brew,請先安裝brew溉愁。
Error: Cask 'java8' is unavailable: No Cask with this name exists.
出現(xiàn)此錯誤处铛,使用下面命令解決。
~brew tap caskroom/versions
安裝期間會要求輸入管理員密碼拐揭。
再查詢版本
- 安裝Jenkins撤蟆,從官網(wǎng)下載安裝。
有長期支持的穩(wěn)定版投队,每周發(fā)布的開發(fā)版,以下是以穩(wěn)定版2.89.2為例爵川。
安裝完畢后敷鸦,瀏覽器自動打開解鎖界面。
拷貝上面的地址
~ vim /Users/lazy-ios2/.jenkins/secrets/initialAdminPassword
使用vim打開寝贡。
上面紅框里的就是password扒披,拷貝粘貼后,Continue圃泡。
選左邊安裝推薦插件碟案,耐心等待。
首次進入Jenkins颇蜡,先進去系統(tǒng)管理价说,設置好管理員權限。
Jenkins不會默認設置當前管理員用戶的管理員權限风秤。
導致登錄失效后鳖目,就無法登錄此賬戶了,真麻煩~
-
進入全局安全配置缤弦。
-
修改授權策略為安全矩陣领迈,添加用戶iostest(剛剛注冊現(xiàn)在登錄的用戶)。
-
設置管理員用戶為管理員權限碍沐,保存狸捅。
- 添加用戶
-
系統(tǒng)管理->管理用戶->新建用戶
例如為測試人員創(chuàng)建只讀和運行權限的用戶。
-
系統(tǒng)管理->全局安全配置->授權策略
Overall選擇Read累提,其他權限選項按需選擇尘喝。
還有其他授權策略,如項目矩陣授權策略斋陪,基于項目的授權方式瞧省,相對安全矩陣配置更靈活宜咒,當然配置也相對復雜,沒有很多的實踐經驗额嘿,在這里不贅述愧哟。
Jenkins創(chuàng)建任務(job)
細心的童鞋會發(fā)現(xiàn),Jenkins的Use-cases沒有iOS橡淑。
只能自己找第三方教程和摸索构拳,真麻煩~
使用構建一個自由風格軟件項目為例。
-
項目的基礎設置梁棠,按需設置吧置森,不明白點擊后面的問好,有相關說明符糊。
- 源碼管理
正常來說凫海,公司都有自己的代碼倉庫,這里以git為例男娄。
輸入git地址行贪,發(fā)現(xiàn)沒有權限。
點擊圖中的add進行添加私鑰模闲。
進入.ssh目錄
vim打開對應的rsa私鑰文件建瘫,選中全部,拷貝尸折。
回到Jenkins啰脚,點擊add添加私鑰,選則Jenkins实夹。
選擇ssh類型橄浓。有賬戶密碼的話,要在Username和Passphrase輸入賬戶密碼亮航。本例中未設置贮配,故無需輸入。
選擇創(chuàng)建的Credentials塞赂,成功后紅色錯誤提示消失泪勒。
最后別忘了選擇構建的branch。
首次拉去代碼時間較長宴猾,建議設置30分鐘超時時間圆存。 -
構建觸發(fā)器
可以設置觸發(fā)構建的事件,當前沒有這種需求仇哆,當測試人員有需要的時候沦辙,再由測試人員去手動構建。 觸發(fā)事件本身還是很有用的讹剔,尤其是Poll SCM油讯,可以設置固定時間點構建详民。
-
構建環(huán)境
由于使用fastlane打包,不用設置陌兑,直接跳過沈跨。
- 構建 (Execute shell,添加Shell腳本構建)
Jenkins是在Jenkins用戶環(huán)境下構建的兔综,必須將構建需要的東西同步到Jenkins用戶環(huán)境饿凛。
所以這里有兩個腳本,一個同步Keychain和Provisioning Profiles软驰。
一個fastlane構建涧窒。
第一個同步腳本如下:
#!/usr/bin/expect
set timeout 10
spawn su - test -c "sudo rm -rf /Users/Shared/Jenkins/Library/MobileDevice/'Provisioning Profiles'"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo mkdir -p /Users/Shared/Jenkins/Library/MobileDevice/'Provisioning Profiles'"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo cp -r /Users/test/Library/MobileDevice/'Provisioning Profiles' /Users/Shared/Jenkins/Library/MobileDevice"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo rm -rf /Users/Shared/Jenkins/Library/Keychains"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo mkdir -p /Users/Shared/Jenkins/Library/Keychains"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo cp -r /Users/test/Library/Keychains /Users/Shared/Jenkins/Library"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn sudo security set-key-partition-list -S apple-tool:,apple: -s -k 123456 /Users/Shared/Jenkins/Library/Keychains/login.keychain-db
expect "Password:"
send "123456\r"
expect eof
wait
由于Jenkins用戶權限問題,需要使用管理員賬戶來執(zhí)行同步命令锭亏。
使用管理員賬戶自然會詢問密碼纠吴,所以要使用expect。
最后一個解鎖keychain慧瘤,讓Jenkins用戶能夠讀取并使用keychain中的證書來進行簽名CodeSign戴已,所有使用Jenkins用戶來執(zhí)行改命令。
第二個打包腳本
#!/usr/bin/env bash
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120
rm -rf /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData
******隱藏代碼******
fastlane gym -w ${buildProjectDir}lazyaudio.xcworkspace --clean -o ${buildDir} -s lazyaudio -n "${buildIpaName}.ipa" -q ${buildConfigStr} --export_method ${exportMethod} -a
******隱藏代碼******
lftp << EOF
open ftp://xxxxxx:xxxxx@xxx.xxx.x.xxx
mkdir ${ftpPath}
cd ${ftpPath}
lcd ${ftpIpaPath}
mput *
close
bye
EOF
打包腳本和項目本身的配置聯(lián)系緊密碑隆。
為了避免干擾恭陡,打包腳本只截取部分通用代碼蹬音。
前3個export是必須的上煤,好像是有中文的原因,否則Jenkins不認腳本著淆。
第4個是設置超時時間劫狠,fastlane的默認配置,容易超時導致構建失敗永部,強烈建議加上独泞。
然后就是配置fastlane,以及fastlane打包部分苔埋。
編寫腳本前懦砂,必須了解環(huán)境變量,這里就不贅述了组橄。
最后ftp上傳構建的ipa等荞膘,使用的是lftp。新macOS把ftp默認從系統(tǒng)中移除玉工,如需要自己安裝羽资。
測試構建
- 構建前,必須確保在管理員賬戶(這里是test賬戶)下遵班,可以正常使用fastlane打包屠升。
- 構建失敗潮改,fastlane not found。
Jenkins找不到fastlane命令腹暖,要為Jenkins設置PATH汇在,讓它用上fastlane。
在終端輸入
echo $PATH
微服,打印PATH趾疚,拷貝。系統(tǒng)管理->系統(tǒng)設置->全局屬性->環(huán)境變量以蕴,輸入鍵PATH糙麦,值就是剛剛拷貝的字符串。
-
構建失敗丛肮, codesign failure赡磅。
簽名失敗,通常是keychain解鎖失敗導致宝与。因為創(chuàng)建Jenkins用戶焚廊,默認并沒有為它設置密碼,導致它無法請求管理員權限來解鎖keychain习劫。
使用sudo passwd jenkins來設置Jenkins用戶密碼咆瘟。
-
構建失敗,cannot find xxx scheme
xcode command line找不到scheme诽里,需要在Xcode設置scheme為shared袒餐,commit相關變更,push代碼谤狡。
scheme的生成是依賴Xcode GUI灸眼,僅靠xcode command line不能生成scheme來構建。
-
兩個構建并行執(zhí)行墓懂,構建速度慢
系統(tǒng)管理->系統(tǒng)設置->執(zhí)行者數(shù)量 設置為1焰宣,就不會同時進行多個構建。
-
讓其他用戶訪問Jenkins
鎖死本機的IP地址捕仔,其他用戶可以通多訪問192.168.x.xxx:8080來使用Jenkins匕积。
系統(tǒng)管理->系統(tǒng)設置->Jenkins Location
配置好地址,管理員郵件地址榜跌。在下面的郵件通知用得上闪唆。
郵件通知
-
系統(tǒng)管理->系統(tǒng)設置->郵件通知
配置發(fā)郵件的郵箱,建議新建一個Jenkins專用的郵箱斜做,圖中是騰訊的企業(yè)郵箱為例苞氮。配置好通過發(fā)送郵件測試郵件測試配置。
-
系統(tǒng)管理->系統(tǒng)設置->Extended E-mail Notification(這個是建議插件中的一個瓤逼,比Jenkins自帶的郵件通知要強大)笼吟。
將Jenkins自帶郵件通知測試通過的配置库物,填入上面。
然后設置默認收件人贷帮,多個用空格隔開戚揭。
構建后操作
回到任務配置中,最后一個構建后的操作撵枢。
-
收件人列表設置
除了默認收件人民晒,可以添加其他需要被通知到的收件人,多個用空格隔開锄禽。
-
回復人設置
回復列表潜必,是指,如果有人回復了Jenkins發(fā)的郵件沃但,直接回給哪些人(郵件)磁滚,而不是Jenkins本身郵箱,Jenkins郵箱只有發(fā)郵件的功能宵晚。
當然也可以在系統(tǒng)設置中設置默認回復列表垂攘。
-
內容設置
Default Subject和Default Content也是類似的,按需要設置淤刃。
可以查看Content Token Reference來具體設置晒他。 -
Advance setting郵件發(fā)送觸發(fā)配置。
默認只有失敗才發(fā)送逸贾。
各自按需設置陨仅,根據(jù)觸發(fā)條件不同,又能單獨配置收件人列表耕陷,回復人列表以及內容掂名。很強大有木有据沈?
卸載Jenkins
在自己電腦實踐Jenkins夠了哟沫,想刪除了。
使用Jenkins自帶Uninstall.command來刪除锌介。
路徑/Library/Application Support/Jenkins/Uninstall.command