前期準(zhǔn)備
1.ruby環(huán)境
fastlane的安裝需要Ruby2.0版本以上,雖然mac自帶ruby,但是版本可能較低,并且權(quán)限較少,所以推薦使用RVM管理ruby版本。
按照這篇文章安裝就可以了Mac安裝Ruby版本管理控制器
2.Xcode命令行工具
xcode-select --install
如果已經(jīng)安裝會提示如下信息
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
未安裝提示如圖所示

直接點(diǎn)擊安裝就可以了,安裝完成后再次執(zhí)行 xcode-select --install 之后出現(xiàn)已經(jīng)安裝的提示了。
3.Java JDK(jenkins安裝會使用)
可以先查看當(dāng)前安裝的Java版本
java -version
如果未安裝請先前往JDK下載鏈接下載
因為jenkins是用java語言編寫的,所以需要java環(huán)境支持

下載完直接安裝就可以了
4.Python (Python調(diào)用Jenkins API獲取構(gòu)建結(jié)果發(fā)通知需要)
直接上python官網(wǎng)下載
或者通過Homebrew安裝python3
brew install python3
查看python3版本號
python3 --version
查看python3安裝的路徑
which python3
根據(jù)pyhon3安裝的路徑配置 bashrc 或者zprofile(我安裝了iTerm及oh-my-zsh插件)文件
#fastlane
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
# Setting PATH for HOMEBREW
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles #ckbrew
eval $(/usr/local/Homebrew/bin/brew shellenv) #ckbrew
# Setting PATH for JAVA
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.0.4.1.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
# Setting PATH for Python 3.10.8 (brew install python3)
# export PATH=${PATH}:/usr/local/Frameworks/Python.framework/Versions/3.10/bin/python3.10
# alias python="/usr/local/Frameworks/Python.framework/Versions/3.10/bin/python3.10"
# Setting PATH for Python 3.11 (手動下載python3.11的包安裝自動生成的路徑)
# The original version is saved in .zprofile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}"
export PATH
alias python=PATH
終端截圖如下:

fastlane
fastlane是為iOS和Android應(yīng)用程序自動化beta部署和發(fā)布最簡單的方法。??可以處理各種繁瑣任務(wù),例如生成屏幕截圖,處理代碼簽名和發(fā)布應(yīng)用該程序等.fastlane整合了一系列移動端開發(fā)中簽名,編譯,發(fā)布等工具,堪稱打包神器.
fastlane可以單獨(dú)在項目中使用,也可以配合jenkins搭配使用
fastlane安裝的三種方式
1.Homebrew
brew cask install fastlane
2.RubyGems
gem install fastlane -NV
初始化
cd /到自己的項目目錄下
#初始化
fastlane init
#添加fastlane蒲公英插件(初始化完成之后再執(zhí)行下面命令)
#Fastlane 安裝成功之后 執(zhí)行安裝蒲公英的插件
#jenkins上傳蒲公英為了獲取下載二維碼,而采用了jenkins的插件(Upload to pgyer),如果fastlane不單獨(dú)使用,可以忽略fastlane蒲公英插件
fastlane add_plugin pgyer

1.Automate screenshots: 自動截屏
2.Automate beta distribution to TestFlight: 自動發(fā)布beta版本到testFlight
3.Automate App Store distribution: 自動發(fā)布到App Store
4.Manual setup: 手動設(shè)置
這里我們選擇第4個
成功之后,打開我們的項目目錄發(fā)現(xiàn)多了這個文件

