iOS使用Jenkins自動打包+上傳到 fir+釘釘通知

摘要

本文介紹的 iOS 自動打包功能使用 Jenkins 的操作頁面,配置 Shell 腳本,調用 Fastlane 提供的打包命令,將打包生成的 .ipa 文件上傳到 fir 平臺,生成安裝包的二維碼,然后將打包的自定義信息和二維碼鏈接發送到釘釘群組中(釘釘開放文檔)。用戶接到通知后即可掃碼安裝 App。
整個流程需要安裝 Java 軟件、jenkins.war、fastlane、fir 插件,然后配置 Jenkins。在文中將逐一介紹。

安裝 Java 軟件

使用 Jenkins 首先需要使用 java 安裝 jenkins.war 文件,Java 的安裝包版本需要在 jdk11.0~jdk17.0之間。


Java 的安裝包版本要求.jpg

在終端中輸入 java -version 可查看當前的 java 版本。若版本在jdk11.0~jdk17.0之間,則無需再安裝 Java 軟件。否則,需要先卸載舊 Java 版本。卸載舊 Java 版本方法,可在終端中粘貼以下命令:

sudo rm -fr ~/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -fr ~/Library/PreferencesPanes/JavaControlPanel.prefPane
sudo rm -fr ~/Library/Application\ Support/Oracle/Java
sudo rm -rf ~/Library/Java/JavaVirtualMachines/*

Mac 安裝 Java 軟件分為 x86 版本和 arm 版本。在 Mac-關于本機-概覽-處理器 中,若處理器為 Intel 版本,則安裝 x86 版本,否則安裝 arm 版本。可在 Oracle 官網下載:jdk17-mac
也可以從百度云盤中下載:
x86 版本 jdk17-mac
arm 版本 jdk17-mac
雙擊安裝包,按提示安裝即可。

安裝 Jenkins

Jenkins 可以使用 jenkins.war 安裝,也可以使用 homebrew 安裝:

使用 jenkins.war 安裝
在官網下載: jenkins.war 。 也可以在 Github 倉庫 JenkinsAutoArchive 里下載 jenkins.war。

使用 homebrew 安裝
Mac 若未安裝 HomeBrew ,需先 安裝 HomeBrew, 然后執行命令:
brew install jenkins‐lts

啟動 jenkins 服務

使用 Jenkins 打包,首先要啟動 Jenkins 服務。啟動服務有兩種方式:

使用 jenkins.war 的方式
使用終端定位在 jenkins.war 所在的目錄下,然后執行命令: java -jar jenkins.war // 使用默認端口 8080。或者執行命令: java -jar jenkins.war --httpPort=8888 //指定端口 8888
通過上面的命令,即可啟動 Jenkins 服務,Jenkins 使用期間,不要終止此服務。終止了的話,可以重新使用該命令啟動服務。

使用 homebrew 的方式
使用終端執行命令:brew services start jenkins-lts 即可。

brew services 還有其他支持的命令:
重啟jenkins: brew services restart jenkins-lts
更新jenkins版本: brew upgrade jenkins-lts
停止jenkins: brew services stop jenkins-lts

安裝 Fastlane

首先確保已經安裝了 Xcode 或者 Xcode命令行工具:xcode-select --install
安裝 fastlane 可使用兩種方式:

使用 ruby 安裝
ruby 的版本最好 >= 3.0.0 。使用 ruby -v 可以查看 ruby 的版本。在終端中輸入命令:sudo gem install fastlane 即可安裝 fastlane。

使用 homebrew 安裝
可在終端中輸入命令:brew install fastlane
安裝完成后,使用終端定位到 iOS 項目的目錄下, 例如: cd ~/projectName/ 。然后輸入命令:fastlane init 。此命令會在項目目錄下生成一個 fastlane 文件夾,文件夾內的 Fastfile 文件用于打包配置。

Fastfile

fastlane 整個文件夾可在 JenkinsAutoArchive 中下載。
fastlane 內各文件描述:

  • Appfile:用于存儲應用程序標識符和 Apple ID 等信息
  • Fastfile:配置管理 lane,打包主要是配置這個文件

安裝 fir 插件

安裝完 fastlane 后,就可以安裝 fir 插件了。在終端中輸入命令: fastlane add_plugin fir_cli 即可。

初始化 Jenkins

Jenkins 服務啟動后,在瀏覽器頁面輸入以下地址:
http://localhost:8080 //端口指定的多少寫多少
第一次運行會出現如下界面,提示需要填寫指定路徑文件里面的內容(該內容也可以在終端上面看到)。

unlock jenkins

根據提示目錄打開initialAdminPassword文件,復制出密碼,填寫,Continue。
然后選擇"安裝推薦的插件":


安裝插件

等待插件安裝完成:


等待安裝完成

安裝完成后,輸入自己的信息后,點擊保存:
admin

保存好填寫的信息后,即可看到 Jenkins 的首頁:
首頁

配置 Jenkins

配置 Jenkins 憑據

在 Jenkins-系統管理-Credentials-Global credentials (unrestricted),點擊“Add Credentials”,如下圖所示,我們填寫自己的 SSH 信息,然后點擊“Save”,這樣就把 SSH 添加到 Jenkins 的全局域中去了。


添加憑據.jpg
  • 類型選擇:SSH Usename with private key
  • 范圍:全局(Jenkin, nodes, items, all child items, etc)
  • userName:git中的名字
  • PrivateKey:ssh中的私鑰,使用 open ~/.ssh/id_rsa 命令打開文件,全選并復制粘貼到此處。
  • Passphrase:git密碼。

添加獲取提交日志的插件

打包日志中為了獲取代碼提交記錄,可以通過第三方插件來獲取,先下載 changelog-environment.hpi 文件。然后在 系統管理-插件管理-高級 頁面:

插件管理

點擊“選擇文件”,選擇剛下載的 changelog-environment.hpi 文件,然后點擊 “Deploy” 上傳插件。
在????下面的 構建環境 處即可勾選上插件使用了。

創建任務

在 Jenkins 首頁,點擊創建任務,頁面如下:


創建任務

填入任務名,選擇“構建一個自由風格的軟件項目”,點擊“確定”后進入配置任務頁面:

配置 general

general

配置 源碼管理

源碼管理

  • Repository URL:項目倉庫鏈接
  • Credentials:選擇 配置 Jenkins 憑據 步驟中的憑據
  • 指定分支:輸入想要打包的分支名,例如 origin/xxx

配置 構建環境

構建環境

  1. 勾選上“Add timestamps to the Console Output”
  2. 勾選上“Add Changelog Information to Environment”,這是 changelog-environment.hpi 插件提供的獲取提交日志的功能。然后在 Entry Format 中輸入 - %3$s (%4$s %1$s)\n,在 Date Format 中輸入yyyy-MM-dd HH:mm:ss

配置 Build steps
輸入自定義的打包腳本

Build steps

腳本如下:

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd ~/projectName
# 要打包的分支名
lastName="${GIT_BRANCH##*/}"
# 當前倉庫的分支名
currentBranch="$(git rev-parse --abbrev-ref HEAD)"
echo "currentBranch=$currentBranch, lastName=$lastName"
# 如果要打包的分支和當前分支不一致,則暫存當前分支的改動內容,然后切換分支到要打包的分支
if [ "$currentBranch" != "$lastName" ]; then
    time=$(date "+%Y-%m-%d %H:%M:%S")
    git stash -u -m "$BRANCH_NAME $time"
    git checkout $lastName
