強(qiáng)烈建議一定要在網(wǎng)絡(luò)好的情況下配置,并且最好能上外網(wǎng),不然折磨死你!
為什么寫(xiě)這篇文章了,因?yàn)榈侥壳盀橹刮疫€沒(méi)看到一篇完善靠譜的iOS Jenkins配置文章。
首先我這里安裝配置Jenkins都是使用Homebrew。
Homebrew是一款Mac OS平臺(tái)下的軟件包管理工具. 官網(wǎng)這里 Homebrew
安裝以及操作步驟
- 1.安裝
Homebrew - 2.使用
Homebrew安裝Jenkins - 3.安裝
Jenkins插件 - 4.配置證書(shū)
- 5.創(chuàng)建項(xiàng)目配置
- 6.腳本配置
- 7.項(xiàng)目打包
1.1 安裝Homebrew,在終端運(yùn)行以下指令安裝
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
安裝成功后顯示
==> Installation successful!
==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
https://docs.brew.sh/Analytics
No analytics data has been sent yet (or will be during this `install` run).
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
https://github.com/Homebrew/brew#donations
==> Next steps:
- Run `brew help` to get started
- Further documentation:
[https://docs.brew.sh](https://docs.brew.sh)
執(zhí)行 brew -v 來(lái)查看安裝版本
brew -v
顯示如下則說(shuō)明Homebrew安裝成功
Homebrew 2.5.9-48-gf2d46ef
Homebrew/homebrew-core (git revision cb8d; last commit 2020-11-11)
edison@192 ~ %
如果已經(jīng)安裝的則建議更新一下Homebrew,運(yùn)行以下指令更新
brew update
2.1 通過(guò)Homebrew安裝Jenkins
這里需要注意:
因?yàn)榘惭bJenkins需要依賴jdk,所以當(dāng)我們用最新的Homebrew來(lái)安裝Jenkins時(shí)會(huì)默認(rèn)先安裝 jdk 11版本
來(lái)源看這里 https://formulae.brew.sh/formula/jenkins
但是如果我們的項(xiàng)目是在gitlab上開(kāi)發(fā),那么我們?cè)?code>Jenkins里需要安裝gitlab相關(guān)插件,gitlab需要依賴ruby-runtime。但是目前ruby-runtime是不支持jdk 11的。
這就是為什么你按照其他的教程來(lái)安裝Jenkins時(shí),教程里告訴你需要先安裝jdk,然后你安裝jdk 8的版本后,再用Homebrew來(lái)安裝Jenkins時(shí),結(jié)果在安裝gitlab插件時(shí),安裝ruby-runtime一直顯示錯(cuò)誤
java.lang.RuntimeException: unsupported Java version: 11
所以你以為自己安裝了jdk 8,其實(shí)Homebrew已經(jīng)重新下載了一份jdk 11文件,并和Jenkins形成了依賴關(guān)系。
說(shuō)了這么多,怎么解決呢?
在你已經(jīng)安裝Homebrew的情況下,并且還沒(méi)安裝Jenkins時(shí),先全局搜索Jenkins,找到如下兩個(gè)文件

這兩個(gè)文件是你安裝Jenkins時(shí)配置jdk的文件。
把里面openjdk@11 改成openjdk@8,
java_version: “11” 改成java_version: “8”,

