iOS 持續(xù)集成與持續(xù)分發(fā)(jenkins+fastlane+pgyer)

摘要

手動(dòng)打包、手動(dòng)上傳是一件非常煩瑣的事件,通常會(huì)浪費(fèi)開(kāi)發(fā)者大量的時(shí)間,這時(shí)候自動(dòng)打包與分發(fā)就起到的重要的角色。本文主要分為4個(gè)部分

  • 講述jenkins在mac下的安裝與任務(wù)創(chuàng)建
  • fastlane安裝與應(yīng)用
  • 自動(dòng)上傳到蒲公英并郵件通知相關(guān)人員去下載安裝
  • xcode打包原理

一、mac環(huán)境下jenkins的安裝與配置

1.1 手動(dòng)下載安裝
  • jenkins,安裝與我們平時(shí)安裝別的軟件差不多
1.2 通過(guò)終端安裝
  • 安裝 homebrew
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安裝 jenkins
    brew install jenkins
    jenkins-1.png
  • 查看jenkins目錄:cd /Users/用戶名/.jenkins
    jenkins11.png
1.3 啟動(dòng)jenkins與配置
  • 在終端輸入:jenkins即可后臺(tái)啟動(dòng)服務(wù),然后用瀏覽器啟動(dòng)頁(yè)面如下:
  • 直接在命令行中輸入:jenkins即可啟動(dòng)。下面三個(gè)為常用的jenkins啟停方法
    http://localhost:8080 // 打開(kāi)jenkins可視化頁(yè)面
    http://localhost:8080/exit //退出Jenkins
    http://localhost:8080/restart //重啟
    http://localhost:8080/reload //重新加載
  • 啟動(dòng)時(shí),需要解鎖jenkins,按照提示去目錄下打開(kāi)文件,把密碼復(fù)制出來(lái)填入輸入框,如果碰到權(quán)限問(wèn)題,需要進(jìn)行操作: 右鍵 - 顯示簡(jiǎn)介 - 修改權(quán)限。


    jenkins-3.png
  • 啟動(dòng)后,選擇安裝推薦插件等,即下圖中的第一項(xiàng)


    jenkins-4.png
  • 設(shè)置管理員信息


    jenkins2.png
  • 進(jìn)入主面,如下


    jenkins3.png

1.34 jenkins鑰匙串插件,訪問(wèn)地址與端口號(hào)更改等

  • 地址修改
    進(jìn)入上面中系統(tǒng)管理->系統(tǒng)設(shè)置
    如下:


    jenkins-5.png
  • 全局屬性設(shè)置

    jenkins5.png

    上圖中,PATH參數(shù)獲取方法:
    終端輸入echo $PATH
    jenkins-8.png

  • 打包成功或失敗,郵件通知


    ![Uploading jenkins-6_671804.png . . .]

    jenkins-6.png
1.4 jenkins插件安裝

上面我們選擇推薦安裝,對(duì)于ios開(kāi)發(fā),其實(shí)大部分已經(jīng)默認(rèn)安裝,這里我們以keychain為例安裝一個(gè)(后續(xù)fastlane用到match匹配同步開(kāi)發(fā)證書(shū)時(shí),會(huì)訪問(wèn)鑰匙串)

  • 在jenkins主面,系統(tǒng)管理->控件管理


    jenkins11.png
  • 選擇可選插件,右邊搜索框輸入keychain,勾先安裝完成后重啟jenkins,點(diǎn)擊安裝


    jenkins10.png
  • 設(shè)置keychain相關(guān),在jenkins主面,系統(tǒng)管理->控件管理,點(diǎn)擊keychain。。。,然后來(lái)點(diǎn)頁(yè)面:
    jenkins12.png

    打開(kāi)keychain位置的命令:open ~/Library/Keychains/
    如果不設(shè)置這個(gè),那么在創(chuàng)建任務(wù)中,在Excute shell中就要加上這句:security unlock-keychain -p 你的電腦密碼 login.keychain