fi

git pull
pod install 
# 更新插件。fir_cli 插件不及時更新的話,可能會導致無法上傳應用文件。
# sudo 是以管理員身份執行命令,在<< EOF與EOF之間輸入你的開機密碼
sudo -S bundle exec fastlane update_plugins << EOF
    
EOF
# 安裝 fir 插件。sudo 是以管理員身份執行命令,在<< EOF與EOF之間輸入你的開機密碼
sudo -S fastlane add_plugin fir_cli << EOF
    
EOF
echo "fastlane Project_Debug: BRANCH_NAME = $GIT_BRANCH, jobName = $JOB_NAME"
# SCM_CHANGELOG 是插件 changelog-environment.hpi 提供的獲取提交日志的環境變量
bundle exec fastlane project_Release branchName:$GIT_BRANCH jobName:$JOB_NAME changeLog:"$SCM_CHANGELOG"

執行腳本中的 pod install 命令,需要先配置一下 Jenkins 的環境變量,否則會報錯。配置環境變量步驟:

  1. 系統管理-系統配置-全局屬性 中勾選上環境變量。
  2. 在終端中輸入 echo $PATH,終端會打印出一串字符串,幾個路徑,復制該路徑,返回到Jenkins中。
  3. 鍵默認填寫 PATH,值填寫從終端復制的那個字符串,點擊保存,完成,構建該項目。
    環境變量

配置 fastlane 打包腳本
腳本中的 bundle exec fastlane Project_Debug branchName:$GIT_BRANCH jobName:$JOB_NAME changeLog:"$SCM_CHANGELOG" 命令,其中 Project_Debug 是在工程項目目錄下的 fastlane/Fastfile 文件中自定義的打包方法。
GIT_BRANCH 、JOB_NAME 是 Jenkins 提供的環境變量,分別代表分支名和 Jenkins 任務名。SCM_CHANGELOG 是插件changelog-environment.hpi 提供的獲取提交日志的環境變量。

配置 郵件通知
郵件通知可不配置,如需配置,可參考 Jenkins 踩坑(三)| Email 配置與任務郵件發送

保存配置

應用

點擊 應用 即可。

復制任務

jenkins 每新建一個任務,并不需要重新配置一次,可以通過復制任務的方式,來快速新建任務。


復制任務

如上圖,在復制欄輸入希望復制的,已經存在的任務名,點擊確定。然后在新創建好的任務中,修改配置即可。