這樣一改那么你在下載Jenkins時(shí)就會(huì)默認(rèn)下載jdk 8,注意兩個(gè)文件都要改好后保存。
接下來(lái)安裝Jenkins,終端執(zhí)行命令安裝Jenkins
brew install jenkins-lts
安裝完成后會(huì)出現(xiàn)
==> jenkins-lts
Note: When using launchctl the port will be 8080.
To have launchd start jenkins-lts now and restart at login:
brew services start jenkins-lts
Or, if you don't want/need a background service you can just run:
jenkins-lts
安裝完成后啟動(dòng)Jenkins
brew services start jenkins-lts
注意我們這里的jenkins-lts就相當(dāng)于Jenkins命令,這是官方提供的一種安裝方式
所以當(dāng)你用jenkins-lts命令安裝后,執(zhí)行Jenkins命令就無(wú)效
官網(wǎng)這里 https://www.jenkins.io/download/lts/macos/
有些博客上是寫(xiě)Jenkins來(lái)啟動(dòng)服務(wù) (在這里就是jenkins-lts命令了)
但是直接用Jenkins命令啟動(dòng)服務(wù),這樣就會(huì)導(dǎo)致你每次重啟瀏覽器都要執(zhí)行這個(gè)命令,不然就會(huì)報(bào)你的登錄名和密碼錯(cuò)誤。
所以建議使用brew services start jenkins-lts來(lái)啟動(dòng)Jenkins服務(wù),這樣不必每次都要執(zhí)行命令來(lái)啟動(dòng)Jenkins
啟動(dòng)Jenkins后再瀏覽器輸入以下地址
http://localhost:8080
打開(kāi)之后就會(huì)出現(xiàn)

此時(shí)說(shuō)明Jenkins已經(jīng)安裝并且啟動(dòng)成功
然后通過(guò)以下地址找到密碼文件initialAdminPassword
注意這里可能因?yàn)閭€(gè)人電腦配置而導(dǎo)致路徑差異,要以上圖中的路徑為依據(jù)
/Users/edison/.jenkins/secrets/initialAdminPassword
用文本軟件打開(kāi)initialAdminPassword文件把密碼輸入,點(diǎn)擊繼續(xù)
2.2 安裝推薦的插件
如果正常進(jìn)入此頁(yè)面 點(diǎn)擊安裝推薦的插件

此時(shí)如果出現(xiàn)Jenkins離線,則是網(wǎng)絡(luò)問(wèn)題導(dǎo)致,這個(gè)自己想辦法解決網(wǎng)絡(luò)問(wèn)題
一定要把所有軟件安裝成功才進(jìn)行下一步,如果安裝失敗點(diǎn)擊重試。

3.1安裝自己需要的插件
在首頁(yè)點(diǎn)擊Manage Jenkins->System Configuration->Manage Plugins ->可選插件,
然后搜索以下列出的插件安裝
-
GitLab Plugin因?yàn)轫?xiàng)目代碼是部署在gitlab上,所以需要安裝 Gitlab Hook PluginXcode integration-
Keychains and Provisioning Profiles Management配置證書(shū) -
DingTalk打包成功通知群里測(cè)試 -
Git Parameter Plug-In配置打包多個(gè)分支
4.1配置證書(shū)
由于打包需要手動(dòng)配置證書(shū),所以這里需要上傳Keychains和Provisioning描述文件兩個(gè)文件
在首頁(yè)點(diǎn)擊Manage Jenkins->Uncategorized->Keychains and Provisioning Profiles Management
注意在頁(yè)面最底部
配置鑰匙串和描述文件這里需要注意一下
很多人估計(jì)在這里會(huì)被坑到,這個(gè)應(yīng)該也是Jenkins頁(yè)面設(shè)計(jì)的一個(gè)缺陷。
那就是大家點(diǎn)擊選取login.keychain之后,然后點(diǎn)擊upload。此時(shí)鑰匙串keychain是上傳成功了。
但是Provisioning描述文件就沒(méi)有去選取和upload上傳。
我想應(yīng)該是大家看到選取上傳按鈕只有一個(gè),覺(jué)得選取上傳按鈕和對(duì)應(yīng)的文件是一一對(duì)應(yīng)的。
也就是會(huì)顧慮到我在同一個(gè)地方再上傳Provisioning文件會(huì)覆蓋掉之前的login.keychain文件,也就是之前的文件會(huì)被丟失。
但是請(qǐng)注意,你點(diǎn)擊upload之后文件已經(jīng)保存了。所以這里需要在同一個(gè)地方上傳兩個(gè)文件沒(méi)問(wèn)題。

