gitlab+jenkins自動化打包IOS-jenkins配置


實現的效果如圖: 

  • 構建界面:

 

  • 完成效果:

 

功能說明:

  • 根據選擇的代碼分支,執行構建打包 
  • 構建成功后根據ipa/apk生成二維碼,並可在歷史構建列表中展示各個版本的二維碼,通過手機掃描二維碼可直接安裝對應版本

 

因為搭建平台寫了一系列博文,這里作一個總結與整理 

 

首先jenkins需要的插件:

  • build-name-setter:用於修改Build名稱
  • description setter plugin:用於在修改Build描述信息,在描述信息中增加顯示QRCode(二維碼)
  • Build Name and Description Setter
  • Git Parameter 參數化構建分支

 

具體的配置:

1.MAC搭建jenkins

  • 注意:直接下載war包, 不要下載Mac OS X,

參照:MAC 安裝jenkins

 

Tips:

最好是把jenkins.war包放在tomcat中運行,這樣比較方便配置開機自啟動,

如果使用java命令啟動jenkins,每次開機都要使用命令去啟動會很麻煩

 

2.jenkins創建測試job

 

3.配置與gitlab連接,別忘記在jenkins宿主機配置gitlab的host

在Repository URL處:輸入倉庫地址,這里選擇http方式:

添加用戶名,密碼

 

 

點擊【保存】,執行構建,查看日志可以看到commit message,說明git已經與jenkins連接成功了

 

 > git fetch --tags --force --progress http://git.xxxx.com/kaifa/testcase.git +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 724dd42afc5ecd9b92842681cd85c2da6992ddda (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 724dd42afc5ecd9b92842681cd85c2da6992ddda
Commit message: "aa"
First time build. Skipping changelog.
Finished: SUCCESS

 另外要注意:

  在Jenkins的默認配置中,clone代碼時會拉取所有歷史版本的代碼,而且默認的超時時限只有10分鍾。這就造成在某些項目中,由於代碼量本身就比較大,歷史版本也比較多,再加上網絡環境不是特別好,Jenkins根本沒法在10分鍾之內拉取完所有代碼,超時后任務就會被自動終止了(錯誤狀態碼143)。

  這種問題的解決方式也很簡單,無非就是兩種思路,要么少拉取點代碼(不獲取歷史版本),要么提高超時時限。對應的配置在Advanced clone behaviours中:

  • Shallow clone:勾選后不獲取歷史版本;
  • Timeout (in minutes) for clone and fetch operation:配置后覆蓋默認的超時時限。

 

 

4.構建-打包腳本 

 

 1 ## !/bin/sh
 2 ## 項目名
 3 TARGET_NAME="XXXXAPP"
 4 ## xcworkspace文件所在目錄 
 5 TARGET_PATH="XXXXWorkspace/XXXXAPP"
 6 ## Scheme名
 7 SCHEME="XXXXAPP"
 8 ##=======================
 9 ## 編譯類型
10 BUILD_TYPE=${ENV} 11 ## 當前目錄
12 SORCEPATH=${WORKSPACE} 13 ## workspace名
14 SPACE=${WORKSPACE}/${TARGET_PATH}/${TARGET_NAME}.xcworkspace 15 ##xcarchive文件的存放路徑
16 ARCHIVEPATH=$SORCEPATH/build/$SCHEME.xcarchive 17 ## ipa文件的存放路徑
18 EXPORTPATH=$SORCEPATH/build/$SCHEME 19 ## ExportOptions.plist文件的存放路徑
20 EXPORTOPTIONSPLIST=$SORCEPATH/build/ExportOptions.plist 21 ## 導出后的ipa路徑
22 EXPORTPATHIPA=$SORCEPATH/build/$SCHEME/$SCHEME.ipa 23 
24 
25 echo -e "============First Build Clean============"
26 ## 清理緩存
27 xcodebuild clean -workspace $SPACE -scheme ${SCHEME} -configuration ${BUILD_TYPE} 28 
29 echo -e "============Build Clean============"
30 ## 輸出關鍵信息
31 echo -e " TARGET_NAME : ${TARGET_NAME}"
32 echo -e " BUILD_TYPE : ${BUILD_TYPE}"
33 echo -e " SORCEPATH : ${SORCEPATH}"
34 echo -e " ARCHIVEPATH : ${ARCHIVEPATH}"
35 echo -e " EXPORTPATH : ${EXPORTPATH}"
36 echo -e " EXPORTOPTIONSPLIST : ${EXPORTOPTIONSPLIST}"
37 
38 echo -e "============Build Archive============"
39 
40 ## 導出archive包
41 xcodebuild archive -workspace ${SPACE} -scheme ${SCHEME} -archivePath ${ARCHIVEPATH}  -configuration ${BUILD_TYPE} 42 
43 echo -e "============Build Archive Success============"
44 
45 echo -e "============Export IPA============"
46 
47 ## 導出IPA包
48 xcodebuild -exportArchive -archivePath ${ARCHIVEPATH} -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST} 49 
50 echo -e "============Export IPA SUCCESS============"
51 
52 ## 編譯完成時間 20181030_0931
53 BUILD_DATE="$(date +'%Y%m%d_%H%M')"
54 
55 ## info.plist路徑
56 PROJECT_INFOPLIST_PATH="${SORCEPATH}/${TARGET_PATH}/${TARGET_NAME}/Info.plist"
57 ## 取版本號
58 BUNDLESHORTVERSION=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${PROJECT_INFOPLIST_PATH}") 59 ## 取build值
60 VERSION=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${PROJECT_INFOPLIST_PATH}") 61 ## ipa更名規則 項目名V版本_年月日_時分
62 IPANAME="${TARGET_NAME}V${BUNDLESHORTVERSION}_${BUILD_DATE}.ipa"
63 ## 更名后ipa路徑
64 EXPORTPATHNEWIPA=$EXPORTPATH/$IPANAME 65 
66 echo -e "============Export end :${BUILD_DATE}============"
67 echo -e "============IPA Old Name: ${EXPORTPATHIPA}============"
68 echo -e "============IPA New Name: ${EXPORTPATHNEWIPA}============"
69 
70 ## IPA更名
71 cp $EXPORTPATHIPA $EXPORTPATHNEWIPA 72 
73 echo -e "============Create New Name Success============"
74 
75 ## 刪除老IPA
76 ##rm $EXPORTPATHIPA
77 
78 ##echo -e "============Delete Old Name Success============"

 

