場景:
- 從多個倉庫拉取代碼,打ipa包,支持選擇是否上傳到蒲公英;完成之后發送釘釘通知消息
- 現在的App大部分都用到了混合開發;有的需要H5資源包,或者是RN的混合應用需要打包bundle和assets;我們需要將這些資源整合到App中,可以去處理,人為的話會存在沒有用最新的資源包或者忘了替換資源包的情況;所以最好是能通過CI管理這些操作
1. 多個倉庫拉取代碼
多個倉庫拉取代碼,一般可以使用Pipline或者Multiple SCMs plugin
Jenkins推薦使用Pipline,需要了解Pipline的使用語法,Pipline同時也提供自動生成一些操作的代碼;本教程使用Pipline
1. 設置參數化構建,支持不同的倉庫可以拉取不同的分支的代碼
-
App的包環境選擇,或者可以理解為App的不同的configuration
圖片.png -
多倉庫的分支設置,支持打各個倉庫的任意分支
圖片.png -
是否上傳到蒲公英選項,比如內測版本就鉤上
圖片.png
2. 多倉庫設置
- SCMS管理
我們可以指定不同的倉庫的代碼拉取到本地的不同的目錄,checkout的分支就是參數化構建設置的分支
圖片.png
- pipline管理
pipline我們可以直接使用工具生成我們想要的步驟的代碼,點擊下圖的
流水線語法
圖片.png
在編輯器中選擇需要的步驟,配置好參數,生成腳本
2. 打包ipa
打包ipa可以使用xcodebuild fastlane等工具處理
-
編寫腳本
比如是Native和RN的混合項目,一般需要:- 一個打包RN的腳本并將資源拷貝到Native的項目目錄
圖片.png
package_rn.sh - xcode編譯時的腳本,將RN的bundle和assets拷貝到App包目錄
圖片.png
cp-rn-resources.sh - 打包導出ipa的腳本
圖片.png
export_ipa.sh
- 一個打包RN的腳本并將資源拷貝到Native的項目目錄
? 導出ipa包時需要exportOptionPlist,這個文件可以參照官方的規范編寫plist,也可以直接用xcode打包導出ipa,在ipa包的文件夾中有ExportOptions.plist
,建議使用后者的方式;一般需要兩個一個development的一個production的
3. 消息通知
消息通知可以按需要選擇郵件、釘釘、微信等方式,官方也有對應的插件,如果通知的內容定制較高,最好使用API發消息API文檔
- 比如釘釘消息,支持markdown格式,我們可以通過curl的方式發送消息到釘釘
DINGDING_ROBOT_URL="https://oapi.dingtalk.com/robot/send?access_token=xxxx"
MSG="{\"msgtype\": \"markdown\",
\"markdown\": {
\"title\": \"${title}\",
\"text\": \"${markdown}\"
}
}"
curl -H 'Content-Type:application/json' -X POST --data '${MSG}' ${DINGDING_ROBOT_URL}
-
釘釘機器人,需要管理員權限才能創建
圖片.png
4. 上傳ipa到蒲公英
在測試階段,需要打包上傳到蒲公英,方便測試和公司的人體驗安裝,或者發內測版本上傳到蒲公英
- 準備工作
使用api或者插件上傳都要用到API信息
- 使用api上傳ipa到蒲公英
API2.0
curl -F "file=@./IPAFullPath" \
-F "_api_key=?這里填你的蒲公英的APP Key" \
-F "buildInstallType=1" \
http://www.pgyer.com/apiv2/app/upload \
-o ./pgy.json'
- 這個地方將上傳返回的結果寫到本地文件
pgy.json
中,是為了獲取安裝的地址,或者二維碼等其他信息,可以按需要獲??;一般用到的有buildQRCodeURL
、buildShortcutUrl
- shell獲取json中的信息,建議使用jq,比如在pipline中獲取
buildShortcutUrl
// 獲取蒲公英的下載地址
def createPGYDownloadURL() {
def buildShortcutUrl = sh(returnStdout: true, script: 'cat pgy.json | jq -r ".data.buildShortcutUrl"')
echo buildShortcutUrl
def downloadUrl = "http://www.pgyer.com/${buildShortcutUrl}"
echo downloadUrl
return downloadUrl
}
// 獲取蒲公英安裝包的二維碼
def createPGYQRURL() {
def buildQRCodeURL = sh(returnStdout: true, script: 'cat pgy.json | jq -r ".data.buildQRCodeURL"')
echo buildQRCodeURL
return buildQRCodeURL
}
拿到這個url,就可以發消息的時候帶上這個url了。
jq是從json文件中讀取某個字段的工具,沒有安裝的需要安裝一下 brew install jq
5. pipline的Jenkinsfile事例
這個事例包含:
- 多倉庫代碼異步拉取
- stages的使用
- 自定義ipa包名--需要獲取到app的版本用到
/usr/libexec/PlistBuddy
- 上傳到蒲公英并獲取下載地址
- 發送markdown格式的釘釘消息
Jenkinsfile
使用的時候可以直接將Jenkinsfile的內容拷貝粘貼到流水線腳本中
或者使用Jenkinsfile
pipline需要指定agent,這里的label就是打包機器的標簽,Jenkins默認是master,如果改了名字就用對應的,可以在系統設置中查看
如下所示:6. Jenkins構建效果圖
-
構建操作面板
圖片.png -
pipline工作過程面板
圖片.png
6. QA
- xcode archive正常,但是用Jenkins打包的時候報錯如下:
error: Task failed with exit 1 signal 0 {
/usr/bin/codesign '--force' '--sign' '9A0FCDA0F401B37A181F5F3A7675F57A190E8B9C' '--verbose' '/Users/xxx/Library/Developer/Xcode/DerivedData/xxx-etuxniaybliunxazmzjuqgiiqbqv/Build/Intermediates.noindex/ArchiveIntermediates/xxx/InstallationBuildProductsLocation/Applications/xxx.app/Frameworks/libswiftAVFoundation.dylib'
}
** ARCHIVE FAILED **
The following build commands failed:
CopySwiftLibs xxx
(1 failure)
解決方法:
將鑰匙串中的打包證書,從“登錄”移到“系統”
https://forums.developer.apple.com/thread/64101
2.xcode導出正常,使用命令行去打包也正常,使用jenkins的時候提示
/ArchiveIntermediates/xxx/InstallationBuildProductsLocation/Applications/xxx.app: errSecInternalComponent
Command /usr/bin/codesign failed with exit code 1
嘗試了以下方法:
- 重啟大法沒能解決
- security unlock-keychain login.keychain
- 刪除~/Library/MobileDevice/Provisioning Profiles里的描述文件,重新導入描述文件,重啟電腦
最終還是用問題1的方法將證書從登錄移到了系統解決了
Xcode Command /usr/bin/codesign failed with exit code 1 : errSecInternalComponent