iOS自動化打包 Jenkins+fastlane+蒲公英+釘釘

一、Homebrew

Homebrew是一款Mac OS平臺下的軟件包管理工具

  1. 安裝Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 檢測Homebrew是否安裝成功
brew -v
Homebrew版本
  1. 更新Homebrew
brew update

注意
1、Homebrew的命令是以brew開頭
2、Homebrew的默認安裝目錄為 /usr/local/Homebrew
3、通過brew 安裝的程序都會默認安裝到 /usr/local/Cellar/程序名/版本號/ 目錄下

二、Java

  1. Jenkins需要依賴java環境,當我們用最新的Homebrew來安裝Jenkins時會默認先安裝 java11,但是我們最好使用java8,Java8比較穩定,而且后面流水線要用bugly,bugly不支持Java11。
  2. brew安裝Java8
brew install --cask homebrew/cask-versions/adoptopenjdk8
  1. 檢測Java是否安裝成功
java -version

注意
1、JAVA的默認安裝目錄為 /Library/Java,如果你安裝多個版本,/Library/Java/JavaVirtualMachines里面就可以看到多個版本文件夾

二、Jenkins

Jenkins是開源軟件項目,基于Java開發的持續集成工具,用于監控持續重復的工作

  1. brew安裝Jenkins
brew install jenkins
  1. 檢測Jenkins是否安裝成功
jenkins --version
  1. 啟動jenkins
jenkins

jenkins是在前臺啟動關閉終端,jenkins就關閉了

  1. 設置jenkins后臺啟動、開機啟動
設置開機自啟動:sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist
取消開機自啟動:sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist
后臺啟動(默認端口):nohup java -jar jenkins.war &
后臺啟動(指定端口):nohup java -jar jenkins.war -httpPort=88 &
后臺啟動(HTTPS):nohup java -jar jenkins.war -httpsPort=88 &
  1. 根據提示輸入,安裝推薦的插件,注冊賬戶
  2. 你可以把所有的插件都安裝了,常用的有git相關Branch API Plugin、 Build With Parameters之類

三、流水線

  1. 創建新的流水線任務,名字你自己取


  2. 配置Discard old builds選項,就是多久釋放舊的構建


  3. 勾選This project is parameterized,選擇Choice Parameter,這邊的environment名字和內容,其實你都可以按需配置,只要和下面腳本里對的上就可以。這邊就是選擇對應的環境,開發、測試、生產


  4. 選擇Git Parameter,就是可以選擇對應的Git分支


  5. Git源碼管理,填入你的源碼地址,我這邊用的是https的,點這個添加,輸入你的git賬號和密碼就可以了。



  6. 如果你是SSH,你就選擇SSH Username with private key,把ssh私鑰填進去
    6.1 前往文件夾 ~/.ssh 可以看到本機是否已經生成過,有的話可以直接用,也可以生成新的
    6.2 ssh-keygen -t rsa -C "youremail@example.com" 生成秘鑰;不需要更名稱和不需要密碼的話直接敲回車就行了。
    6.3 生成成功之后,前往 ~/.ssh,里面三個文件id_rsa(私鑰)、id_rsa.pub(公鑰)、known_hosts

    6.4 將id_rsa.pub(公鑰)配置到git,將id_rsa(私鑰)配置到jenkins里。

  7. 構建->增加構建步驟->Execute shell
  8. 在填腳本,我們先把釘釘弄一下
    8.1 釘釘和測試拉個群
    8.2 群設置->智能群助手->添加自定義機器人


    8.3 安全設置,必須要選一個,我選擇了關鍵詞 比較簡單一點,這個關鍵詞就是你機器人自動發的文字里必須要有這個關鍵詞才會發,例如發布。復制Webhook備用
  9. 查看蒲公英的apikey,在個人設置
  10. 因為xcodebuild打包需要ExportOptions.plist文件。所以前往文件夾~/.jenkins/workspace,在這個目錄下創建文件夾ExportOptions。
  11. 先手動導出你的IPA包,類型的話你就選ad-hoc,導出的文件里有個ExportOptions.plist,把它copy出來,放到剛剛的文件夾里,再復制一份然后修改里面的method屬性為development,把這個文件重命名為ExportOptions_dev.plist



  12. 因為我簽名是自動的,所以我不需要配證書什么的,比較方便,直接用了jenkins的腳本,如果你是手動的。還是用fastlane比較方便
  13. 輸入腳本,把腳本復制出來,你全局搜一下****,有****的地方就是你需要自己替換的