執行腳本,如果在執行pod update 時報錯 pod: command not found

/Library/Tomcat8/temp/jenkins1548742361760571620.sh: line 3: pod: command not found
Build step 'Execute shell' marked build as failure

解決辦法看這里:https://www.jianshu.com/p/3ef37b9538bf

解決辦法是:

出現這個問題可能是因為你沒有設置pod的運行路徑,解決方法如下
第一步:打開Jenkins,然后在Jenkins左側的菜單中找到 系統管理--->系統設置--->全局屬性,然后找到Environment variables(中文:環境變量)並且勾選。
第二步:打開你的終端,在終端中輸入echo $PATH,終端會打印出一串字符串,幾個路徑,復制該路徑,返回到Jenkins中
第三步:會讓填寫一個鍵值對,鍵默認填寫PATH,值填寫你從終端復制的那個字符串,點擊保存,完成,構建該項目。

 



 5.將ipa文件上傳蒲公英

參照:

pytho腳本-上傳apk至蒲公英

 

6.構建成功,在構建歷史中展示二維碼

jenkins插件set build description使用規則

 

7.收集編譯成功物

每次完成構建后,編譯生成的文件較多,但是並不是所有的文件都是我們需要的。

 

通常情況下,我們可能只需要其中的部分文件,例如.ipa/.app/.plist/.apk等,這時我們可以將這部分文件單獨收集起來,並在構建頁面中展示出來,以便在需要時進行下載。

 

要實現這樣一個功能,需要在【Post-build Actions】欄目中新增Archive the artifacts,然后在Files to archive中通過正則表達式指定成果物文件的路徑。

 

設置完畢后,每次構建完成后,Jenkins會在Console Output中采用設定的正則表達式進行搜索匹配,如果能成功匹配到文件,則會將文件收集起來。

 

8.自定義build名字

  在Build History列表中,構建任務的名稱默認顯示為按照build次數遞增的BUILD_NUMBER。有時候我們可能想在build名稱中包含更多的信息,例如包含當次構建的SCHEMECONFIGURATION,這時我們就可以通過修改BuildName實現。

  Jenkins默認不支持BuildName設置,但可通過安裝build-name-setter插件進行實現。安裝build-name-setter插件后,在配置頁面的Build Environment欄目下會出現Set Build Name配置項,然后在Build Name中就可以通過環境變量參數來設置build名稱。

  例如,要將build名稱設置為上面截圖中的StoreCI_Release_#130樣式,就可以在Build Name中配置為${SCHEME}_${CONFIGURATION}_#${BUILD_NUMBER}

除了在Build Name中傳遞環境變量參數,build-name-setter還可以實現許多更加強大的自定義功能,大家可自行探索。

 

如果想在buildName中加入啟動構建的用戶名,可以參照Jenkins獲取運行job的用戶名

 

9.通過git parameter動態選擇倉庫中的分支進行打包

 參照:

jenkins-參數化構建(三)插件:Git Parameter

https://www.cnblogs.com/zhaojingyu/p/9862443.html

 

遇到的問題及解決辦法:

搭建jenkins:

初次打開jenkins頁面一片空白的解決辦法

 

其它配置:

JENKINS針對不同項目組對用戶進行權限分配

 

感謝大佬:

提供了很多思路: 

https://debugtalk.com/post/iOS-Android-Packing-with-Jenkins/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM