Jenkins+Fastlane+自動化打包發布+蒲公英二維碼展示

前言:

身為一名iOS開發人員,面臨必不可少的一個階段就是打包測試。雖然xcode可有實現打包,但在測試階段面臨測試人員不斷的向你催促需要新的包進行測試就會很讓人頭疼,打包又是一個重復性極高又很費時間的事情。所以研究了一下jenkinsfastlane的自動打包流程,希望對大家有所幫助,途中也遇到了眾多的問題和坑。

如需幫助可直接 聯系我

前期準備

  • Ruby:

    fastlane的安裝需要Ruby2.0版本以上,雖然mac自帶ruby,但是版本可能較低,并且權限較少,所以推薦使用RVM管理ruby版本。

    按照這篇文章安裝既可以了 Mac安裝Ruby版本管理器RVM

  • xcode命令行工具

    xcode-select --install 
    

    如果已經安裝會提示


    image

    如果沒有安裝會出現


    xcode-select --install

    ? 直接點擊安裝就可以了,安裝完成后再次執行 xcode-select --install 之后出現已經安裝的提示了。

  • Java JDK (這個是Jenkins安裝用的,如果不需要jenkins可直接忽略)

    可先查看 當前安裝的java版本

    java -version
    

    如果未安裝請先前往 JDK下載鏈接 下載

    因為jenkins是用java語言編寫的,所以需要java的支持,建議使用1.8版本的JDK

    需要先接受協議之后才可以下載

    image

    下載完成之后直接安裝就可以了,這里就不再贅述。

    前期準備工作到這里就完成了

Fastlane

img/fastlane_text.png

fastlane是為iOS和Android應用程序自動化beta部署和發布最簡單的方法。??可以處理各種繁瑣任務,例如生成屏幕截圖,處理代碼簽名和發布應用該程序等.fastlane整合了一系列移動端開發中簽名,編譯,發布等工具,堪稱打包神器。

fastlane初始化

  • 安裝fastlane的三種方式

    1. Homebrew

      brew cask install fastlane
      
    2. 安裝程序腳本

      下載zip文件。后雙擊shell腳本即可

    3. RubyGems

      gem install fastlane -NV
      
  • 蒲公英插件

    這里我們在最后使用了 Jenkins上傳蒲公英,為了獲取下載二維碼。

    本文也提到了使用Fastlane上傳蒲公英的介紹

    Fastlane 安裝成功之后 執行安裝蒲公英的插件

    fastlane add_plugin pgyer
    

    如果沒什么意外就直接成功了

    剛開始我使用的本機自帶的ruby, 失敗了。然后使用了rvm管理的ruby之后就成功了。

    如果遇到了其他問題請大家google一下吧,或者聯系我我們一起探討。

  • 初始化

    cd /到自己的項目目錄中
    

    初始化fastlane

    fastlane init
    

    如果之前的都沒有問題 會出現以下選項

    image
    1. Automate screenshots: 自動截屏
    2. Automate beta distribution to TestFlight: 自動發布beta版本到testFlight
    3. Automate App Store distribution: 自動發布到App Store
    4. Manual setup: 手動設置

    這里我們選的是第3個,然后會出現一些選項

    1. ??  Automate screenshots
    2. ?????  Automate beta distribution to TestFlight
    3. ??  Automate App Store distribution
    4. ??  Manual setup - manually setup your project to automate your tasks
    ?  3
    [10:37:53]: ----------------------------------------------------------
    [10:37:53]: --- Setting up fastlane for iOS App Store distribution ---
    [10:37:53]: ----------------------------------------------------------
    [10:37:53]: Parsing your local Xcode project to find the available schemes and the app identifier
    [10:37:53]: $ xcodebuild -showBuildSettings -workspace FastlaneDev.xcworkspace -scheme FastlaneDev
    [10:37:55]: $ cd `你項目的路徑` && agvtool what-version -terse
    [10:37:55]: --------------------------------
    [10:37:55]: --- Login with your Apple ID ---
    [10:37:55]: --------------------------------
    [10:37:55]: To use App Store Connect and Apple Developer Portal features as part of fastlane,
    [10:37:55]: we will ask you for your Apple ID username and password
    [10:37:55]: This is necessary for certain fastlane features, for example:
    [10:37:55]: 
    [10:37:55]: - Create and manage your provisioning profiles on the Developer Portal
    [10:37:55]: - Upload and manage TestFlight and App Store builds on App Store Connect
    [10:37:55]: - Manage your App Store Connect app metadata and screenshots
    [10:37:55]: 
    [10:37:55]: Your Apple ID credentials will only be stored in your Keychain, on your local machine
    [10:37:55]: For more information, check out
    [10:37:55]:     https://github.com/fastlane/fastlane/tree/master/credentials_manager
    [10:37:55]: 
    [10:37:55]: Please enter your Apple ID developer credentials
    [10:37:55]: Apple ID Username:
    `你的Apple ID`
    [10:38:16]: Logging in...
    
    image

    如果你賬號下有多個team會讓你選擇一下

    然后等待安裝

    在這期間我遇到了bundle update這句話一直不動,我重新init了一遍就好了

    成功之后 打開我們的項目目錄發現多了這個文件


    image

    恭喜你 初始化成功了 !!!

