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

前言


 

      這兩天花時間整理一下自動化打包的整套流程,現在iOS端的整套流程是沒有問題了,這個過程中踩得坑也的確是特別多,所以這周末把整個流程整理一下,總結出來這篇文章,希望能對有需要的小夥伴有點點幫助。

      下面我們先介紹一下:

       1、Jenkins:借用一句官方介紹 Jenkins是一個開源軟體項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平台,使軟體的持續集成變成可能。這句話我們能提煉出的重點就是 Java,相信大家電腦都有裝Java環境。這個我們就不在累贅了。具體的Jenkins的安裝方式我們下面再介紹。

       2、Fastlane:照例我們找官方介紹,它是用Ruby語言編寫的一套自動化工具集和框架,每一個工具實際都對應一個Ruby腳本,用來執行某一個特定的任務,而Fastlane核心框架則允許使用者通過類似配置文件的形式,將不同的工具有機而靈活的結合在一起,從而形成一個個完整的自動化流程。這句話的重點就是Ruby語言,要是在編寫修改腳本的過程中遇到什麼問了(後面的確有一個問題把我困擾住了)我們可以至少查一下該怎麼寫。她的安裝我們也是放下後面一起說。

      3、Gitlab 可能基本上公司內部的程式碼倉庫都是在Gitlab上吧,當然可能也不是,反正這就是你程式碼的遠程倉庫,大家也都理解。

      4、蒲公英 + 釘釘 這個可能大家在用,也可能沒用。具體的按你們的實際情況。當讓蒲公英這個也是可以被替代的,甚至可以是自己的平台,通知到的也不一定非得是釘釘,也可能是微信或者手機簡訊等等,具體的按照實際需求去定去探索。

 

安裝


 

      1、Jenkins安裝

      首先我這裡採用的事Homebrew的安裝方式,因為在換了M1之後,在Cocoapods安裝上遇到許多問題,在Flutter環境安裝上也是,所以我是之前就整好了Homebrew的環境的,當然這個要有問題的話,也需要大家先自己去安裝好Homebrew的環境,或者也可以採用下面第二種方式去安裝:

      第一種方式:Homebrew  參考官網:macOS Installers for Jenkins LTS  安裝之前執行命令檢查自己的Homebrew環境: brew doctor  有問題就按檢查中給的提示解決,注意,多仔細看看爆出的問題,根據問題去尋找答案。

      上面👆🏻給的官網把它主要的一些使用命令也都告訴我們了,總結如下:

      基本上就是傻瓜式安裝,沒有別的問題了,一路上Enter。接著就是啟動Jenkins了,在一些情況下它的啟動可能會有問題,我自己在安裝的過程中是這樣的,但我自己是由於鏈接了開了VPN的WIFI造成的,切換了網路就沒問題了,要有這個問題試著重啟Jenkins試試。下面是我們進去後的頁面,讓我們輸入管理員密碼,密碼所在的具體路徑紅色標出來了,我們直接前往文件夾去查看複製填入。這個後面我們在說基本配置的時候再說。

      之後執行 brew services start jenkins-lts 命令啟動Jenkins。正常啟動會有Success提示,要重複執行啟動就會像下面這樣提示:

 

 

      啟動之後在我們瀏覽器輸入以下網址訪問Jenkins。

      第二種安裝方式:

      在蒲公英上有這樣一篇文檔:使用 Jenkins 實現持續集成 (iOS) 說是推薦我們的安裝方式,不然後面腳本執行可能會遇到問題,但也看具體情況吧,我自己是沒有使用這種方式安裝,主要是嫌麻煩。

      首先下載 .war文件,這個就在官網下載 下載連接 位置如下:

 

      之後在我們下載的文件所在目錄下執行腳本: java-jarjenkins.war --httpPort=8080

      等Jenkins啟動之後,在瀏覽器打開: //localhost:8080

      後續的問題就參考前面我們提到的進行就可以了,然后里面具體的配置我們下面再說。

 

      2、Fastlane的安裝

      它的安裝也是有多種方式的,有Homebrew和gem的方式等等,我們在這就說兩種方式:

      Homebrew安裝:brew install fastlane

      gem安裝:sudo  gem install fastlane

      (加入在安裝的過程中遇到問題需要卸載命令如下:Homebrew: brew uninstall fastlane  ,  gme :  sudo gem uninstall fastlane )

      執行完任務之後,我們通過 fastlane –version 查看是否安裝成功:

 

 

       Fastlane的安裝過程中要是遇到什麼問題,大家可以具體問題具體分析,也可以主頁Q找我。

       NOTE: 還有一項需要我們注意,不過基本上iOS開發者都有裝Xcode命令,也可以通過下面的命令檢查一下:xcode-select --install

 

 

       通過上面的安裝,基本上我們自動化打包鎖需要的工具就都安裝好了,重點還是下面我們的配置和腳本部分。

 