4.2 上傳Keychains文件
點(diǎn)擊 選取文件 找到login.keychain這個(gè)文件
login.keychain地址
/Users/louxunmac/Library/Keychains
注意由于系統(tǒng)版本升級(jí)現(xiàn)在沒(méi)有login.keychain這個(gè)文件,取而代之的是login.keychain-db文件。
所以我們需要在同一個(gè)文件夾下拷貝一份login.keychain-db文件,然后改名成login.keychain文件
選取login.keychain之后然后點(diǎn)擊上傳upload
然后Keychains這里還有Identities->Code Signing Identity這里需要填寫(xiě)下,
在鑰匙串里找到開(kāi)發(fā)環(huán)境的證書(shū)copy證書(shū)名字然后填寫(xiě)到Code Signing Identity輸入框里

到此keychain配置完成
4.3 上傳Provisioning Profiles描述文件
Provisioning描述文件 地址
/Users/louxunmac/Library/MobileDevice/Provisioning Profiles
因?yàn)槲业腏enkins打包是用的開(kāi)發(fā)環(huán)境證書(shū)。所以這里只需要用到開(kāi)發(fā)環(huán)境的Provisioning描述文件
如果用發(fā)布證書(shū)打包,那么別人是安裝不了的。發(fā)布證書(shū)打包唯一的安裝渠道是走app store。
還是重復(fù)剛才配置keychain的上傳步驟,點(diǎn)擊選取開(kāi)發(fā)環(huán)境Provisioning描述文件
這個(gè)地址里面可能會(huì)有多個(gè)描述文件,所以你要選擇你此時(shí)在Xcode里正在使用的開(kāi)發(fā)環(huán)境Provisioning描述文件
選取上傳成功后然后在Provisioning Profiles Directory Path里填寫(xiě)Provisioning地址
到此Provisioning配置完成
最后點(diǎn)擊save保存
至于最后判斷這兩項(xiàng)是否都配置完成可以參照我的截圖
到現(xiàn)在Jenkins的配置告一段落。
5.1創(chuàng)建項(xiàng)目
接下來(lái)是創(chuàng)建一個(gè)item,即創(chuàng)建一個(gè)項(xiàng)目
這里需要注意一點(diǎn),這里的項(xiàng)目名字一定是你的APP里 product name,否則打包時(shí)就會(huì)報(bào)路徑出錯(cuò)導(dǎo)致打包失敗
實(shí)在不清楚就在Xcode build setting里搜索 product name。

然后選擇第一個(gè)自由風(fēng)格,點(diǎn)擊確定。項(xiàng)目創(chuàng)建完畢。
5.2項(xiàng)目配置
5.2.1 代碼打包分支配置
點(diǎn)擊項(xiàng)目的配置即可進(jìn)入配置頁(yè)面 ,找到并勾選 This project is parameterized
由于Git Parameter插件已經(jīng)安裝,所以點(diǎn)擊添加參數(shù)選中Git Parameter
然后名稱寫(xiě)branchName , 參數(shù)類型選擇 分支或標(biāo)簽,默認(rèn)值填寫(xiě)origin/master ,如圖


5.2.2 項(xiàng)目代碼地址配置
源碼管理里選中g(shù)it,Repository URL這里填寫(xiě)你的git項(xiàng)目倉(cāng)庫(kù)地址,Credentials里這里相當(dāng)于配置git權(quán)限
指定分支填寫(xiě)$branchName ,如圖:

Credentials配置
點(diǎn)擊添加Jenkins,默認(rèn)進(jìn)來(lái)應(yīng)該就是domain是全局憑據(jù),類型是username with password,范圍是全局
那就按照默認(rèn)的來(lái)配置,如果不是也最好改一下。
用戶名這里填寫(xiě)git賬號(hào)的用戶名,然后填寫(xiě)密碼,ID就是git的User ID
這里填寫(xiě)完點(diǎn)擊添加如果沒(méi)有報(bào)紅就說(shuō)明配置成功,不用懷疑了。就如上圖所示