配置Fastlane

文件名 描述
Appfile 從 Apple Developer Portal 獲取和項目相關的信息 詳情
Fastfile 核心文件,存放lane任務
Deliverfile deliver的配置文件,從 iTunes Connect 獲取和項目相關的信息詳細
metadata 同步iTC中的元數據
screenshots 同步iTC中的截圖

這里給打家推薦一篇配置的文章Fastfile參考配置

下面是我的配置僅供參考,沒有用fastlane上傳蒲公英,因為想要在jenkins里面獲取二維碼暫時的解決辦法使用jenkins上傳蒲公英 如果需要fastlane上傳直接打開的注釋進行了

# 導出路徑
$ipa_output_directory = "/Users/xx/xx/fastlaneBuild"
# 上傳蒲公英的包 路徑
$ipa_output_upload_directory = "/Users/xx/.jenkins/workspace/xx/ipa"
# jenkins匹配的包名
$jenkins_name = "項目名"

default_platform(:ios)
    # 應用名詞
    scheme_name = "項目名字"
     # 獲取version
    version = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleShortVersionString")
    # 獲取build版本號
    build = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleVersion")
    # 指定xcode打包 這里可選擇不要,我們的項目需要用10.1版本xcode
    xcode_select("/Applications/Xcode_10.1.app")
    # 默認內測打包方式,目前支持app-store, package, ad-hoc, enterprise, development
    ipa_exportMethod = "ad-hoc"
    ipa_exportMethod_appStore = "app-store"

# 計算buildNumber
def updateProjectBuildNumber
    currentTime = Time.new.strftime("%Y%m%d")
    scheme_name = "項目名字"
        build = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleVersion").to_s
    if build.include?"#{currentTime}."
    # 為當天版本 計算迭代版本號
        lastStr = build[build.length-2..build.length-1]
        lastNum = lastStr.to_i
        lastNum = lastNum + 1
        lastStr = lastNum.to_s
        if lastNum < 10
            lastStr = lastStr.insert(0,"0")
        end
        build = "#{currentTime}.#{lastStr}"
    else
        # 非當天版本 build 號重置
        build = "#{currentTime}.01"
    end
    puts("*************| 更新build #{build} |*************")
    # 更改項目 build 號
    increment_build_number(
        build_number: "#{build}"
    )
end

# 打包成功 jenkins 開始提示上傳log
# 使用fastlane上傳蒲公英拿不到二維碼展示, 所以使用jenkins上傳蒲公英
def archiveSuccessLog(outputName,buildConfig)
    # 打好的包 移動到 jenkins的 workspace的目錄下,用于jenkins上傳蒲公英匹配包內容。永遠只保留一份
