上一篇:iOS打包自動化實踐(二)
自動打包項目優(yōu)化
本篇文章介紹了jenkins email通知尚氛、使用swift腳本自動升級build號沛申、自動上傳蒲公英并自動發(fā)送鏈接到釘釘群等功能炕贵。
添加E-mail通知
1靴拱、安裝Jenkins插件:系統(tǒng)管理-管理插件中国觉,搜索"Email-ext plugin"和"Email-ext Template Plugin"并安裝。
2又憨、在"系統(tǒng)設(shè)置"中找到"郵件通知"和"Extended E-mail Notification", 163郵箱配置如圖(注意:如果郵箱開啟了客戶端授權(quán)碼翠霍,需要填寫授權(quán)碼而不是密碼, 即"設(shè)置 -->POP3/SMTP/IMAP-->客戶端授權(quán)密碼"):
3、在項目配置的"構(gòu)建后操作"中蠢莺,添加"Editable Email Notification"寒匙,在"Project Recipient List"中填寫需要收取郵件的郵箱地址,"Default Content"中可以直接使用jenkins的全局環(huán)境變量, "${BUILD_STATUS}", "${BUILD_URL}"等躏将,填寫
\${SCRIPT, template="groovy-text.template"}
可以收到基本信息锄弱,也可以點擊如圖鏈接,查看所有可用的環(huán)境變量并在郵件內(nèi)容中使用祸憋。
4会宪、點擊"Adcanced Settings-Add Trigger",可以設(shè)置發(fā)送郵件的觸發(fā)時機,設(shè)置"Send To"為"Recipient List".
5夺衍、點擊保存,完成喜命。
自定義Email內(nèi)容
適用場景: 需要在腳本中生成log并發(fā)送郵件沟沙。比如腳本中有打包,下載metadata壁榕,上傳ipa三步矛紫,當(dāng)任務(wù)build失敗時,我們需要在郵件中打印log來快速定位是哪一步出了問題牌里。原理是先在shell中把log寫入文件颊咬,再把文件內(nèi)容讀取到郵件的內(nèi)容中。
1牡辽、在"Execute shell"中把log寫入文件:
echo "test log" > /file/path/logFile.txt
2喳篇、在"Editable Email Notification-Default Content"中寫如下代碼:
${FILE,path="/file/path/logFile.txt"}
自動升級build號和自動獲取版本號
由于swift是可以用來寫腳本的,再加上iOS程序猿都比較熟悉swift語法态辛,因此這里自動升級build號的工作我編寫了一個簡單的swift腳本來實現(xiàn)麸澜,十分的方便,這里語法不多介紹了大家都會奏黑,簡單介紹下如何把swift腳本跑起來炊邦。
1编矾、創(chuàng)建modifyBuildNumber.swift文件, 并將其放在遠程CI機器上。
2馁害、文件頭部添加代碼, 指定編譯器:
#!/usr/bin/env xcrun swift
3窄俏、接下來就可以愉快的編寫swift代碼了,通過讀取并修改info.plist中的CFBundleVersion字段來達到自動升級build號的功能碘菜。若修改失敗凹蜈,執(zhí)行代碼"exit(1)", 修改成功不執(zhí)行或者執(zhí)行代碼"exit(0)"。
4炉媒、在shell中執(zhí)行swift腳本并獲取swift腳本執(zhí)行結(jié)果:
#獲取swift腳本路徑
modify_build_number_script="file/path/modifyBuildNumber.swift"
#修改腳本權(quán)限為可執(zhí)行
chmod +x $modify_build_number_script
#獲取腳本執(zhí)行結(jié)果
RESPONSE=`$modify_build_number_script`
#判斷上一條命令是否執(zhí)行成功踪区。
if [ $? -ne 0 ]; then
echo "swift腳本執(zhí)行失敗:$RESPONSE"
fi
在swift腳本中執(zhí)行print命令打印的log吊骤, 會作為swift腳本的執(zhí)行結(jié)果缎岗,并賦值給RESPONSE這個變量。(但是我發(fā)現(xiàn)通過這種方式只能獲取一行白粉,對于目前的需求肯定是夠用了传泊。不過如果大家有更好的辦法歡迎評論告訴我).
自動獲取版本號更加的簡單,使用swift腳本直接讀取info.plist中的CFBundleShortVersionString字段鸭巴,并使用print命令打印眷细,在shell中直接使用變量獲取swift腳本執(zhí)行結(jié)果即可(獲取的版本號主要用于deliver命令)。
自動觸發(fā)打包任務(wù)
實現(xiàn)了自動修改build號和自動獲取版本號的功能之后鹃祖,是不是發(fā)現(xiàn)這個系統(tǒng)需要人工操作的地方更少了溪椎?接下來介紹如何自動觸發(fā)打包上傳任務(wù)。
我們公司使用了TestFlight進行內(nèi)測期間的回歸測試工作恬口,因此一旦有新的代碼合并進入release-test分支校读,就需要打包上傳到TestFlight。這個功能利用jenkins也很好實現(xiàn)祖能。
1歉秫、進入任務(wù)的配置界面,在"構(gòu)建觸發(fā)器"欄中勾選Poll SCM养铸,并填寫代碼:"* * * * *", 這代表每分鐘jenkins自動檢測一次你在"源碼管理-Branches to build"欄中填寫的分支是否有代碼變化雁芙,一旦有變化即觸發(fā)自動打包。
2钞螟、檢測時間間隔可以自行調(diào)整兔甘,比如"H * * * *":每小時檢測一次,"H */2 * * *":每兩小時檢測一次鳞滨。
3裂明、上傳到iTC之后,testFlight每次都會詢問是否修改了加密協(xié)議,不能自動發(fā)布testflight版本闽晦,這時需要在info.plist中加入字段"App Uses Non-Exempt Encryption", 值設(shè)置為NO扳碍。 即可實現(xiàn)每次上傳之后都會自動觸發(fā)testflight版本發(fā)布。
jenkins中的全局環(huán)境變量"BUILD_CAUSE"代表了觸發(fā)原因仙蛉,值為"SCMTRIGGER"時表示自動觸發(fā)笋敞,"MANUALTRIGGER"表示手動觸發(fā)。
打包腳本的版本管理
項目優(yōu)化到這一步我們發(fā)現(xiàn)腳本越來越長荠瘪,而且增加了幾個swift腳本夯巷,還有ExportOptions.plist文件,已經(jīng)略顯龐大哀墓。而且腳本直接寫在jenkins的"Execute shell"中很不安全趁餐,一旦誤刪前功盡棄。這時可以考慮給所有的打包腳本和工具放在一個單獨的Git倉庫中篮绰,每次觸發(fā)構(gòu)建時拉取最新的腳本和項目代碼后雷,進行打包。這樣做方便自動打包項目的維護和移植吠各。
1臀突、使用Execute shell中的代碼建立archive_upload.sh文件,并把ta和剛剛建立的swift腳本贾漏,ExportOptions.plist文件放在一起候学,單獨建立git倉庫。
2纵散、在"Jenkins-插件管理"中下載插件"Multiple SCMs Plugin"
3梳码、在項目配置頁面,"源碼管理"中勾選"Multiple SCMs"伍掀,分別配置項目git地址和腳本git地址掰茶,并通過"Additional Behaviours-Check out to a sub-directory"分別建立下級文件夾。
4硕盹、修改Execute shell為:
#!/bin/sh
root_path=`pwd`
project_path="$root_path/ProjectPath"
script_path="$root_path/AutoPackScripts/archive_upload.sh"
chmod +x $script_path
#執(zhí)行腳本
$script_path\
--projectPath $project_path\
--zhHans $release_notes_zhHans\
--zhHant $release_notes_zhHant\
5符匾、給archive_upload.sh腳本增加參數(shù)解析功能叨咖,shell腳本的參數(shù)數(shù)量和名稱是可以任意拓展的瘩例。在archive_upload.sh中添加如下代碼即可解析:
while [ -n "$1" ]
do
case "$1" in
--projectPath)
#工程目錄
project_path=$2
shift
;;
--zhHans)
#簡中發(fā)版文案
release_notes_zhHans=$2
shift
;;
--zhHant)
#繁中發(fā)版文案
release_notes_zhHant=$2
shift
;;
*)
;;
esac
shift
done
企業(yè)包自動上傳至蒲公英并自動發(fā)送下載鏈接到釘釘群
到現(xiàn)在我們的項目已經(jīng)可以自動打release包上傳到iTC了,那么自動打企業(yè)包只需要更換證書和修改ExportOptions.plist文件即可甸各,這里不多介紹垛贤,直接介紹如何自動上傳到蒲公英并發(fā)送二維碼到釘釘群的功能。
假設(shè)你的項目已經(jīng)可以成功打出企業(yè)簽名的包并且導(dǎo)出了ipa
1趣倾、在Jenkins-插件管理中安裝插件"Upload to pgyer".
2聘惦、在項目配置的"構(gòu)建"中,點擊"添加構(gòu)建步驟-Upload to pgyer", 并填寫api_key儒恋,在"file wildcard"中填寫導(dǎo)出的ipa路徑.
3善绎、在你的釘釘群中添加機器人黔漂,并復(fù)制其webhook鏈接。
4禀酱、在jenkins上創(chuàng)建一個新的任務(wù)"DingTalk_Sender", 直接在"Execute shell"中寫如下代碼:
#!/bin/sh
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxx' \
-H 'Content-Type: application/json' \
-d '
{ "msgtype": "link",
"link": {
"text":"測試",
"title": "測試",
"picUrl": "",
"messageUrl": "https://www.pgyer.com/xxxx"
}
}'
curl填你的機器人的webhook鏈接, messageUrl字段填寫你的項目在蒲公英的地址炬守。
4、回到你的打包上傳任務(wù)中剂跟,在"構(gòu)建后操作"中减途,添加"Build other projects",填寫"DingTalk_Sender".這樣就使兩個任務(wù)相關(guān)聯(lián)曹洽,執(zhí)行完上傳后即自動執(zhí)行DingTalk_Sender任務(wù)鳍置。
FAQ
1、郵箱配置時送淆,發(fā)送測試郵件報錯:javax.mail.authenticationfailedexception: 535税产,有兩種可能:
- 密碼填寫錯誤
- 郵箱開啟了客戶端授權(quán)碼,但是密碼沒有填寫授權(quán)碼而是填寫了郵箱密碼
2坊夫、郵箱配置成功且測試郵件發(fā)送成功砖第,但是build成功之后發(fā)送郵件時控制臺輸出顯示:Connection error sending email, retrying once more in 10 seconds...并且發(fā)送郵件失敗。
在jenkins的系統(tǒng)設(shè)置中找到"Extended E-mail Notification"环凿,并按照之前的配置重新配置一遍梧兼。
Note also that depending on your plug-in set up, you may have another place to configure SMTP server. For example under "Manage Jenkins" -> "Configure System" -> "E-mail Notification".
That is not needed for this particular plug-in but it may lead you think you have everything done, while it is not :)
3、配置多個SCM之后智听,只要有一個倉庫發(fā)生變化都會觸發(fā)Poll SCM自動構(gòu)建羽杰,如何使其忽略某個倉庫?
在"源碼管理"中到推,在該倉庫下的'Advanced clone behaviors'中考赛,選擇'Polling ignores commits in certain paths',并在'Excluded Regions'中填寫'.*'莉测。
下一篇:iOS打包自動化實踐(四)