估計(jì)很多人在這個(gè)時(shí)候會(huì)忘記自己git賬號(hào)和密碼,也不知道那個(gè)ID怎么填?然后也不好意思或者暫時(shí)不知道找誰(shuí)拿回賬號(hào)密碼
因?yàn)?code>git賬號(hào)我們只需要輸入一次就行,既然只需要輸入一次,那么他肯定就會(huì)保存在本地。
所以只需要找到他就行
如果你是用Sourcetree,那么點(diǎn)擊偏好設(shè)置->高級(jí),如下圖
找到主機(jī)名稱,這個(gè)主機(jī)名稱就是你的git項(xiàng)目倉(cāng)庫(kù)地址,用戶名就是你的git賬號(hào)
這里有,說(shuō)明你是登錄成功狀態(tài)。

打開(kāi)鑰匙串,如下圖在密碼里根據(jù)你的主機(jī)名和賬戶名找到對(duì)應(yīng)的一行,然后選中,鼠標(biāo)右鍵,復(fù)制密碼
或者選中,右鍵點(diǎn)擊顯示簡(jiǎn)介,查看密碼。

到此你的賬戶名和密碼都已經(jīng)找到了,還差一個(gè)ID。
此時(shí)可以在瀏覽器輸入那個(gè)主機(jī)名稱的ip地址,然后輸入賬戶名和密碼驗(yàn)證下。
登入成功說(shuō)明git賬號(hào)密碼都是對(duì)的。
然后網(wǎng)頁(yè)最右上角點(diǎn)擊進(jìn)入setting,此時(shí)setting里面那個(gè)user ID就找到了。


5.2.3設(shè)置debug,release 模式
點(diǎn)擊添加參數(shù)選擇choice parmaeter,然后按照下圖配置就行。


5.2.4 Keychains和Provisioning配置
由于之前安裝配置過(guò)Keychains and Provisioning Profiles Management,這里直接勾選,選擇就行。完成

5.2.5釘釘機(jī)器人添加配置
在你當(dāng)前的工作群里 智能群助手里添加機(jī)器人。
這里需要注意兩點(diǎn)
0.1 Webhook 這個(gè)釘釘默認(rèn)分配的,這個(gè)地址我們到時(shí)候要加在腳本里
0.2 安全設(shè)置,由于目前Jenkins里的插件只支持ip設(shè)置,所以這里我們先輸入配置一個(gè)ip地址。
輸入命令行
nslookup localhost

輸出顯示 把最后一行Address ip地址輸入點(diǎn)擊完成。至此釘釘機(jī)器人添加完成。
Server: 202.96.134.133
Address: 202.96.134.133#53
Name: localhost
Address: 127.0.0.1
接下來(lái)是配置Jenkins釘釘機(jī)器人
點(diǎn)擊Manage Jenkins->System Configuration->configure system 找到釘釘
這里需要勾選通知時(shí)機(jī),看個(gè)人情況勾選。
webhook填寫(xiě):釘釘群里添加的機(jī)器人里分配的webhook。
ip:釘釘群里添加的機(jī)器人里配置的ip。
然后點(diǎn)擊測(cè)試,此時(shí)估計(jì)會(huì)報(bào)錯(cuò),不要慌,把輸入框底部提示的那個(gè)ip地址加在釘釘群里添加機(jī)器人的安全設(shè)置ip里。
然后再點(diǎn)擊測(cè)試,提示成功。
最后別忘了保存