#   FileUtils.cp_r("#{$ipa_output_directory}" + "/#{outputName}", "#{$ipa_output_upload_directory}" +  "/#{$jenkins_name}.ipa")
    puts" --------------------------------------------------------------------------"
    puts"|                                                                          |"
    puts"|                                                                          |"
    puts"|   ?????? --------->>>>>      #{buildConfig}版本_打包成功     <<<<<-----------??????  |"
    puts"|                                                                          |"
    puts"|   ?????? --------->>>>>  Jenkins 可以開始上傳蒲公英了  <<<<<-----------??????  |"
    puts"|                                                                          |"
    puts"|                                                                          |"
    puts" --------------------------------------------------------------------------"
end



#
# 所有任務腳本
#
platform :ios do

  # 
  # *************| 上傳到測試版本到蒲公英_測試包 |*************
  #
  desc "上傳到測試版本到蒲公英_測試包"
  lane :topgyer_debug do|option|
    puts "*************| 開始打包.ipa文件... |*************"
    # 自動增加build
    updateProjectBuildNumber
    # 自動生成證書
    cert
    # 導出名稱
    output_name = "#{scheme_name}_#{version}_#{build}_#{option[:desc]}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"
    gym(
      # 指定輸出的ipa名稱
        output_name: "#{output_name}",
        # 指定項目的scheme
        scheme: "xxx", 
        # 是否清空以前的編譯信息 true:是
        clean: true,
        export_method: "#{ipa_exportMethod}",
        export_options: {iCloudContainerEnvironment: 'Development'},
        # 指定打包方式,Release 或者 Debug 按需修改
        configuration:"Debug",
        # 包導出的位置
        output_directory: "#{$ipa_output_directory}",
     )

    # 使用fastlane上傳蒲公英拿不到二維碼展示, 所以使用jenkins上傳蒲公英
    archiveSuccessLog(output_name," Debug ")

        # 這里是 fastlane 直接上傳蒲公英
    # 如果需要請打開一下注釋,并注釋掉archiveSuccessLog(output_name," Debug ")
    # puts "*************| 開始上傳__測試版__本到蒲公英... |*************"
    # 配置蒲公英 api_key 和 user_key
    # pgyer(api_key: "你的api_key", user_key: "你的user_key", update_description: "#{option[:desc]}")
    # puts "*************| 上傳__測試版__到蒲公英??????成功?????? |*************"
  end


   #
   # *************| 上傳App Store |*************
   #
   lane :toappstore do
    project_identifier = ""
    puts "*************| 開始上傳AppStore... |*************"
    # 自動增加build
    updateProjectBuildNumber
    # 自動生成證書
    # cert
    # 導出名稱
    codesigning_identity = "證書名字"
    output_name = "#{scheme_name}_#{version}_#{build}_#{ipa_exportMethod_appStore}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"
    gym(
        # 指定輸出的ipa名稱
        output_name:output_name,
        # 指定項目的scheme
        scheme:"xxx",
        # 是否清空以前的編譯信息 true:是
        clean:true,
        # 指定打包方式,Release 或者 Debug
        configuration:"Release",
        # 指定打包方式,目前支持app-store, package, ad-hoc, enterprise, development
        export_method:"app-store",
        # 上傳的環境
        export_options: {iCloudContainerEnvironment: 'Production'},
        # 指定輸出文件夾
        output_directory:"#{$ipa_output_directory}",
     )

     deliver(
             # 選擇跳過圖片和元數據上傳,自己去配置
             skip_screenshots:true,
             skip_metadata:true,
             # 上傳完成后提交新版本進行審查
             submit_for_review: false,
             force:true,
            )
    puts "*************| 上傳AppStore成功?? |*************"


    puts "*************| 開始上傳__測試版__本到蒲公英... |*************"
    # 配置蒲公英 api_key 和 user_key
    pgyer(api_key: "你的api_key", user_key: "你的user_key", update_description: "#{option[:desc]}")
    puts "*************| 上傳__測試版__到蒲公英??????成功?????? |*************"
    # 發布testflight測試
    # pilot
    end