配置Fastlane
| 文件名 | 描述 |
|---|---|
| Appfile | 從 Apple Developer Portal 獲取和項目相關(guān)的信息 詳情 |
| Fastfile | 核心文件,存放lane任務(wù) |
| Deliverfile | deliver的配置文件,從 iTunes Connect 獲取和項目相關(guān)的信息詳細(xì) |
| metadata | 同步iTC中的元數(shù)據(jù) |
| screenshots | 同步iTC中的截圖 |
這里給打家推薦一篇配置的文章Fastfile參考配置
下面是我的配置僅供參考,沒有用fastlane上傳蒲公英,因為想要在jenkins里面獲取二維碼暫時的解決辦法使用jenkins上傳蒲公英 如果需要fastlane上傳直接打開的注釋進(jìn)行了
# 導(dǎo)出路徑
$ipa_output_directory = "/Users/xx/xx/fastlaneBuild"
# 上傳蒲公英的包 路徑
$ipa_output_upload_directory = "/Users/xx/.jenkins/workspace/xx/ipa"
# jenkins匹配的包名
$jenkins_name = "項目名"
default_platform(:iOS)
# 應(yīng)用名詞
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")
# 默認(rèn)內(nèi)測打包方式,目前支持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}."
# 為當(dāng)天版本 計算迭代版本號
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
# 非當(dāng)天版本 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上傳蒲公英匹配包內(nèi)容。永遠(yuǎn)只保留一份
# 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
#
# 所有任務(wù)腳本
#
platform :iOS do
#
# *************| 上傳到測試版本到蒲公英_測試包 |*************
#
desc "上傳到測試版本到蒲公英_測試包"
lane :topgyer_debug do|option|
puts "*************| 開始打包.ipa文件... |*************"
# 自動增加build
updateProjectBuildNumber
# 自動生成證書
cert
# 導(dǎo)出名稱
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",
# 包導(dǎo)出的位置
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
# 導(dǎo)出名稱
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",
# 上傳的環(huán)境
export_options: {iCloudContainerEnvironment: 'Production'},
# 指定輸出文件夾
output_directory:"#{$ipa_output_directory}",
)
deliver(
# 選擇跳過圖片和元數(shù)據(jù)上傳,自己去配置
skip_screenshots:true,
skip_metadata:true,
# 上傳完成后提交新版本進(jìn)行審查
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 "*************| 上傳__測試版__到蒲公英??????成功?????? |*************"
# 發(fā)布testflight測試
# pilot
end
end
在自己的項目目錄中執(zhí)行
fastlane topgyer_debug desc:測試
這句話根據(jù)自己的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: --------------------------------------------------------------------------
接下來思考的問題是:
不能還是由我們開發(fā)人員執(zhí)行 腳本任務(wù)來打包上傳蒲公英。
有沒有辦法能夠讓測試人員自己去打包呢? 所以接下來我們要做的就是讓jenkins執(zhí)行我們的fastlane腳本,并且自動生成二維碼展示。測試人員需要測試包的時候開發(fā)人員只需要把代碼上傳到對應(yīng)的分支就好了。
我選擇了一臺專門的機(jī)器作為服務(wù)器 來做這件事情, 畢竟在自己電腦上多少會有點(diǎn)影響的。
Jenkins
Jenkins是一個獨(dú)立的開源軟件項目,是基于Java開發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續(xù)集成變成可能。前身是Hudson是一個可擴(kuò)展的持續(xù)集成引擎。可用于自動化各種任務(wù),如構(gòu)建,測試和部署軟件。Jenkins可以通過本機(jī)系統(tǒng)包Docker安裝,甚至可以通過安裝Java Runtime Environment的任何機(jī)器獨(dú)立運(yùn)行。
主要用于
持續(xù)、自動地構(gòu)建/測試軟件項目,如CruiseControl與DamageControl。
監(jiān)控一些定時執(zhí)行的任務(wù)。
JAVA JDK
前面我們已經(jīng)安裝了 java JDK 若未安裝請前往上方查看安裝步驟
Jenkins安裝
1.Jenkins官網(wǎng)地址:jenkins-ci.org/ 下載最新的war包雙擊安裝
2.使用brew安裝
// 使用brew安裝
brew install jenkins‐lts
// 安裝完成后啟動,直接運(yùn)行jenkins即可啟動服務(wù)
//啟動jenkins:
brew services start jenkins‐lts
//-------以下命令是可能會使用到的相關(guān)命令-----
//重啟jekins
brew services restart jenkins‐lts
//更新jekins版本
brew upgrade jenkins‐lts
//停止jenkins
brew stop jenkins‐lts
初始化jenkins
默認(rèn)訪問http://localhost:8080/, 可進(jìn)入jenkins配置頁面。 不要關(guān)閉終端否則jenkins會停掉
第一次運(yùn)行的時候會出現(xiàn)以下界面

根據(jù)提示的路徑去 將密碼輸入進(jìn)去 然后點(diǎn)擊 Continue

等待推薦的插件安裝完成,自己設(shè)置賬號密碼
jenkins配置
在主頁(Dashboard)選擇 系統(tǒng)管理(manage Jenkins) -->插件管理( Manage Plugins) 去下載插件,本文涉及以下插件
#git參數(shù)配置
Git Parameter Plug-In
#構(gòu)建超時
Build Timeout
#上傳蒲公英
Pgyer App Uploda Plugin
//(https://github.com/jenkinsci/pgyer-app-upload-plugin)
#上傳蒲公英后 生成二維碼展示在jenkins構(gòu)建列表上
description setter plugin
//(https://plugins.jenkins.io/description-setter)
#構(gòu)建結(jié)果發(fā)送郵件通知
Email Extension Plugin
//(https://plugins.jenkins.io/email-ext)
#構(gòu)建后將構(gòu)建狀態(tài)(失敗/成功)發(fā)送到飛書群
Post build task
//(https://plugins.jenkins.io/postbuild-task)
#設(shè)置打包的名字(好像沒有用到)
Build Name and Description Setter
//(https://plugins.jenkins.io/build-name-setter)
創(chuàng)建項目

選擇: 自由風(fēng)格的項目
General --> Discard old builds(丟棄舊的構(gòu)建) 構(gòu)建的天數(shù)的保持最大的個數(shù)。

General --> This project is parameterized(參數(shù)化構(gòu)建過程) --> 添加參數(shù) --> Choice Parameter(添加參數(shù))
這個就是 你在構(gòu)建的時候可以先擇 構(gòu)建環(huán)境和分支,(按需添加?。?/p>

git參數(shù)設(shè)置

名稱: BUILD_TYPE
選項: debug
release
描述: 打包環(huán)境
----------------------------------------------
名稱: GIT_BRANCH
選項: develop
master
描述: 拉取代碼的 git分支
源碼管理 --> Git
使用Git管理源碼 我這里用的是gitlab 的SSH方式管理

#branch Specifier(指定分支)不要忘記修改為上面設(shè)置的選擇參數(shù),拉取代碼的分支;
*/${GIT_BRANCH}
git管理就是為了讓jenkins知道我們的源碼在哪里;在第一次構(gòu)建的時候他會去拉取代碼放到.jenkins的workspace中進(jìn)行管理。
如果你的項目很大,需要的clone時間較長的話,需要設(shè)置一下超時時間.
jenkins默認(rèn)的超時時間是10分鐘,根據(jù)自己項目設(shè)置時間,git clone 太慢解決方案
Additional Behaviours-->高級的克隆行為-->設(shè)置超時時間

構(gòu)建環(huán)境 --> Set build Name 設(shè)置打出來的包的展示名字 ,如果沒有添加插件 是沒有這個選項的

構(gòu)建 --> 增加構(gòu)建步驟 --> Execute shell


#腳本命令如下
cd /Users/你的項目目錄
fastlane topgyer_debug desc:測試版_Debug
添加完shell命令,保存就可以了
回到首頁 --> build with paramters --> 選擇環(huán)境和分支,開始構(gòu)建


第一次構(gòu)建需要從Git拉去代碼,如果超時了,更改一下,超時時間,上面有介紹;
打包成功了之后發(fā)現(xiàn) 每次還是要點(diǎn)擊去蒲公英的鏈接然后才能下載;

生成蒲公英二維碼
最開始我使用的是 fastlane 上傳蒲公英的操作,但是想要拿到二維碼不是很容易;
最后想到了直接讓 jenkins哪去fastlane打的包然后上傳蒲公英就好了,然后成功了!
下面介紹一下操作步驟
1.上傳蒲公英
還是進(jìn)入到我們當(dāng)前項目的配置里面去 --> 到最后的構(gòu)建后操作 --> 增加構(gòu)建后操作步驟


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文件夾的包只有一個最新的。這個包用于上傳蒲公英
2.獲取二維碼
構(gòu)建后操作 --> 增加構(gòu)建后操作步驟 -->Set build description

#從上傳蒲公英的信息中獲取圖片
<a href="${appBuildURL}"><img src="${appQRCodeURL}" width="118" height="118"/></a>
3.最后一步
回到首頁 --> manager Jenkins(系統(tǒng)管理) --> Configure Globle Security(全局安全配置)

標(biāo)記格式器設(shè)置為 Safe HTML
構(gòu)建結(jié)果通知
1.使用python3調(diào)用jenkins API查詢構(gòu)建結(jié)果發(fā)送通知給飛書
添加構(gòu)建后操作步驟-->Post build Task,然后在Script里面填寫命令
#!/bin/bash -il
##python3 發(fā)送構(gòu)建報告到飛書群
echo "py執(zhí)行前======"
python3 /Users/XXX/.jenkins/自定義py腳本目錄/buildResult.py $JOB_URL $JOB_NAME $BUILD_NUMBER
echo "py執(zhí)行后======"

buildResult.py
#!/usr/bin/env python
#!/usr/bin/python
import sys
import json
import requests
import time
job_url = sys.argv[1]
job_name = sys.argv[2]
BUILD_NUMBER = sys.argv[3]
currenttime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#job_status = "成功"
url = '自定義飛書機(jī)器人webhook地址'
method = 'post'
headers = {
'Content-Type': 'application/json'
}
print("======================")
print(sys.argv)
def getJson(job_status):
return {
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": True,
"enable_forward": True
},
"elements": [{
"tag": "div",
"text": {
"content": "項目名稱:" + job_name + "\n構(gòu)建編號:第" + BUILD_NUMBER + "次構(gòu)建\n" + "構(gòu)建狀態(tài):" + job_status +"\n運(yùn)行時間:" + currenttime,
"tag": "lark_md"
}
}, {
"actions": [{
"tag": "button",
"text": {
"content": "查看報告",
"tag": "lark_md"
},
"url": job_url,
"type": "default",
"value": {}
}],
"tag": "action"
}],
"header": {
"title": {
"content": job_name + " 構(gòu)建報告",
"tag": "plain_text"
}
}
}
}
def jenkins_job_status(job_name):
try:
url ="%slastBuild/api/json" %(job_url)
print("----------url----------")
print(url)
#Replace 'your_jenkins_endpoint' with your Jenkins URL
# while True:
data = requests.get(url).json()
print(data)
# if data['building']:
# print("----------building----------")
# print(url)
# #time.sleep(60)
# else:
if data['result'] == "FAILURE":
print("Job status failed")
return False
else:
print("Job status success ")
return True
except Exception as e:
print("Job status Exception")
print(str(e))
return False
if __name__ =="__main__":
if jenkins_job_status(job_name):
print("Put your autmation here for 'job is success' condition")
print(sys.argv)
job_status = getJson("成功")
requests.request(method=method, url=url, headers=headers,json=job_status)
else:
print("Put your autmation here for 'job is failed' condition")
job_status = getJson("失敗")
requests.request(method=method, url=url, headers=headers,json=job_status)
自定義飛書機(jī)器人
飛書群-->點(diǎn)擊群名稱--->群機(jī)器人--->添加機(jī)器人-->自定義機(jī)器人--->填寫機(jī)器人名稱+描述-->添加
不清楚的也可以查看飛書自定義機(jī)器人指南,可以參考以上python代碼