7.1腳本
至此,里Jenkins打包配置就差最后一步了,執(zhí)行腳本配置。
對(duì)于腳本這塊,因?yàn)闆](méi)什么研究,所以就不多解釋了。
但是需要注意幾點(diǎn)。
7.1.1.腳本里的項(xiàng)目名,這個(gè)也是寫(xiě)的product name,
腳本里有兩個(gè)地方寫(xiě)到 項(xiàng)目名,就在前兩行,我的項(xiàng)目名寫(xiě)的是YunDian,到時(shí)候你們自己替換成自己的就行
7.1.2 然后說(shuō)說(shuō)最后蒲公英和釘釘?shù)哪_本配置,就在腳本最后兩段那里。
先說(shuō)蒲公英,這里需要把userKey和apiKey替換成自己的,然后如果設(shè)置了下載密碼就把PASSWORD也填寫(xiě)下
這樣蒲公英的腳本配置完成
釘釘這里需要把下載鏈接地址https://www.pgyer.com/abc改成自己項(xiàng)目的下載地址,然后下載密碼填上。
最后https://oapi.dingtalk.com/robot/send?access_token=d7bed3f96cbbbed96ed1a39ed0018bb815aa0jeeekkekeke這里替換成自己的Webhook
## 上傳蒲公英
#userKey和apiKey需要在蒲公英的賬號(hào)設(shè)置中查找
userKey="6721185289b82dcc123a2c7dddjjd"
apiKey="0385141eef7d17e0f6b5725adddddd"
PASSWORD=123
MSG=`git log -1 --pretty=%B`
#蒲公英打包
curl -F "file=@${EXPORTPATHNEWIPA}" \
-F "uKey=${userKey}" \
-F "_api_key=${apiKey}" \
-F "updateDescription=${MSG}" \
-F "password=${PASSWORD}" \
http://www.pgyer.com/apiv1/app/upload
#釘釘發(fā)布通知
message="### <font color=#00BFFF>測(cè)試環(huán)境【iOS-APP】發(fā)布成功</font>\n 下載鏈接:https://www.pgyer.com/abc\n密碼:123"
MSG_JSON='{"msgtype":"markdown","markdown":{"title":"App發(fā)布通知","text":"'${message}'"}}'
echo "${MSG_JSON}"
echo ${1}
curl 'https://oapi.dingtalk.com/robot/send?access_token=d7bed3f96cbbbed96ed1a39ed0018bb815aa0jeeekkekeke' \
-H 'Content-Type:application/json' \
-d "${MSG_JSON}"
完整腳本如下,改好后直接放在構(gòu)建Execute shell里面,最后保存。