end

在自己的項目目錄中執行

fastlane topgyer_debug desc:測試

這句話根據自己的lane :topgyer_debug do|option| 修改

成功之后可以看見 , 如果有上傳蒲公英給的操作 則會告知蒲公英上傳成功,前往蒲公英查看就有新版本了。

17:58:59:  --------------------------------------------------------------------------
17:58:59: |                                                                          |
17:58:59: |                                                                          |
17:58:59: |   ?????? --------->>>>>       Debug 版本_打包成功     <<<<<-----------??????  |
17:58:59: |                                                                          |
17:58:59: |   ?????? --------->>>>>  Jenkins 可以開始上傳蒲公英了  <<<<<-----------??????  |
17:58:59: |                                                                          |
17:58:59: |                                                                          |
17:58:59:  --------------------------------------------------------------------------

接下來思考的問題是: 不能還是由我們開發人員執行 腳本任務來打包上傳蒲公英。

有沒有辦法能夠讓測試人員自己去打包呢? 所以接下來我們要做的就是 讓jenkins執行我們的fastlane腳本

并且自動生成二維碼展示。測試人員需要測試包的時候開發人員只需要把代碼上傳到對應的分支就好了。

我選擇了一臺專門的機器作為服務器 來做這件事情, 畢竟在自己電腦上多少會有點影響的。

Jenkins

img

Jenkins是一個獨立的開源軟件項目,是基于Java開發的一種持續集成工具,用于監控持續重復的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。前身是Hudson是一個可擴展的持續集成引擎。可用于自動化各種任務,如構建,測試和部署軟件。Jenkins可以通過本機系統包Docker安裝,甚至可以通過安裝Java Runtime Environment的任何機器獨立運行。

  • 主要用于:

    • 持續、自動地構建/測試軟件項目,如CruiseControl與DamageControl。
    • 監控一些定時執行的任務。
  • JAVA JDK

    前面我們已經安裝了 java JDK 若未安裝請前往上方查看安裝步驟

  • Jenkins安裝

    • 安裝方式

      1. Jenkins官網地址:jenkins-ci.org/ 下載最新的war包雙擊安裝

      2. 使用brew安裝

        // 使用brew安裝
        brew install jenkins
        // 安裝完成后啟動,直接運行jenkins即可啟動服務
        jenkins
        
  • 初始化jenkins

    默認訪問http://localhost:8080/, 可進入jenkins配置頁面。 不要關閉終端否則jenkins會停掉

    第一次運行的時候會出現以下界面


    image

    根據提示的路徑去 將密碼輸入進去 然后點擊 Continue

    會進入:

    image

    選擇第一個就可以了