1.5 jenkins任務(wù)創(chuàng)建與任務(wù)配置
  • 創(chuàng)建,新建->選擇構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目。如下圖


    jenkins7.png

    然后主面右邊就會(huì)出現(xiàn)剛創(chuàng)建好的。點(diǎn)擊進(jìn)去。來(lái)到任務(wù)主頁(yè)。

  • 任務(wù)主頁(yè)


    jenkins13.png
  • 配置相關(guān)信息

    • 配置構(gòu)建存留周期次數(shù)、Git等,如下圖


      jenkins14.png
    • 配置運(yùn)行腳本,這里主要配置一些你打包的命令腳本。

      jenkins15.png

      這里的腳本,可以參照下文第二部分fastlane中fastfile配置,里面實(shí)現(xiàn)了fastlane matchDev與fastlane dev操作。

    • 定期自動(dòng)構(gòu)建

      jenkins18.png

      常用的poll scm設(shè)置
      每15分鐘構(gòu)建一次:H/15 * * * * 或*/5 * * * *
      每天8點(diǎn)構(gòu)建一次:0 8 * * *
      每天8點(diǎn)~17點(diǎn),兩小時(shí)構(gòu)建一次:0 8-17/2 * * *
      周一到周五,8點(diǎn)~17點(diǎn),兩小時(shí)構(gòu)建一次:0 8-17/2 * * 1-5
      每月1號(hào)、15號(hào)各構(gòu)建一次,除12月:H H 1,15 1-11 *

    • 構(gòu)建后操作,郵件通知等


      jenkins16.png

      操作步驟: 增加構(gòu)建后操作->Editable Email Notification,然后點(diǎn)擊下面的Advanced Settings,就會(huì)出現(xiàn)上面的圖,填寫(xiě)好標(biāo)題兩天內(nèi)容即可。

    • 郵件發(fā)送成功示例


      jenkins17.png
    • 構(gòu)建過(guò)程中,可通過(guò)點(diǎn)擊當(dāng)前構(gòu)建,點(diǎn)擊console output查看打包過(guò)程中的輸出日志。


      jenkins20.png

建議把jenkins頁(yè)面右上角的允許自動(dòng)刷新打開(kāi)


二、fastlane安裝與配置

fastlane是一個(gè)完全開(kāi)源的項(xiàng)目,包含一組 Ruby 實(shí)現(xiàn)的工具集,能完成 iOS 和 Android 工程 的自動(dòng)化構(gòu)建\測(cè)試和發(fā)布,用來(lái)執(zhí)行某一特定的任務(wù),可以通過(guò)配置文件將不同的工具靈活的結(jié)合在一起,從而形成一個(gè)完整的自動(dòng)化流程,實(shí)現(xiàn)一鍵上傳 ITC,從而縮短用于構(gòu)建發(fā)布的時(shí)間,其主要工具集如下:

  • sigh: 開(kāi)發(fā)證書(shū)和描述文件下載
  • produce: 使用命令行在iTunes Connect上創(chuàng)建新的app和開(kāi)發(fā)入口
  • cert: 自動(dòng)創(chuàng)建和配置iOS代碼簽名證書(shū)
  • spaceship: Ruby 庫(kù)訪問(wèn) Apple開(kāi)發(fā)者中心和 iTunes Connect
  • pilot: 最好的方式管理你的TestFlight 測(cè)試人員和從終端構(gòu)建
  • boarding: 最簡(jiǎn)單的方式邀請(qǐng)你的TestFlight beta測(cè)試人員
  • gym: iOS app打包簽名自動(dòng)化工具
  • match: 使用Git同步你的團(tuán)隊(duì)證書(shū)和配置文件
  • scan: 最簡(jiǎn)單方式測(cè)試你的 iOS 和 Mac apps

查看所有的工具集:fastlane actions
單獨(dú)查看某一個(gè)action的功能: fastlane action [action_name]

2.1 fastlane的安裝
  • 檢查xcode-select 是安裝
xcode-select --install // 若未安裝則會(huì)自動(dòng)安裝,若已經(jīng)安裝,則提示:xcode-select: error: command line tools are already installed, use "Software Update" to install updates
  • 安裝fastlane
sudo gem install -n /usr/local/bin fastlane
  • 查看版本
fastlane --version
2.2 為項(xiàng)目配置的fastlane
  • 在工程目錄在,用終端初始化
cd 工程目錄
fastlane init 
  • init過(guò)程,由于我的帳號(hào)關(guān)聯(lián)了兩個(gè)開(kāi)發(fā)者帳號(hào),于是會(huì)彈出讓我選擇哪一個(gè)的選項(xiàng)。


    fastlane1.png

上述過(guò)程中,會(huì)要求你填寫(xiě)開(kāi)發(fā)者帳號(hào)密碼等信息。完成后,會(huì)在你的工程目錄在創(chuàng)建一個(gè)fastlane文件夾

  • 文件夾如圖所示


    fastlane2.png

    各文件描述:

    • Appfile:用于存儲(chǔ)應(yīng)用程序標(biāo)識(shí)符和Apple ID 等信息
    • Fastfile:配置管理 lane 我們打包主要是配置這個(gè)文件
    • Deliverfile:配置應(yīng)用在 iTunes Connect 中的各種信息,和 ICC 中的數(shù)據(jù)是一一對(duì)應(yīng)的
    • metadata:包含應(yīng)用在 iTunes Connect 中的各種信息
    • screenshots:包含截圖數(shù)據(jù)