echo -e $(pwd)
## !/bin/sh
## 項目名
TARGET_NAME=****
## Scheme名
SCHEME=****

echo -e "============Pod Install============"

cd ${TARGET_NAME}
echo -e $(pwd)
pod install

##=======================
## 編譯類型
if [[ "${environment}" == "生產環境" ]]; then
# 生產環境
BUILD_TYPE=Release
## ExportOptions.plist文件的存放路徑,該文件要存放在這個路徑下內容如下
EXPORTOPTIONSPLIST=${JENKINS_HOME}/workspace/ExportOptions/ExportOptions.plist
else
# 測試環境
BUILD_TYPE=Debug
## ExportOptions.plist文件的存放路徑,該文件要存放在這個路徑下內容如下
EXPORTOPTIONSPLIST=${JENKINS_HOME}/workspace/ExportOptions/ExportOptions_dev.plist
fi

## 當前目錄
SORCEPATH=${WORKSPACE}
## workspace名
SPACE=${WORKSPACE}/${TARGET_NAME}/${TARGET_NAME}.xcworkspace
##xcarchive文件的存放路徑
ARCHIVEPATH=$SORCEPATH/build/$SCHEME.xcarchive
## ipa文件的存放路徑
EXPORTPATH=$SORCEPATH/build/$SCHEME
## 導出后的ipa路徑
EXPORTPATHIPA=$SORCEPATH/build/${TARGET_NAME}/****.ipa



echo -e "============First Build Clean============"
## 清理緩存
## 如果工程使用的是cocoapods,則'-project %s.xcodeproj'替換為'-workspace %s.xcworkspace'
xcodebuild clean -workspace $SPACE -scheme ${SCHEME} -configuration ${BUILD_TYPE}

DELETEIPAFILE=$SORCEPATH/build/$SCHEME/****.ipa
rm -f ${DELETEIPAFILE}

echo -e "============Build Clean============"

## 輸出關鍵信息
echo -e "  TARGET_NAME    : ${TARGET_NAME}"
echo -e "  BUILD_TYPE    : ${BUILD_TYPE}"
echo -e "  SORCEPATH    : ${SORCEPATH}"
echo -e "  ARCHIVEPATH    : ${ARCHIVEPATH}"
echo -e "  EXPORTPATH    : ${EXPORTPATH}"
echo -e "  EXPORTOPTIONSPLIST    : ${EXPORTOPTIONSPLIST}"
echo -e "============Build Archive============"

## 導出archive包
xcodebuild archive -workspace ${SPACE} -scheme ${SCHEME} -configuration ${BUILD_TYPE} -quiet -archivePath $ARCHIVEPATH
echo -e "============Build Archive Success============"

echo -e "============Export IPA============"
## 導出IPA包
xcodebuild -exportArchive -archivePath $ARCHIVEPATH -quiet -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST}
echo -e "============Export IPA SUCCESS============"

## 編譯完成時間
BUILD_DATE="$(date +'%Y%m%d_%H%M')"

## 上傳蒲公英
## apiKey和userKey需要在蒲公英的賬號設置中查找https://www.pgyer.com/account/api
apiKey="****"
MSG=`git log -1 --pretty=%B`

#蒲公英打包
result=$(curl -F "file=@${EXPORTPATHIPA}" \
-F "_api_key=${apiKey}" \
-F "buildUpdateDescription=${environment};${MSG}" \
https://www.pgyer.com/apiv2/app/upload)

code=`echo $result | jq '.code'`

if [ $code = 0 ];then
    echo "蒲公英打包 Success"
    data=`echo $result | jq '.data'`
    #APP名 需要帶上-r 要不然數據會有""
    buildName=`echo $data | jq -r '.buildName'` 
    #APP版本號
    buildVersion=`echo $data | jq -r '.buildVersion'` 
    #APP下載二維碼
    buildQRCodeURL=`echo $data | jq -r '.buildQRCodeURL'` 
    #釘釘通知
    message="#### 【iOS${buildName}】${environment};V${buildVersion} 發布成功 \n 更新說明:${MSG} \n>掃描二維碼安裝:![screenshot](${buildQRCodeURL}) \n #### @****釘釘群里你需要at的人的手機號碼 請注意查收"
    MSG_JSON='{"msgtype":"markdown","markdown":{"title":"'${buildName}'App發布通知","text":"'${message}'"},"at":{"atMobiles":["****釘釘群里你需要at的人的手機號碼"]}}'

    curl 'https://oapi.dingtalk.com/robot/send?access_token=****釘釘機器人webhook' \
        -H  'Content-Type:application/json' \
        -d  "${MSG_JSON}"
else
    echo "蒲公英打包 Failed"
fi
  1. 構建任務



  2. 如果你需要在git push的時候自動執行,那就設置構建觸發器,然后將這個GitLab webhook URL復制到你的項目設置里,一般叫網絡回調鉤子。


四、分配角色權限

因為要給后端和測試同學使用,需要配置一下權限,給他們指定某些任務可以操作,具體的操作也只能是運行和取消。

  1. 安裝插件Role-based Authorization Strategy
  2. Manage Jenkins->Manage Users->新增用戶test




  3. Manage Jenkins->Configure Global Security->勾選Role-Based Strategy ,保存(如果你沒有安裝Role-based Authorization Strategy插件是沒有這個選項的)


  4. Manage Jenkins->Manage and Assign Roles 進入角色管理
    4.1 選擇Manage Roles,這邊我的理解是用戶組的意思,你輸入一個用戶組的名字,選擇讀權限

    4.2 輸入4.1你輸的用戶組名,然后在Pattern輸入對應的任務名字,進行綁定,選擇對應的權限。相當于你這個組下的用戶只能操作這個任務

    4.3 選擇Assign Roles,給對應的用戶組,分配用戶

    4.4 綁定用戶組和用戶,拉到最下面有個保存
  5. 登錄test賬號,發現只能看到那一個任務,也只有運行和停止的操作 就OK了


五、外網映射

  1. 因為測試同學不一定和咱們處于同一個區域網,咱們需要給個外網地址給他們,那我們需要用到一個工具 花生殼 ,自行搜索下載?;ㄉ鷼つJ是開機自啟的,這個軟件有時候后端在測支付的時候 也是可以用它的。
  2. 添加映射


    3-1.png
  3. 輸入你本機的IP地址(按住option,去點擊你的WiFi圖標,可以看到你的IP),端口是8080,保存


    3-2.png
  4. 將生成的訪問地址,發給測試他們試試吧


六、Fastlane的使用

fastlane可以簡化我們的操作,之前的shell腳本那么長 很不方便。在集成fastlane之前,咱們先創建一個新的jenkins任務,里面把上面講的git等相關的東西先弄好。

  1. 安裝fastlane
brew install fastlane
  1. 查看fastlane版本
fastlane --version
  1. 進入你的工程目錄下,初始化,選擇4 然后下一步確認鍵就可以了
fastlane init

  1. 成功后會生成fastlane文件夾,里面有Appfile、Fastfile兩個文件
  2. Appfile主要是填寫你的app_identifier和apple_id賬號的, Fastfile就是你的操作文件了,里面包含了多個lane ,每個lane你就可以想成是個任務或者方法。
  3. 進入你的工程目錄下,添加蒲公英插件,然后會多Gemfile Gemfile.lock Pluginfile文件
fastlane add_plugin pgyer

  1. 填寫Appfile賬號信息
app_identifier "****"
apple_id "****"
  1. 編寫fastlane任務,gym(clean:true,scheme:"XMHealth",configuration:"Release",export_method:"ad-hoc"),configuration有release和debug,export_method即導出參數有app-store, package, ad-hoc, enterprise, development, 和developer-iddevelopment。你搜一下里面有****的做一下替換。至于lane傳參數,你可以看一下官網傳參的介紹
default_platform(:ios)
platform :ios do

  desc "build adhoc ipa"
  lane :XMHealth_adhoc do
     gym(clean:true,scheme:"****",configuration:"Release",export_method:"ad-hoc")
  end

  desc "build dev ipa"
  lane :XMHealth_dev do
     gym(clean:true,scheme:"****",configuration:"Debug",export_method:"development")
  end

  desc "upload to pgyer"
  lane :uploadToPgyer do |options|
     pgyer(api_key: "****", user_key: "****", update_description: options[:msg])
  end

  desc "upload to dingdingTalk"
  lane :dingdingTalk do |options|
     updatemsg = options[:msg]
     buildName = get_info_plist_value(path: "./XMHealth/Other/Info.plist", key: 'CFBundleDisplayName')
     puts buildName
     curl = %Q{
        curl 'https://oapi.dingtalk.com/robot/send?access_token=****' \
        -H 'Content-Type:application/json' \
        -d '{
          "msgtype":"markdown",
          "markdown":{
            "title":"iOS#{buildName}App發布通知??????",
            "text":"#### ??????iOS#{buildName}App發布成功\n說明:#{updatemsg}\n###### 掃碼安裝↓↓↓\n![screenshot](https://www.pgyer.com/app/qrcode/****)\n#### @**** @**** 請注意查收"
          },
          "at":{
            "atMobiles":["****","****"]
          }
      }'
    }
    system curl
  end

  desc "release"
  lane :release do |options|
    if options[:submit]
      XMHealth_adhoc() 
      uploadToPgyer(msg:options[:msg])
      dingdingTalk(msg:options[:msg])
      puts "生產ad-hoc流水線成功"
    else
      XMHealth_dev() 
      uploadToPgyer(msg:options[:msg])
      dingdingTalk(msg:options[:msg])
      puts "測試dev流水線成功"
    end
  end
end
  1. jenkins里execute shell
## 項目名
TARGET_NAME=****
GITMSG=`git log -1 --pretty=%B`
MSG="${environment}、${GITMSG}"
cd ${TARGET_NAME}
pod install

## 編譯類型
if [[ "${environment}" == "生產環境" ]]; then
# 生產環境
fastlane release submit:true msg:${MSG}
else
# 測試環境
fastlane release submit:false msg:${MSG}
fi
  1. 專門搞一臺閑置的Mac天天開著,在上面部署好,然后用花生殼,開放給測試、后臺他們使用

常見問題

  1. 如果有Java相關的報錯,記得檢查你本地的環境變量還有安裝的Java,JAVA的默認安裝目錄為 /Library/Java,看看里面是不是安裝了多個,建議使用java8,jenkins默認是Java11的,
    1.1 檢查. zshrc文件的里的環境變量JAVA_HOME,前往->文件夾-> ~/. zshrc
    1.2 如果有缺JAVA_HOME,請添加你對應的Java地址
    1.3 命令行里source .zshrc,保存一下
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home"
  1. 輸出里看到如下錯誤
DVTPortal: Error:
Error Domain=DVTPortalServiceErrorDomain Code=1100 "Your session has expired. Please log in."

解決: Xcode —>Preference—> Accounts 重新登錄,注意如果有多個賬號,要確保所有的賬號都是登錄狀態。

  1. 在jenkins里執行xcodebuild -exportArchive 導出IPA命令的時候,會報錯
error: exportArchive: The data couldn’t be read because it isn’t in the correct format.

Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/qx/qs4cc3pn0sgddxqjh7dj_k300000gn/T/ipatool-json-filepath-~~~FH2VEz}

** EXPORT FAILED **

Build step 'Execute shell' marked build as failure
Finished: FAILURE

解決: 將對應打包的證書ExportOptions.plist文件的compileBitcode內容由 true 改為 false 就可以

1、Could not find action, lane or variable 'pgyer'. Check out the documentation for more details: https://docs.fastlane.tools/actions

找不到蒲公英插件,原來是安裝目錄錯了,應該在工程目錄下安裝:fastlane add_plugin pgyer

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容