Jenkins基本配置 


     

      Jenkins啟動需要管理員密碼,這個密碼的具體位置就是截圖紅色路徑,我們前往文件夾直接找到它,粘貼複製就可以。

       在Jenkins中每一個任務吧都是一個item。所以我們需要新建一個管理我們打包任務的item,名稱這個自定義,類型我們選擇第一種類型的:

 

      在創建完這個item之後,我們就是針對這個item開始一些配置資訊,當然配置中的一些參數是需要我們進入外層的Manager Jenkins進行配置的,這個在下面具體遇到時候我們再說。

      由於我們打包的程式碼是在git上面拉取的,所以我們需要配置的第一步的資訊就是Git的資訊。具體的我們進入新建的item。點擊 Configure 配置,進來之後我們找到 Source code Management 進行配置

 

 

       NOTE: 加入你進來之後在這裡沒有看到Git選項,那就是我們的Jenkins還沒有安裝git插件導致到,我們就需要安裝git插件:前面說過就在 Manager Jenkins  找到 manager plugins 安裝我們需要的插件,選Avaliable進行安裝。所有的插件都是在這裡搜索安裝,後續我們還有別的安裝的時候就不在提了,大家自己安裝就好。

 

 

      git的帳號和密碼建議是配置在自己項目的.gitconfig文件當中,這樣也方便我們在使用別的git客戶端的時候方便操作,具體的添加的就不說了。這個網上資料很多的。配置完這個之後我們還有一個選擇環境或者選擇打包分支的參數可以配置一下,這樣我們在打包的時候就可以針對不同的環境和分支進行打包,具體的效果就是你點擊了build with parameters 之後是下面這樣(由於我不需要針對不同的環境打包,所以環境我沒有配置)

 

      那配置的話也是和我們git的配置一樣,進入item的 configure,找到 剩下的就不多說了,添加時候需要注意我標出來了。

 

  

       環境參數也是類型的。選擇一個 Choose parameter ,按照下面的樣式填寫就可以,後續我們就可以根據你填入的name(例如:Environments)進行一些判斷,比如腳本執行時候就會判斷假如你選擇的 Environments == 測試環境 執行後續邏輯等等,知道這個流程就可以了。腳本中的判斷寫法後續再說。

      打包環境參數的填寫(有需要的話可以配置):

 

      這樣我們就配置完了最基礎也基本上是必須的一些資訊,在後續執行的過程中要遇到什麼問題,我們在最後進行一個總結。

   

Fastlane初始化  


 

      前面我們說了關於Jenkins的配置,接下來就是關於fastlane的初始化,我們在項目路徑(項目.xcworkspace文件所在的層級)下執行下面命令:

      fastlane init

      執行完之後基本上也是一路enter,到下面這裡的時候需要我們留意下:

      根據以上的翻譯對比理解,我們選擇第四項。接著往下執行,成功之後我們會在項目中看到多了一個fastlane的文件,裡面有以下兩個文件。

      
 
 
      在Appfile文件中,我們按照要求填入下面內容:
      

# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app  項目bundleId
# apple_id("[[APPLE_ID]]")             # Your Apple email address  開發者帳號郵箱


# For more information about the Appfile, see:
# //docs.fastlane.tools/advanced/#appfile

      

     接著就是我們的Fastfile文件了,它裡面的具體內容我們在腳本部分會說,以上就是fastlane的初始化了,我們接著看腳本內容。

     添加蒲公英插件:執行命令 fastlane add_plugin  pgyer

     

     以上就是添加成功了,這個執行這句命令的位置我是遇到了問題了的,具體的後面總結可能遇到的問題中會說,這裡執行這句命令的時候建議也是在我們項目路徑下執行

 

釘釘群機器人配置


 

     我們需要把我們打包成功的消息發送到釘釘群的時候就需要配置一個機器人,具體的配置如下:

     第一步:釘釘群設置 -> 智慧群助手

      第二步:選擇自定義機器人,這有這個是可以通過Webhook的方式接入的。

       第三步:這裡最重要的就是這個安全設置-自定義關鍵詞,在我們通過機器人發送消息的時候一定要帶有包含在自定義關鍵詞中的詞語,不然消息是發送不過去的,這點要切記!我自己寫的是App,然後在腳本中可以看到,我是帶了App這個關鍵詞的,下一步之後就會有一個 Webhook地址,我們在腳本中就是用過該地址向釘釘發送提醒消息的。

 

 

腳本       


     

      關於腳本的執行邏輯,在我處理的過程中大概得邏輯是通過Jenkins去調用項目中的Fastlane.sh腳本,再去調用Fastlane中的打包以及相應消息通知等,最先第一步,一下是我們在Jenkins中調用執行的腳本內容:

      在Jenkins我們配置的item中我們配置腳本,在build中添加Execute shell,如下所示:

 

 

       具體的內容,方便粘貼:

#進入項目路徑執行腳本進行打包
cd 你的項目路徑
#執行Fastfile.sh腳本
sh ./fastlane/Fastfile.sh

#獲取Git的更新文案
MSG=`git log -1 --pretty=%B`
#釘釘發送通知消息 把我們的git文案傳遞到腳本函數中去
fastlane dingdingTalk message:${MSG}

      第二步就是執行我們項目中的Fastfile.sh腳本,這個腳本也是為了解決一些問題才加入的,具體的問題我們下面總結的時候會說,這個腳本sh文件需要我們新建一下,具體的位置就是在我們項目的fastlane文件中。腳本具體內容如下:

#解決ArgumentError - invalid byte sequence in US-ASCII錯誤
#修改終端語言、地區等國際化環境變數

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export PATH=$PATH:/usr/local/bin

# fastlane profile
bundle exec fastlane debug

      第三步就是我們前面說的Fastfile文件內容如下,腳本中****表示的內容是需要我們自己去替換的內容,蒲公英的api_key和user_key就需要去蒲公英看看,腳本裡面家了注釋了,方便我們搞懂每一行的具體意思是什麼,也方便我們後續有問題進行排查。

# This file contains the fastlane.tools configuration
# You can find the documentation at //docs.fastlane.tools
#
# For a list of all available actions, check out
#
# //docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# //docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:ios)

platform :ios do

  desc "利用Fastland實現自動化打包"
  # fastlane debug 命令打包 這樣容易理解
  lane :debug do

    build_app(

      # 每次打包之前clean一下
      clean: true,
      # 打包出ipa文件路徑
      output_directory: './fastlane/build',
      # 打包的名稱
      output_name: 'Shopmoods.ipa',
      # 項目的scheme
      scheme: 'Shopmoods',
      # 默認Release,Release or Debug
      configuration: 'Debug',
      # 是否包含bitcode 根據自己項目的實際情況到buildsetting查看
      include_bitcode:true,
      # 是否包含symbols
      include_symbols: true,
      # 打包導出方式,包含app-store, validation, ad-hoc, package, enterprise, development, developer-id and mac-application
      # 我們這裡是上傳蒲公英 所以就選擇ad-hoc
      export_method: 'ad-hoc',
      # 這個設置是為了設置xcode自動配置證書和配置文件,當然也可以手動配置
      export_xcargs: '-allowProvisioningUpdates'
    )
    # mac上的通知彈窗,通知打包完畢
    notification(app_icon: './fastlane/icon.png', title: 'manager', subtitle: '打包成功,已導出安裝包', message: '準備上傳中……')
    # 上傳IPA到蒲公英
    pgyer(api_key: "****", user_key: "****")

  end

 
  desc "釘釘群消息通知"
  lane :dingdingTalk do |options|

    msg = options[:message]
    curl = %Q{
      curl '//oapi.dingtalk.com/robot/send?access_token=****' \
      -H 'Content-Type:application/json' \
      -d '{
        "msgtype":"markdown",
        "markdown":{
          "title":"Shopmoods蒲公英更新通知",
          "text":"#### 🚀 Shopmoods-iOS-商城App更新成功(0.0.1)\n 更新說明:#{msg} \n###### 掃碼安裝↓↓↓\n![screenshot](//www.pgyer.com/app/qrcode/****)"
        },
        "at":{
          "isAtAll": true
        }
      }'
    }
    system curl
  end
end

      以上的腳本中有關於pgyer這個插件,這個插件是fastlane中專門用於上傳IPA到蒲公英開發的,它的初始化以及添加註意事項我們前面有說。

 

可能遇到的問題


 
      一、fastlane : command not found
 
   

     在我們保證我們安裝的fastlane沒有問題的基礎上要是出現這種問題,我們fastlane init執行位置也對,那就一般是由於 jenkins 沒有設置正確的 $PATH 環境變數導致的。正確設置的方法為:

      1、在命令行下執行 echo $PATH,記錄下輸出的結果
      2、在 jenkins 中 Manager Jsnkins – Configure system – Environment variables
      3、在 key 中填寫 PATH,在 value 中填寫第一步中輸出的結果
      4、保存即可。
 
     二:fastlane requires your locale to be set to UTF-8
     這個需要我們在 Manager Jsnkins – Configure system – Global properties 裡面添加以下配置:
     
     LANG     en_US.UTF-8
     LC_ALL  en_US.UTF-8  
 

      三:ArgumentError – invalid byte sequence in US-ASCII

      這個錯誤的解決辦法就是我們前面提到的創建 Faselane.sh腳本,添加以下內容,執行完這個腳本之後通過 bundle exec fastlane debug 就繼續執行我們Fasefile中的內容了,這個希望能理解。

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export PATH=$PATH:/usr/local/bin

      四:pgyer not found

      我在打包的過程中就有遇到pgyer這個插件找不到的問題,我網上搜了下基本都是說我們添加時候位置錯了,按我的理解我以為不可能,但其實在實際引用中似乎的確有關係,我也是在fastlane初始化的文件層級下添加了插件之後解決了這個問題,所以要遇見這個問題,還是留意下自己是在哪個文件下執行的添加這個腳本的命令

    

結果

 
     經過以上處理,我們的自動化打包是走通了的。
 
   
 
   
     以上可以看到,我們的整個流程是執行完了的,耗時也都有統計出來,當然要是那一步出問題我們也可以相應的查看,最後要是小夥伴在過程中遇到什麼問題可以在主頁找我Q溝通。