![image](https://upload-images.jianshu.io/upload_images/3255421-8c239746c4b06f0c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

等待安裝完成

![image](https://upload-images.jianshu.io/upload_images/3255421-69d270117dae8cf3?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

自己設置賬戶密碼

  • jenkins配置

    在主頁選擇 manage Jenkins --> Manage Plugins 去下載插件


    image

    image

    在這個選項中下載需要的插件,一些基本插件在安裝jenkins的時候都已經下好了,現在只需要下載需要的就可以了


    image
    GitLab    
    Xcode integration    // 這個其實可以不用
    Keychains and Provisioning Profiles Management // 配置文件管理
    /// 上面這三個 如果需要在jenkins中打包 證書添加需要導入
    
    Upload to pgyer // 上傳蒲公英
    Build Name and Description Setter  // 設置打好包的名字
    description setter   // 設置圖片
    

    插件安裝好了之后,開始創建項目

  • 創建項目

    回到主頁點擊新建Item

    image

    選擇: 自由風格的項目
    image

    General --> Discard old builds 構建的天數的保持最大的個數。
    image

    General --> This project is parameterized --> 添加參數 --> Choice Parameter

    這個就是 你在構建的時候可以先擇 構建環境和分支,(按需添加!)


    image
    名稱: BUILD_TYPE
    選項: debug
          release
    描述: 打包環境
    ----------------------------------------------
    名稱: GIT_BRANCH
    選項: develop
          master        
          3.1.0
          3.0.0
          2.9.1
          2.9.0
    描述: 拉取代碼的 git分支
    

    源碼管理 --> Git

    使用Git管理源碼 我這里用的是gitlab 的SSH方式管理


    image
    */${GIT_BRANCH}
    

    git管理就是為了讓jenkins知道我們的源碼在哪里
    在第一次構建的時候他回去拉取代碼放到.jenkins的workspace中進行管理

    填寫完項目地址,我們點擊添加按鈕。(branch Specifier 不要忘記修改 這里上面設置的選擇參數,拉取代碼的分支)
    點擊添加按鈕

    image

    密鑰獲取: 首先我們要保證 在git中配置了自己的秘鑰。配置方法 --> Mac 配置ssh秘鑰

    • 類型SSH

    • userName 就是git中的名字 能知道是誰上傳下載的就可以

    • PrivateKey ssh中的私鑰,/Users/用戶名/.ssh/id_rsa

    • Passphrase git密碼。

    • 點擊添加 既可以了。

    如果你的項目很大,需要的clone時間較長的話,需要設置一下超時時間.
    jenkins默認的超時時間是10分鐘,根據自己項目設置時間,

    這里有一個[git clone 太慢解決方案](git clone 太慢)。


    image

    image

    構建環境 --> Set build Name 設置打出來的包的展示名字 ,如果沒有添加插件 是沒有這個選項的


    image
    iOS_XXX_${GIT_BRANCH}_${BUILD_TYPE}_build(${BUILD_NUMBER})
    

    構建 --> 增加構建步驟 --> Execute shell


    image

    image
        cd /Users/你的項目目錄
        
        fastlane topgyer_debug desc:測試版_Debug
    

    然后 保存退出就可以了

    回到首頁 --> build with paramters --> 選擇環境和分支,開始構建


    image

    image

    第一次構建需要從Git拉去代碼 如果超時了 更改一下 超時時間 上面有介紹

    如果提示 fastlaneCommand not found 點擊此鏈接 [jenkins執行shell腳本時候出現 fastlaneCommand not found解決方案](jenkins執行shell腳本時候出現 fastlaneCommand not found)

    靜候佳音 Jenkins打包操作 搞定了!!!

    打包成功了之后發現 每次還是要點擊去蒲公英的鏈接然后才能下載

    經研究了一下怎么直接把蒲公英的鏈接放在構建挖成之后

    如: 醬事兒~


    image

生成蒲公英二維碼

最開始我使用的是 fastlane 上傳蒲公英的操作,但是想要拿到二維碼不是很容易

最后想到了直接讓 jenkins哪去fastlane打的包然后上傳蒲公英就好了,然后成功了!

下面介紹一下操作步驟

  1. 上傳蒲公英

    還是進入到我們當前項目的配置里面去 --> 到最后的構建后操作 --> 增加構建后操作步驟


    image

    image
    pgyer api_key : 你的蒲公英api_key
    
    // 這個位置自己決定就好了,和fastfile文件中的ipa_output_upload_directory地址    是一樣就行
    Scandir: 打的api包的地址    
    
    file wildcard:  包名字.ipa
    
    注意你需要 吧 fastlane中的fastfile文件中
        ######  這句話的注釋打開   #####
        FileUtils.cp_r("#{$ipa_output_directory}" + "/#{outputName}",     "#{$ipa_output_upload_directory}" +  "/#{$jenkins_name}.ipa")
        這個是講打出來的包拷貝一份到     workspace中,保證ipa文件夾的包只有一個最新的。這個包用于上傳蒲公英
        
    
    
  1. 獲取二維碼操作:

    構建后操作 --> 增加構建后操作步驟 -->Set build description


    image
    直接拷貝
    
    <a href="${appBuildURL}"><img src="${appQRCodeURL}" width="118" height="118"/></a>
    
    從上傳蒲公英的信息中獲取圖片
    
  1. 最后一步
    回到首頁 --> manager Jenkins --> Configure Floable Security


    image

    標記格式器設置為 Safe HTML

    OK!! 大功告成!!!去首頁去 構建吧! !!

結束語

介紹了一下 fastlane 和 Jenkins 的結合使用的過程。比較流水線,如果哪里不對 還望各位指出,

然后我們拿到自己電腦的ip http://電腦ip:8080/ 交給測試就好了 要包自己去點構建把,

建議使用網線,這樣ip不容易變。

之前也研究過 全部使用Jenkins實現打包上傳等過程, 但是jenkins需要配置的東西真的很多,證書、xcode、一系列操作,配置錯誤就會失敗 而且還不容易找出問題,所以選擇了fastlane進行打包上傳蒲公英,之后為了獲取到二維碼直接使用選擇了 jenkins上傳蒲公英。

暫時的解決方法 如果有更好的方法 希望大家多多指出,我也會繼續研究更好的方法。

感謝!

后期遇到的問題

1. Pod 出現錯誤

如果你在輸入pod命令的時候出現以下錯誤

 /Library/Ruby/Site/2.3.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem cocoapods (>= 0.a) with executable pod (Gem::GemNotFoundException)
   from /Library/Ruby/Site/2.3.0/rubygems.rb:308:in `activate_bin_path'
   from /usr/local/bin/pod:23:in `<main>'
  • 原因1:

    • ruby版本問題導致,請先升級ruby到最新版本
  • 原因2:

    • 如果確定了都沒有問題 那么執行一下命令

      gem install cocoapods
      
      pod install
      

      之后會發現 pod 已經可以正常使用了

2. git clone 太慢

查找域名所對應的ip 地址,并修改host文件

  1. 獲取 github/gitlab.global.ssl.fastly.Net的ip地址

    nslookup github.global.ssl.fastly.Net
    
    image
  2. 獲取github.com 的ip地址

    nslookup github.com 
    
    image
  3. 在etc/hosts 文件中添加

    151.101.76.249 github.global.ssl.fastly.net
    192.30.253.112 github.com
    
  4. 強制更新DNS緩存

    • windows

      ipconfig /flushdns
      
  • linux

    sudo /etc/init.d/networking restart
    
  • mac

    sudo killall -HUP mDNSResponder
    

3. jenkins執行shell腳本時候出現 fastlaneCommand not found

在安裝完fastkane之后執行 fastlane xxx desc:xxx 可以成功打包執行 在jenkins中的shell腳本無法執行出現以下錯誤

16:20:30 xxx/xxx/xxx/xxx.sh: line 4: fastlane: command not found
16:20:30 Build step 'Execute shell' marked build as failure
16:20:30 New run name is 'iOS_xxx_develop_debug_build(17)'
16:20:30 [UPLOAD TO PGYER] - The build FAILURE, so the file was not uploaded.
16:20:30 [description-setter] Description set: 
16:20:30 Finished: FAILURE

解決方法:

在jenkins的shell腳本命令前添加 #!/bin/bash -ilex命令 eg:

#!/bin/bash -ilex
cd /Users/xxxx/xxxx       # 你的項目地址
fastlane topgyer_debug desc:測試版_Debug
**再去執行構建就可以了。 **

參考:

https://jenkins.io/zh/

https://fastlane.tools/

http://www.lxweimin.com/p/656756920430

http://www.lxweimin.com/p/c44ef74d99f9

https://juejin.im/post/5d312f6af265da1bb67a51d4#heading-10

再次感謝!!

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

推薦閱讀更多精彩內容