## !/bin/sh
## 項(xiàng)目名
TARGET_NAME=YunDian
## Scheme名
SCHEME=YunDian
##=======================
## 編譯類型
if [[ "${Configuration_Type}" == "Debug" ]]; then
# 測(cè)試環(huán)境
BUILD_TYPE=Debug
else
# 生產(chǎn)環(huán)境
BUILD_TYPE=Release
fi
## 當(dāng)前目錄
SORCEPATH=${WORKSPACE}
## workspace名 YunDian.xcworkspace
SPACE=${WORKSPACE}/${TARGET_NAME}.xcworkspace
##xcarchive文件的存放路徑
ARCHIVEPATH=$SORCEPATH/build/$SCHEME.xcarchive
## ipa文件的存放路徑
EXPORTPATH=$SORCEPATH/build/$SCHEME
## ExportOptions.plist文件的存放路徑,該文件要存放在這個(gè)路徑下內(nèi)容如下
EXPORTOPTIONSPLIST=$SORCEPATH/build/ExportOptions.plist
## 導(dǎo)出后的ipa路徑
EXPORTPATHIPA=$SORCEPATH/build/$SCHEME/$SCHEME.ipa
echo -e "============First Build Clean============"
## 清理緩存
## 如果工程使用的是cocoapods,則'-project %s.xcodeproj'替換為'-workspace %s.xcworkspace'
xcodebuild clean -workspace $SPACE -scheme ${SCHEME} -configuration ${BUILD_TYPE}
DELETEIPAFILE=$SORCEPATH/build/$SCHEME/*.ipa
rm -f ${DELETEIPAFILE}
echo -e "============Build Clean============"
## 輸出關(guān)鍵信息
echo -e " TARGET_NAME : ${TARGET_NAME}"
echo -e " BUILD_TYPE : ${BUILD_TYPE}"
echo -e " SORCEPATH : ${SORCEPATH}"
echo -e " ARCHIVEPATH : ${ARCHIVEPATH}"
echo -e " EXPORTPATH : ${EXPORTPATH}"
echo -e " EXPORTOPTIONSPLIST : ${EXPORTOPTIONSPLIST}"
echo -e "============Build Archive============"
## 導(dǎo)出archive包
xcodebuild archive -workspace ${SPACE} -scheme ${SCHEME} -configuration ${BUILD_TYPE} -archivePath $ARCHIVEPATH
echo -e "============Build Archive Success============"
echo -e "============Export IPA============"
## 導(dǎo)出IPA包
xcodebuild -exportArchive -archivePath $ARCHIVEPATH -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST}
echo -e "============Export IPA SUCCESS============"
## 編譯完成時(shí)間 20181030_0931
BUILD_DATE="$(date +'%Y%m%d_%H%M')"
## info.plist路徑
PROJECT_INFOPLIST_PATH="${SORCEPATH}/${TARGET_NAME}/Resources/Info.plist"
## 取版本號(hào)
BUNDLESHORTVERSION=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${PROJECT_INFOPLIST_PATH}")
## 取build值
VERSION=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${PROJECT_INFOPLIST_PATH}")
## ipa更名規(guī)則 項(xiàng)目名V版本_年月日_時(shí)分
IPANAME="${TARGET_NAME}V${BUNDLESHORTVERSION}_${BUILD_DATE}.ipa"
## 更名后ipa路徑
EXPORTPATHNEWIPA=$EXPORTPATH/$IPANAME
echo -e "============Export end :${BUILD_DATE}============"
echo -e "============IPA Old Name: ${EXPORTPATHIPA}============"
echo -e "============IPA New Name: ${EXPORTPATHNEWIPA}============"
## IPA更名
cp $EXPORTPATHIPA $EXPORTPATHNEWIPA
echo -e "============Create New Name Success============"
## 刪除老IPA
rm $EXPORTPATHIPA
echo -e "============Delete Old Name Success============"
echo -e "============Start Uploading============"
## 上傳蒲公英
#userKey和apiKey需要在蒲公英的賬號(hào)設(shè)置中查找
userKey="6721185289b82dcc123a2c7d18859fc4"
apiKey="0385141eef7d17e0f6b5725a3f22ddc0"
PASSWORD=123
MSG=`git log -1 --pretty=%B`
#蒲公英打包
curl -F "file=@${EXPORTPATHNEWIPA}" \
-F "uKey=${userKey}" \
-F "_api_key=${apiKey}" \
-F "updateDescription=${MSG}" \
-F "password=${PASSWORD}" \
http://www.pgyer.com/apiv1/app/upload
message="### <font color=#00BFFF>測(cè)試環(huán)境【iOS-樓訊云店】發(fā)布成功</font>\n 下載鏈接:https://www.pgyer.com/OmpT\n密碼:123"
MSG_JSON='{"msgtype":"markdown","markdown":{"title":"App發(fā)布通知","text":"'${message}'"}}'
echo "${MSG_JSON}"
echo ${1}
curl 'https://oapi.dingtalk.com/robot/send?access_token=d7bed3f96cbbbed96ed1a39ed0018bb815aa076330ac554f2e025111521da8c6' \
-H 'Content-Type:application/json' \
-d "${MSG_JSON}"
這樣整個(gè)Jenkins配置全部完成。
但是應(yīng)該不會(huì)就這么輕易打包成功。
8.1開(kāi)始打包
我們點(diǎn)擊build with parameters,選中你要構(gòu)建的分支,最后點(diǎn)擊開(kāi)始構(gòu)建。

如果構(gòu)建成功那就不管了,做別的事去
大概率會(huì)報(bào)錯(cuò),當(dāng)看到如下錯(cuò)誤The file “ExportOptions.plist” couldn’t be opened because there is no such file時(shí),說(shuō)明ExportOptions.plist這個(gè)文件不存在。再看看報(bào)錯(cuò)里面的路徑是在/Users/louxunmac/.jenkins/workspace/yundian/build/YunDian.xcarchive里沒(méi)找到。
怎么查看錯(cuò)誤,如下圖bulid history點(diǎn)擊構(gòu)建對(duì)應(yīng)的tag次數(shù),點(diǎn)擊倒三角查看控制臺(tái)輸出
+ echo -e '============Build Archive Success============'
-e ============Build Archive Success============
+ echo -e '============Export IPA============'
-e ============Export IPA============
+ xcodebuild -exportArchive -archivePath /Users/louxunmac/.jenkins/workspace/yundian/build/YunDian.xcarchive -exportPath /Users/louxunmac/.jenkins/workspace/yundian/build/YunDian -exportOptionsPlist /Users/louxunmac/.jenkins/workspace/yundian/build/ExportOptions.plist
error: Couldn't load -exportOptionsPlist: The file “ExportOptions.plist” couldn’t be opened because there is no such file.
Error Domain=NSCocoaErrorDomain Code=260 "The file “ExportOptions.plist” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/Users/louxunmac/.jenkins/workspace/yundian/build/ExportOptions.plist, NSUnderlyingError=0x7fe868b13e10 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
** EXPORT FAILED **
Build step 'Execute shell' marked build as failure
Finished: FAILURE

既然沒(méi)有那么我們就創(chuàng)建一個(gè)ExportOptions.plist文件。
如下圖創(chuàng)建ExportOptions.plist文件
我們需要使用Xcode來(lái)構(gòu)建一個(gè)開(kāi)發(fā)環(huán)境包。點(diǎn)擊Xcode->product->archive
選擇development

注意這里 app thinning這里選擇none,additional options 這里不要勾選 然后點(diǎn)擊next

最后打包成功后,拷貝一份ExportOptions.plist文件到報(bào)錯(cuò)的路徑下面/Users/louxunmac/.jenkins/workspace/yundian/build/YunDian.xcarchive,就拷貝在build這個(gè)文件夾里

如果出現(xiàn)如下錯(cuò)誤,那就是ipa路徑不對(duì),很可能是你上一步導(dǎo)出的包里面ExportOptions.plist文件的問(wèn)題,所以要按照如上打包打出。
+ cp /Users/louxunmac/.jenkins/workspace/yundian/build/YunDian/YunDian.ipa '/Users/louxunmac/.jenkins/workspace/yundian/build/YunDian/YunDianV$(MARKETING_VERSION)_20201111_1134.ipa'
cp: /Users/louxunmac/.jenkins/workspace/yundian/build/YunDian/YunDian.ipa: No such file or directory
Build step 'Execute shell' marked build as failure
Finished: FAILURE
基本到此打包就會(huì)成功,如果遇到其它問(wèn)題可以Google 我這里暫時(shí)只能提供這些
最后配置好了 如何讓其它機(jī)器訪問(wèn)?比如讓你們公司的測(cè)試訪問(wèn)你的電腦打包地址來(lái)打包
1.修改ip
把homebrew.mxcl.jenkins-lts.plist文件里的httpListenAddress地址127.0.0.1 改成0.0.0.0
以下兩個(gè)地方都改一下
/Users/louxunmac/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist
/usr/local/Cellar/jenkins-lts/2.249.3/homebrew.mxcl.jenkins-lts.plist
改好后要讓環(huán)境生效
1.鏈接launchd 配置文件
ln -sfv /usr/local/opt/jenkins-lts/*.plist ~/Library/LaunchAgents
2.加載文件執(zhí)行命令行:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist
最后重啟Jenkins
brew services restart jenkins-lts
這個(gè)時(shí)候用手機(jī)輸入ip地址 奇跡出現(xiàn)了(注意把下面的ip地址替換為你本機(jī)的ip地址,如下圖箭頭)
`http://10.1.221.162:8080`