蒲公英添加飛書webhook地址
具體添加方式可參考蒲公英Webhook設(shè)置指南


發(fā)送郵件通知
1.構(gòu)建后操作--->添加構(gòu)建后的操作步驟--->Editable Email Notification

2.設(shè)置接收人對象為:默認(rèn)收件人+自定義收件人(構(gòu)建參數(shù)時傳入)


3.Advanced Settings ---> Triggers ---> Success / Failure 分別設(shè)置對應(yīng)收件人

4.系統(tǒng)設(shè)置-->系統(tǒng)配置-->郵件通知-->參數(shù)設(shè)置
SMTP服務(wù)器/SMTP認(rèn)證/SMTP端口號 等參數(shù)咨詢一下公司運(yùn)維

具體可參考jenkins郵件配置和郵件發(fā)送
局域網(wǎng)設(shè)置
1.修改路徑下的plist文件
/usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist
將上面plist中的httpListenAddress后的ip地址,修改為本機(jī)IP或者0.0.0.0即可
2..配置文件修改完后,重啟Jenkins服務(wù)
brew services restart jenkins‐lts

結(jié)束語
介紹了一下 fastlane 和 Jenkins 的結(jié)合使用的過程。比較流水線,如果哪里不對 還望各位指出,然后我們拿到自己電腦的ip http://電腦ip:8080/ 交給測試就好了 要包自己去點(diǎn)構(gòu)建吧,建議使用網(wǎng)線,這樣ip不容易變。
之前也研究過 全部使用Jenkins實現(xiàn)打包上傳等過程, 但是jenkins需要配置的東西真的很多,證書、xcode、一系列操作,配置錯誤就會失敗 而且還不容易找出問題,所以選擇了fastlane*進(jìn)行打包上傳蒲公英,之后為了獲取到二維碼直接使用選擇了 jenkins上傳蒲公英。
常見問題
1.jenkins執(zhí)行shell腳本時候出現(xiàn) fastlane Command not found
在安裝完fastkane之后執(zhí)行 fastlane xxx desc:xxx 可以成功打包執(zhí)行 在jenkins中的shell腳本無法執(zhí)行出現(xiàn)以下錯誤
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
2.使用Python報錯
import requests
ModuleNotFoundError: No module named 'requests'
mac下會自動默認(rèn)使用python2.7,但它沒有requests模塊,所以會報錯,即使你已經(jīng)安裝了python3。
終端輸入:
python3 -m pip install requests
3.git 克隆超時(上面有講到)
Additional Behaviours-->高級的克隆行為-->設(shè)置超時時間
4.python3 : command not found
添加環(huán)境變量

整理比較倉促,如有不明白的地方,歡迎賜教!
參考鏈接:
http://www.itdecent.cn/p/4824bf37f9aa/
https://jenkins.io/zh/
https://fastlane.tools/