iOS打包自動化實(shí)踐(三)

上一篇:iOS打包自動化實(shí)踐(二)

自動打包項(xiàng)目優(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)密碼"):

郵箱.png

3、在項(xiàng)目配置的"構(gòu)建后操作"中,添加"Editable Email Notification",在"Project Recipient List"中填寫需要收取郵件的郵箱地址,"Default Content"中可以直接使用jenkins的全局環(huán)境變量, "${BUILD_STATUS}", "${BUILD_URL}"等,填寫

\${SCRIPT, template="groovy-text.template"}

可以收到基本信息,也可以點(diǎn)擊如圖鏈接,查看所有可用的環(huán)境變量并在郵件內(nèi)容中使用。

環(huán)境變量.png

4、點(diǎn)擊"Adcanced Settings-Add Trigger",可以設(shè)置發(fā)送郵件的觸發(fā)時機(jī),設(shè)置"Send To"為"Recipient List".

5、點(diǎn)擊保存,完成。

自定義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腳本來實(shí)現(xiàn),十分的方便,這里語法不多介紹了大家都會,簡單介紹下如何把swift腳本跑起來。

1、創(chuàng)建modifyBuildNumber.swift文件, 并將其放在遠(yuǎn)程CI機(jī)器上。

2、文件頭部添加代碼, 指定編譯器:

#!/usr/bin/env xcrun swift

3、接下來就可以愉快的編寫swift代碼了,通過讀取并修改info.plist中的CFBundleVersion字段來達(dá)到自動升級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ù)

實(shí)現(xiàn)了自動修改build號和自動獲取版本號的功能之后,是不是發(fā)現(xiàn)這個系統(tǒng)需要人工操作的地方更少了?接下來介紹如何自動觸發(fā)打包上傳任務(wù)。

我們公司使用了TestFlight進(jìn)行內(nèi)測期間的回歸測試工作,因此一旦有新的代碼合并進(jìn)入release-test分支,就需要打包上傳到TestFlight。這個功能利用jenkins也很好實(shí)現(xiàn)。

1、進(jìn)入任務(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。 即可實(shí)現(xiàn)每次上傳之后都會自動觸發(fā)testflight版本發(fā)布。

jenkins中的全局環(huán)境變量"BUILD_CAUSE"代表了觸發(fā)原因,值為"SCMTRIGGER"時表示自動觸發(fā),"MANUALTRIGGER"表示手動觸發(fā)。

打包腳本的版本管理

項(xiàng)目優(yōu)化到這一步我們發(fā)現(xiàn)腳本越來越長,而且增加了幾個swift腳本,還有ExportOptions.plist文件,已經(jīng)略顯龐大。而且腳本直接寫在jenkins的"Execute shell"中很不安全,一旦誤刪前功盡棄。這時可以考慮給所有的打包腳本和工具放在一個單獨(dú)的Git倉庫中,每次觸發(fā)構(gòu)建時拉取最新的腳本和項(xiàng)目代碼,進(jìn)行打包。這樣做方便自動打包項(xiàng)目的維護(hù)和移植。

1、使用Execute shell中的代碼建立archive_upload.sh文件,并把ta和剛剛建立的swift腳本,ExportOptions.plist文件放在一起,單獨(dú)建立git倉庫。

2、在"Jenkins-插件管理"中下載插件"Multiple SCMs Plugin"

3、在項(xiàng)目配置頁面,"源碼管理"中勾選"Multiple SCMs",分別配置項(xiàng)目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)在我們的項(xiàng)目已經(jīng)可以自動打release包上傳到iTC了,那么自動打企業(yè)包只需要更換證書和修改ExportOptions.plist文件即可,這里不多介紹,直接介紹如何自動上傳到蒲公英并發(fā)送二維碼到釘釘群的功能。

假設(shè)你的項(xiàng)目已經(jīng)可以成功打出企業(yè)簽名的包并且導(dǎo)出了ipa

1、在Jenkins-插件管理中安裝插件"Upload to pgyer".

2、在項(xiàng)目配置的"構(gòu)建"中,點(diǎn)擊"添加構(gòu)建步驟-Upload to pgyer", 并填寫api_key,在"file wildcard"中填寫導(dǎo)出的ipa路徑.

蒲公英配置.png

3、在你的釘釘群中添加機(jī)器人,并復(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填你的機(jī)器人的webhook鏈接, messageUrl字段填寫你的項(xiàng)目在蒲公英的地址。

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'中填寫'.*'。

忽略某個repo.png

下一篇:iOS打包自動化實(shí)踐(四)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,171評論 3 119
  • 62、“當(dāng)我達(dá)到一定量的銷售時,就會停產(chǎn)這個產(chǎn)品……,’ 這種“產(chǎn)品停產(chǎn)”策略告訴你的潛在客戶,他們最好現(xiàn)在就購買...
    追著太陽的尾巴閱讀 309評論 0 0
  • 神農(nóng)幣是一只母狗,短腿,微黃的毛發(fā),是某種狗和中華田園犬的雜交品種,母親收留它時就是看上它長不高的個頭。 剛到我家...
    艾米小姐閱讀 1,246評論 0 2
  • 【七月影語】20170731學(xué)習(xí)力踐行Day71 1.聽鵝媽媽磨耳朵 2.大街上識認(rèn)漢字“川,藥,草,電,工,生”...
    暖小柒閱讀 186評論 0 0
  • 所受辛勞都是應(yīng)該的,今天看到那句話說:怎么樣的努力發(fā)展才能趕得上父母老去的速度。可能也是之前幼稚,很多東西都沒有看...
    星辰大衍閱讀 229評論 0 0

友情鏈接更多精彩內(nèi)容