項(xiàng)目工程中,Edit Scheme打開(kāi)的頁(yè)面,Shared前的勾選框,應(yīng)該打上勾。不然jenkins打包過(guò)程中,可能報(bào)錯(cuò)。
接下來(lái)主要講述Fastfile文件配置

2.3 fastfile文件編寫(xiě)

下面用到的工具match、gym、deliver、gpyer等,均可以通過(guò):fastlane 工具名 --help查看里面的參數(shù)如何寫(xiě)等

  • match匹配證書(shū)
    • 首先要一個(gè)倉(cāng)庫(kù)來(lái)存放證書(shū)與profile文件


      fastaneMatch1.png
    • 在工程目錄下執(zhí)行 fastlane match init,過(guò)程中會(huì)要求你填入一個(gè)git倉(cāng)庫(kù)。把上面創(chuàng)建好的填入即可。
      fastaneMatch2.png
    • 這樣,在fastlane文件夾會(huì)添加一個(gè)Matchfile文件。


      fastaneMatch3.png
    • 內(nèi)容如下


      fastaneMatch4.png
    • 在fastfile文件中,添加匹配證書(shū)的執(zhí)行塊:
      fastaneMatch6.png

      其中,match函數(shù)中的參數(shù)key與參數(shù)值value,可在終端執(zhí)行:fastlane match --help 或者 github上查看:match
    • 在終端執(zhí)行fastlane matchDev后,倉(cāng)庫(kù)上,keychain中,jenkins環(huán)境中,均會(huì)有證書(shū)相關(guān)文件
      fastaneMatch5.png

      執(zhí)行fastlane matchDev,途中會(huì)要求訪問(wèn)鑰匙串,要輸入電腦密碼。如果把這腳本寫(xiě)到j(luò)enkins Excute shell中,那么會(huì)碰到超時(shí),提示未輸入username,于是我們會(huì)在shell中添加:security unlock-keychain -p 你的電腦密碼 login.keychain或者在插件管理中,把login.keychain先配置好
    • registerDevice 添加新設(shè)備UUID
desc "添加新設(shè)備UUID"
desc "This will also make sure the profile is up to date"
lane :registerDev do
    register_device(
      name: "名字",
      udid: "227a4********1349e27***c211e**69")
end
--------------這樣,在匹配證書(shū)時(shí),就要用到:force_for_new_devices屬性---------------
desc "匹配生成證書(shū)"
desc "This will also make sure the profile is up to date"
lane :matchAppstore do
    match(type: "appstore",keychain_password: ENV['PASSWORD'],force_for_new_devices:true) # 匹配開(kāi)發(fā)證書(shū)
end
  • gym打包
    • 在fastfile中配置打包,這里用到gym工具,可通過(guò)fastlane gym --help或github查看gym用法
      fastaneMatch7.png

      其中,首先匹配證書(shū)。像里面用到的increment_build_number 這些都可通過(guò)fastlane actions查看到。
      下面這樣,省去build版本自增等,更為簡(jiǎn)潔。
desc "打包測(cè)試"
  lane :dev do
    match(git_url:"https://git.oschina.net/yang***/cer.git",type: "development",keychain_password:"123",app_identifier:"cn.com.**") # 匹配開(kāi)發(fā)證書(shū)
   
     # 打包,具體參數(shù)可fastlane gym -h查看
     gym(clean: true,scheme:"GC",configuration:"Debug",output_name:"GC_Test",export_method:"development")
  
    # 上傳到薄公英,可以去薄公英官網(wǎng)查看插件安裝方法
     pgyer(api_key: "6ef35de7a3c4c60***dd48825eac3a", user_key: "ce1e4c***c27232fcde878db3",password: "a**23", install_type: "2")
    # 發(fā)布
     # deliver(force: true,skip_screenshots:true,skip_metadata: true)    # 不上傳截屏文件和元數(shù)據(jù)。
  end

上面有用到上傳蒲公英,接下來(lái)第三部分講述pgyer的用法。


三、pgyer插件安裝與配置

pgyer安裝與使用官方文檔:使用 Fastlane 上傳 App 到蒲公英
在工程目錄在,用終端鍵入:

fastlane add_plugin pgyer
  • 安裝后,工程目錄下會(huì)有Gemfile文件,fastlane文件下,會(huì)多出pluginfile文件


    pgyer1.png
  • pluginfile如下


    pgyer2.png
  • fastlane ,在fastlfile中配置上傳蒲公英操作