fastlane 打包腳本介紹

fastlane actions

fastlane 支持許多 action,在終端輸入命令:fastlane actions 或者在 官網 actions 查看。
簡單介紹幾個 action:

  • get_version_number : 獲取工程的版本號
  • get_build_number : 獲取工程的 build 號
  • increment_build_number : 自動增加 build 號
  • gym : iOS app打包簽名自動化工具
  • fir_cli : fir 插件的 action,可以使用 fir 的功能,上傳 ipa 文件,支持掃碼安裝

fastlane action gym

iOS 打包使用 fastlane action 中的 gym 命令,在終端輸入命令:fastlane action gym 或者在 官網 gym 查看。如下:

gym parameters

fastlane action fir_cli

fir 官方維護的插件提供的 action: fir_cli 命令,在終端輸入命令:fastlane action fir_cli 或者在 github fir_cli 查看。如下:

fir_cli

fastlane action fir_cli api_token:"xxxxxxxxxxx" 傳入 api_token 即可將 ipa 文件上傳到 fir。api_token 獲取方法:首先在 fir 登錄,然后按下圖點擊 API token,即可獲取。
api_token

釘釘智能群助手

釘釘群支持自定義機器人接入。在釘釘群設置頁點擊 智能群助手

釘釘群設置

在機器人管理頁面復制 Webhook 鏈接,給群發消息需要這個鏈接。
機器人管理

根據 釘釘開放文檔 的介紹,自定義機器人支持文本 (text)、鏈接 (link)、markdown(markdown)、ActionCard、FeedCard消息類型。

Fastfile 中的 Project_Debug 為例,lane 配置如下:

default_platform(:ios)

platform :ios do
  desc "iOS 自動打包"

  lane :Project_Debug do |options|

    scheme_name = "Project"
    # 輸出文件放在工程目錄下的 debug 文件夾下,沒有 debug 文件夾的話,需要手動創建一下。
    output_directory = "./debug/"

    #increment_build_number

    #version = get_version_number(xcodeproj: "Project.xcodeproj", target: "#{scheme_name}")

    buildNumber = get_build_number

    output_name = "#{scheme_name}_#{buildNumber}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"

    gym(scheme: scheme_name,
            workspace: "Project.xcworkspace",
            include_bitcode: false,
            configuration: "Debug",
        include_symbols: true,
        export_method: "development",
        output_directory: output_directory,
        build_path: output_directory,
        archive_path: output_directory,
        output_name: output_name)
    branchName = options[:branchName]
    jobName = options[:jobName]
    changeLog = options[:changeLog]
    answer = fir_cli api_token:"xxxxxxxxxxx", need_release_id: true
 
    puts "上傳后的結果:#{answer}"
    # fir 安裝包鏈接需要手動拼接一下。hey.appc01.com 可能會改變,如果無法使用,則需要根據 fir 的實際鏈接修改。
    download_url = "https://hey.appc01.com/#{answer[:short]}?release_id=#{answer[:release_id]}"

    dingdingMsg = "打包結果通知:Jenkins 打包成功。Debug 開發包。\n branchName:#{branchName}\n jobName:#{jobName}\n 下載二維碼鏈接:#{download_url} \n 修改日志:#{changeLog} \n"
    puts "打包結束時,輸出文案:#{dingdingMsg}"

    #fir_cli api_token:"xxxxxx", dingtalk_at_all: true, #dingtalk_access_token:"xxxxxxx", #dingtalk_custom_message: dingdingMsg
    
    dingTalk_url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx"

    # 構造消息格式
    text = {
      "at": {
        "isAtAll": true
      },
      "text": {
          "content": "#{dingdingMsg}"
      }, 
      "msgtype": "text"
    }

    puts "發送的釘釘消息:#{text} "

    uri = URI.parse(dingTalk_url)
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true

    request = Net::HTTP::Post.new(uri.request_uri)
    request.add_field('Content-Type', 'application/json')
    request.body = text.to_json

    response = https.request(request)
    puts "------------------------------"
    puts "Response #{response.code} #{response.message}: #{response.body}"
  end
end

參考文章

  1. jenkens構建前執行 pod install
  2. 傻瓜式-iOS自動化分發部署-持續化集成方案【Fastlane+蒲公英+Jenkins】
  3. iOS 持續集成與持續分發(jenkins+fastlane+pgyer)
  4. Jenkins+fastlane打包出現找不到對應scheme的問題(fastlane 配置的 scheme 沒有生效的解決方案)
  5. iOS fastlane 配合蒲公英打包, 并進行釘釘群組通知
  6. jenkins使用Changelog獲取commit記錄
  7. jenkins檢查更新站點時出錯:SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路徑構建失敗:sun.secu
  8. Jenkins 踩坑(三)| Email 配置與任務郵件發送
  9. 如何在 Mac 上卸載 Java?
  10. mac 安裝HomeBrew
  11. shell腳本中填寫密碼
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容