Jenkins打iOS包+上傳蒲公英+發送釘釘消息

場景:

  • 從多個倉庫拉取代碼,打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

在編輯器中選擇需要的步驟,配置好參數,生成腳本


圖片.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

? 導出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
圖片.png
4. 上傳ipa到蒲公英

在測試階段,需要打包上傳到蒲公英,方便測試和公司的人體驗安裝,或者發內測版本上傳到蒲公英

  1. 準備工作
    使用api或者插件上傳都要用到API信息
圖片.png
  1. 使用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中,是為了獲取安裝的地址,或者二維碼等其他信息,可以按需要獲??;一般用到的有buildQRCodeURLbuildShortcutUrl
  • 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的內容拷貝粘貼到流水線腳本中

圖片.png

或者使用Jenkinsfile
圖片.png

pipline需要指定agent,這里的label就是打包機器的標簽,Jenkins默認是master,如果改了名字就用對應的,可以在系統設置中查看如下所示:
圖片.png

6. Jenkins構建效果圖
  • 構建操作面板


    圖片.png
  • pipline工作過程面板


    圖片.png
6. QA
  1. 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

嘗試了以下方法:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容