lane :uploadPgyer do
  pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141", user_key: "4a5bcxxxxxxxxxxxxxxx3a9e", password: "123456", install_type: "2")
end
  • 上面,api_key與user_key獲取如下:


    pgyer3.png

四、xcode打包原理

xcode打包,用的就是xcodebuild命令完成的??梢酝ㄟ^(guò)man xcodebuild命令查看文檔
此部分參考了兩位同事的文章:xcodebuild自動(dòng)打包,發(fā)布應(yīng)用xcodebuild 自動(dòng)化構(gòu)建

  • xcode打包發(fā)布流程
    • xcodebuild clean
    • archive
    • exportArchive導(dǎo)出文件
    • altool上傳
  • archive打包
xcodebuild archive -workspace 項(xiàng)目名稱(chēng).xcworkspace 
                       -scheme 項(xiàng)目名稱(chēng) 
                       -configuration 構(gòu)建配置 
                       -archivePath archive包存儲(chǔ)路徑 
                       CODE_SIGN_IDENTITY=證書(shū) 
                       PROVISIONING_PROFILE=描述文件UUID
  • configuration構(gòu)建配置,可參考以前寫(xiě)的文章:Xcode通過(guò)Build Configuration配置多套域名方法,一般情況下,我們這里打測(cè)試包寫(xiě):Debug,生產(chǎn)包:Release.
  • CODE_SIGN_IDENTITY獲?。?br> 鑰匙串訪問(wèn)->選中證書(shū)->上方的標(biāo)題就是我們需要的Identity(括號(hào)也算),如:iPhone Developer: ** *** (WS4F**K**)
  • PROVISIONING_PROFILE:這個(gè)獲取方法如下:
/Users/用戶名/Library/MobileDevice/Provisioning Profiles 
找到對(duì)應(yīng)的provisioning Profiles
如果文件較多,可在命令終端輸入
security cms -D -i xxxx.mobileprovision // 解析描述文件,可以得到里面所有的信息(TeamId,ProvisionedDevices,TeamName,UUID,Version,AppIDName等等)。以確定哪一個(gè)是此項(xiàng)目所用到的

注意要 在CODE_SIGN_IDENTITY,PROVISIONING_PROFILE賦值時(shí)要加""號(hào)

  • 導(dǎo)出ipa包
xcodebuild -exportArchive -archivePath archive文件的地址.xcarchive 
                          -exportPath 導(dǎo)出的文件夾地址 
                          -exportOptionsPlist exprotOptionsPlist.plist 
                          CODE_SIGN_IDENTITY=證書(shū) 
                          PROVISIONING_PROFILE=描述文件UUID
  • archive文件的地址.xcarchive
    這個(gè)地址為打包后,生成**.xcarchive文件的地址。
  • exportOptionsPlist
    這是一個(gè)plist文件,我們可以在項(xiàng)目中手動(dòng)創(chuàng)建一個(gè),然后把這個(gè)文件地址拖進(jìn)來(lái)。plist具體有哪些參數(shù),用命令:xcodebuild exportOptionsPlist --help查看,在輸出的Available keys for -exportOptionsPlist項(xiàng):
    jenkins12.png
  • ipa包上傳,我們工作中一般用的是Application Loader或xcode 打包后的upload按鈕,但是它們的本質(zhì)其實(shí)都是用:altool來(lái)實(shí)現(xiàn)。
    altool工具的位置:
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool

命令設(shè)置別名:

在~/.bash_profile 中設(shè)置別名
alias altool='/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool'

設(shè)置別名后在終端
輸入 source ~/.bash_profile 以使其生效。
再輸入 altool  就會(huì)有它的一些用法提示,否則就是設(shè)置別名失敗了

同理,別的工具也可以用此方法實(shí)現(xiàn)別名處理,以快速在終端打開(kāi)工具。

altool 用法:

驗(yàn)證 ipa
altool --validate-app -f file -u username [-p password] [--output- format xml]
上傳 ipa
altool --upload-app -f file -u username [-p password] [--output- format xml]

具體參數(shù)說(shuō)明:
--validate-app
您要驗(yàn)證的應(yīng)用程序。
--upload-app
您要上傳的應(yīng)用程序。
-f file
您正在驗(yàn)證或上傳的應(yīng)用程序的路徑和文件名。
-u username
您的用戶名。
-p password
您的用戶密碼。
--output-format [xml | normal]
您要 Application Loader 以結(jié)構(gòu)化的 XML 格式還是非結(jié)構(gòu)化的文本格式返回輸出信息。Application Loader 默認(rèn)以文本格式返回輸出信息。

altool官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容