一逞姿、Homebrew
Homebrew
是一款Mac OS
平臺(tái)下的軟件包管理工具
- 安裝Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- 檢測(cè)Homebrew是否安裝成功
brew -v
- 更新Homebrew
brew update
注意
1辞嗡、Homebrew的命令是以brew開(kāi)頭
2捆等、Homebrew的默認(rèn)安裝目錄為 /usr/local/Homebrew
3、通過(guò)brew 安裝的程序都會(huì)默認(rèn)安裝到 /usr/local/Cellar/程序名/版本號(hào)/ 目錄下
二续室、Java
- Jenkins需要依賴java環(huán)境栋烤,當(dāng)我們用最新的Homebrew來(lái)安裝Jenkins時(shí)會(huì)默認(rèn)先安裝 java11,但是我們最好使用java8猎贴,Java8比較穩(wěn)定班缎,而且后面流水線要用bugly,bugly不支持Java11她渴。
- brew安裝Java8
brew install --cask homebrew/cask-versions/adoptopenjdk8
- 檢測(cè)Java是否安裝成功
java -version
注意
1达址、JAVA的默認(rèn)安裝目錄為 /Library/Java,如果你安裝多個(gè)版本,/Library/Java/JavaVirtualMachines里面就可以看到多個(gè)版本文件夾
二趁耗、Jenkins
Jenkins是開(kāi)源軟件項(xiàng)目沉唠,基于Java開(kāi)發(fā)的持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作
- brew安裝Jenkins
brew install jenkins
- 檢測(cè)Jenkins是否安裝成功
jenkins --version
- 啟動(dòng)jenkins
jenkins
jenkins是在前臺(tái)啟動(dòng)關(guān)閉終端苛败,jenkins就關(guān)閉了
- 設(shè)置jenkins后臺(tái)啟動(dòng)满葛、開(kāi)機(jī)啟動(dòng)
設(shè)置開(kāi)機(jī)自啟動(dòng):sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist
取消開(kāi)機(jī)自啟動(dòng):sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist
后臺(tái)啟動(dòng)(默認(rèn)端口):nohup java -jar jenkins.war &
后臺(tái)啟動(dòng)(指定端口):nohup java -jar jenkins.war -httpPort=88 &
后臺(tái)啟動(dòng)(HTTPS):nohup java -jar jenkins.war -httpsPort=88 &
- 根據(jù)提示輸入,安裝推薦的插件罢屈,注冊(cè)賬戶
- 你可以把所有的插件都安裝了嘀韧,常用的有g(shù)it相關(guān)Branch API Plugin、 Build With Parameters之類
三缠捌、流水線
-
創(chuàng)建新的流水線任務(wù)锄贷,名字你自己取
-
配置Discard old builds選項(xiàng),就是多久釋放舊的構(gòu)建
-
勾選This project is parameterized曼月,選擇Choice Parameter谊却,這邊的environment名字和內(nèi)容,其實(shí)你都可以按需配置哑芹,只要和下面腳本里對(duì)的上就可以炎辨。這邊就是選擇對(duì)應(yīng)的環(huán)境,開(kāi)發(fā)聪姿、測(cè)試碴萧、生產(chǎn)
-
選擇Git Parameter,就是可以選擇對(duì)應(yīng)的Git分支
-
Git源碼管理,填入你的源碼地址末购,我這邊用的是https的勿决,點(diǎn)這個(gè)添加,輸入你的git賬號(hào)和密碼就可以了招盲。
- 如果你是SSH,你就選擇SSH Username with private key,把ssh私鑰填進(jìn)去
6.1 前往文件夾 ~/.ssh 可以看到本機(jī)是否已經(jīng)生成過(guò)低缩,有的話可以直接用,也可以生成新的
6.2 ssh-keygen -t rsa -C "youremail@example.com" 生成秘鑰;不需要更名稱和不需要密碼的話直接敲回車就行了咆繁。
6.3 生成成功之后讳推,前往 ~/.ssh,里面三個(gè)文件id_rsa(私鑰)玩般、id_rsa.pub(公鑰)银觅、known_hosts
6.4 將id_rsa.pub(公鑰)配置到git,將id_rsa(私鑰)配置到j(luò)enkins里坏为。
- 構(gòu)建->增加構(gòu)建步驟->
Execute shell
- 在填腳本究驴,我們先把釘釘弄一下
8.1 釘釘和測(cè)試?yán)瓊€(gè)群
8.2 群設(shè)置->智能群助手->添加自定義機(jī)器人
8.3 安全設(shè)置,必須要選一個(gè)匀伏,我選擇了關(guān)鍵詞 比較簡(jiǎn)單一點(diǎn)洒忧,這個(gè)關(guān)鍵詞就是你機(jī)器人自動(dòng)發(fā)的文字里必須要有這個(gè)關(guān)鍵詞才會(huì)發(fā),例如發(fā)布
够颠。復(fù)制Webhook
備用 - 查看蒲公英的
apikey
,在個(gè)人設(shè)置
里
- 因?yàn)閤codebuild打包需要
ExportOptions.plist
文件熙侍。所以前往文件夾~/.jenkins/workspace,在這個(gè)目錄下創(chuàng)建文件夾ExportOptions履磨。 - 先手動(dòng)導(dǎo)出你的IPA包蛉抓,類型的話你就選ad-hoc,導(dǎo)出的文件里有個(gè)ExportOptions.plist,把它c(diǎn)opy出來(lái)剃诅,放到剛剛的文件夾里巷送,再?gòu)?fù)制一份然后修改里面的method屬性為
development
,把這個(gè)文件重命名為ExportOptions_dev.plist
矛辕。
- 因?yàn)槲液灻亲詣?dòng)的惩系,所以我不需要配證書(shū)什么的,比較方便如筛,直接用了jenkins的腳本,如果你是手動(dòng)的抒抬。還是用
fastlane
比較方便 - 輸入腳本,把腳本復(fù)制出來(lái)杨刨,你全局搜一下****,有****的地方就是你需要自己替換的
echo -e $(pwd)
## !/bin/sh
## 項(xiàng)目名
TARGET_NAME=****
## Scheme名
SCHEME=****
echo -e "============Pod Install============"
cd ${TARGET_NAME}
echo -e $(pwd)
pod install
##=======================
## 編譯類型
if [[ "${environment}" == "生產(chǎn)環(huán)境" ]]; then
# 生產(chǎn)環(huán)境
BUILD_TYPE=Release
## ExportOptions.plist文件的存放路徑擦剑,該文件要存放在這個(gè)路徑下內(nèi)容如下
EXPORTOPTIONSPLIST=${JENKINS_HOME}/workspace/ExportOptions/ExportOptions.plist
else
# 測(cè)試環(huán)境
BUILD_TYPE=Debug
## ExportOptions.plist文件的存放路徑妖胀,該文件要存放在這個(gè)路徑下內(nèi)容如下
EXPORTOPTIONSPLIST=${JENKINS_HOME}/workspace/ExportOptions/ExportOptions_dev.plist
fi
## 當(dāng)前目錄
SORCEPATH=${WORKSPACE}
## workspace名
SPACE=${WORKSPACE}/${TARGET_NAME}/${TARGET_NAME}.xcworkspace
##xcarchive文件的存放路徑
ARCHIVEPATH=$SORCEPATH/build/$SCHEME.xcarchive
## ipa文件的存放路徑
EXPORTPATH=$SORCEPATH/build/$SCHEME
## 導(dǎo)出后的ipa路徑
EXPORTPATHIPA=$SORCEPATH/build/${TARGET_NAME}/****.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} -quiet -archivePath $ARCHIVEPATH
echo -e "============Build Archive Success============"
echo -e "============Export IPA============"
## 導(dǎo)出IPA包
xcodebuild -exportArchive -archivePath $ARCHIVEPATH -quiet -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST}
echo -e "============Export IPA SUCCESS============"
## 編譯完成時(shí)間
BUILD_DATE="$(date +'%Y%m%d_%H%M')"
## 上傳蒲公英
## apiKey和userKey需要在蒲公英的賬號(hào)設(shè)置中查找https://www.pgyer.com/account/api
apiKey="****"
MSG=`git log -1 --pretty=%B`
#蒲公英打包
result=$(curl -F "file=@${EXPORTPATHIPA}" \
-F "_api_key=${apiKey}" \
-F "buildUpdateDescription=${environment}惠勒;${MSG}" \
https://www.pgyer.com/apiv2/app/upload)
code=`echo $result | jq '.code'`
if [ $code = 0 ];then
echo "蒲公英打包 Success"
data=`echo $result | jq '.data'`
#APP名 需要帶上-r 要不然數(shù)據(jù)會(huì)有""
buildName=`echo $data | jq -r '.buildName'`
#APP版本號(hào)
buildVersion=`echo $data | jq -r '.buildVersion'`
#APP下載二維碼
buildQRCodeURL=`echo $data | jq -r '.buildQRCodeURL'`
#釘釘通知
message="#### 【iOS${buildName}】${environment}赚抡;V${buildVersion} 發(fā)布成功 \n 更新說(shuō)明:${MSG} \n>掃描二維碼安裝:![screenshot](${buildQRCodeURL}) \n #### @****釘釘群里你需要at的人的手機(jī)號(hào)碼 請(qǐng)注意查收"
MSG_JSON='{"msgtype":"markdown","markdown":{"title":"'${buildName}'App發(fā)布通知","text":"'${message}'"},"at":{"atMobiles":["****釘釘群里你需要at的人的手機(jī)號(hào)碼"]}}'
curl 'https://oapi.dingtalk.com/robot/send?access_token=****釘釘機(jī)器人webhook' \
-H 'Content-Type:application/json' \
-d "${MSG_JSON}"
else
echo "蒲公英打包 Failed"
fi
-
構(gòu)建任務(wù)
-
如果你需要在
git push
的時(shí)候自動(dòng)執(zhí)行,那就設(shè)置構(gòu)建觸發(fā)器
纠屋,然后將這個(gè)GitLab webhook URL復(fù)制到你的項(xiàng)目設(shè)置里涂臣,一般叫網(wǎng)絡(luò)回調(diào)鉤子
。
四、分配角色權(quán)限
因?yàn)橐o后端和測(cè)試同學(xué)使用符欠,需要配置一下權(quán)限仅胞,給他們指定某些任務(wù)可以操作短条,具體的操作也只能是運(yùn)行和取消。
- 安裝插件
Role-based Authorization Strategy
-
Manage Jenkins->Manage Users->新增用戶test
-
Manage Jenkins->Configure Global Security->勾選Role-Based Strategy 哭尝,保存(如果你沒(méi)有安裝Role-based Authorization Strategy插件是沒(méi)有這個(gè)選項(xiàng)的)
- Manage Jenkins->Manage and Assign Roles 進(jìn)入角色管理
4.1 選擇Manage Roles
,這邊我的理解是用戶組的意思剖煌,你輸入一個(gè)用戶組的名字材鹦,選擇讀權(quán)限
4.2 輸入4.1你輸?shù)?code>用戶組名,然后在Pattern
輸入對(duì)應(yīng)的任務(wù)名字耕姊,進(jìn)行綁定桶唐,選擇對(duì)應(yīng)的權(quán)限。相當(dāng)于你這個(gè)組下的用戶只能操作這個(gè)任務(wù)
4.3 選擇Assign Roles
箩做,給對(duì)應(yīng)的用戶組莽红,分配用戶
4.4 綁定用戶組和用戶,拉到最下面有個(gè)保存
-
登錄test賬號(hào)邦邦,發(fā)現(xiàn)只能看到那一個(gè)任務(wù)安吁,也只有運(yùn)行和停止的操作 就OK了
五、外網(wǎng)映射
- 因?yàn)闇y(cè)試同學(xué)不一定和咱們處于同一個(gè)區(qū)域網(wǎng)燃辖,咱們需要給個(gè)
外網(wǎng)地址
給他們鬼店,那我們需要用到一個(gè)工具花生殼
,自行搜索下載黔龟「局牵花生殼默認(rèn)是開(kāi)機(jī)自啟的,這個(gè)軟件有時(shí)候后端在測(cè)支付的時(shí)候 也是可以用它的氏身。 -
添加映射
3-1.png -
輸入你本機(jī)的IP地址(按住option巍棱,去點(diǎn)擊你的WiFi圖標(biāo),可以看到你的IP)蛋欣,端口是8080航徙,保存
3-2.png -
將生成的訪問(wèn)地址,發(fā)給測(cè)試他們?cè)囋嚢?/p>
六陷虎、Fastlane的使用
fastlane可以簡(jiǎn)化我們的操作到踏,之前的shell腳本那么長(zhǎng) 很不方便。在集成fastlane之前尚猿,咱們先創(chuàng)建一個(gè)新的jenkins任務(wù)窝稿,里面把上面講的git等相關(guān)的東西先弄好。
- 安裝fastlane
brew install fastlane
- 查看fastlane版本
fastlane --version
- 進(jìn)入你的
工程
目錄下,初始化凿掂,選擇4 然后下一步確認(rèn)鍵就可以了
fastlane init
- 成功后會(huì)生成fastlane文件夾伴榔,里面有Appfile、Fastfile兩個(gè)文件
- Appfile主要是填寫(xiě)你的app_identifier和apple_id賬號(hào)的, Fastfile就是你的操作文件了潮梯,里面包含了多個(gè)lane ,每個(gè)lane你就可以想成是個(gè)任務(wù)或者方法骗灶。
- 進(jìn)入你的
工程
目錄下,添加蒲公英插件,然后會(huì)多Gemfile Gemfile.lock Pluginfile文件
fastlane add_plugin pgyer
- 填寫(xiě)Appfile賬號(hào)信息
app_identifier "****"
apple_id "****"
- 編寫(xiě)fastlane任務(wù)秉馏,gym(clean:true,scheme:"XMHealth",configuration:"Release",export_method:"ad-hoc")耙旦,configuration有release和debug,export_method即導(dǎo)出參數(shù)有app-store, package, ad-hoc, enterprise, development, 和developer-iddevelopment。你搜一下里面有****的做一下替換萝究。至于lane傳參數(shù)免都,你可以看一下官網(wǎng)傳參的介紹。
default_platform(:ios)
platform :ios do
desc "build adhoc ipa"
lane :XMHealth_adhoc do
gym(clean:true,scheme:"****",configuration:"Release",export_method:"ad-hoc")
end
desc "build dev ipa"
lane :XMHealth_dev do
gym(clean:true,scheme:"****",configuration:"Debug",export_method:"development")
end
desc "upload to pgyer"
lane :uploadToPgyer do |options|
pgyer(api_key: "****", user_key: "****", update_description: options[:msg])
end
desc "upload to dingdingTalk"
lane :dingdingTalk do |options|
updatemsg = options[:msg]
buildName = get_info_plist_value(path: "./XMHealth/Other/Info.plist", key: 'CFBundleDisplayName')
puts buildName
curl = %Q{
curl 'https://oapi.dingtalk.com/robot/send?access_token=****' \
-H 'Content-Type:application/json' \
-d '{
"msgtype":"markdown",
"markdown":{
"title":"iOS#{buildName}App發(fā)布通知??????",
"text":"#### ??????iOS#{buildName}App發(fā)布成功\n說(shuō)明:#{updatemsg}\n###### 掃碼安裝↓↓↓\n![screenshot](https://www.pgyer.com/app/qrcode/****)\n#### @**** @**** 請(qǐng)注意查收"
},
"at":{
"atMobiles":["****","****"]
}
}'
}
system curl
end
desc "release"
lane :release do |options|
if options[:submit]
XMHealth_adhoc()
uploadToPgyer(msg:options[:msg])
dingdingTalk(msg:options[:msg])
puts "生產(chǎn)ad-hoc流水線成功"
else
XMHealth_dev()
uploadToPgyer(msg:options[:msg])
dingdingTalk(msg:options[:msg])
puts "測(cè)試dev流水線成功"
end
end
end
- jenkins里execute shell
## 項(xiàng)目名
TARGET_NAME=****
GITMSG=`git log -1 --pretty=%B`
MSG="${environment}帆竹、${GITMSG}"
cd ${TARGET_NAME}
pod install
## 編譯類型
if [[ "${environment}" == "生產(chǎn)環(huán)境" ]]; then
# 生產(chǎn)環(huán)境
fastlane release submit:true msg:${MSG}
else
# 測(cè)試環(huán)境
fastlane release submit:false msg:${MSG}
fi
- 專門搞一臺(tái)閑置的Mac天天開(kāi)著绕娘,在上面部署好,然后用花生殼栽连,開(kāi)放給測(cè)試险领、后臺(tái)他們使用
常見(jiàn)問(wèn)題
- 如果有Java相關(guān)的報(bào)錯(cuò),記得檢查你本地的環(huán)境變量還有安裝的Java秒紧,JAVA的默認(rèn)安裝目錄為 /Library/Java绢陌,看看里面是不是安裝了多個(gè),建議使用
java8
熔恢,jenkins默認(rèn)是Java11
的脐湾,
1.1 檢查. zshrc文件的里的環(huán)境變量JAVA_HOME,前往->文件夾-> ~/. zshrc
1.2 如果有缺JAVA_HOME叙淌,請(qǐng)?zhí)砑幽銓?duì)應(yīng)的Java地址
1.3 命令行里source .zshrc秤掌,保存一下
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home"
- 輸出里看到如下錯(cuò)誤
DVTPortal: Error:
Error Domain=DVTPortalServiceErrorDomain Code=1100 "Your session has expired. Please log in."
解決:
Xcode —>Preference—> Accounts
重新登錄,注意如果有多個(gè)賬號(hào)鹰霍,要確保所有的賬號(hào)都是登錄狀態(tài)闻鉴。
- 在jenkins里執(zhí)行xcodebuild -exportArchive 導(dǎo)出IPA命令的時(shí)候,會(huì)報(bào)錯(cuò)
error: exportArchive: The data couldn’t be read because it isn’t in the correct format.
Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/qx/qs4cc3pn0sgddxqjh7dj_k300000gn/T/ipatool-json-filepath-~~~FH2VEz}
** EXPORT FAILED **
Build step 'Execute shell' marked build as failure
Finished: FAILURE
解決:
將對(duì)應(yīng)打包的證書(shū)ExportOptions.plist
文件的compileBitcode
內(nèi)容由 true 改為 false 就可以
1茂洒、Could not find action, lane or variable 'pgyer'. Check out the documentation for more details: https://docs.fastlane.tools/actions
找不到蒲公英插件孟岛,原來(lái)是安裝目錄錯(cuò)了,應(yīng)該在工程目錄下安裝:fastlane add_plugin pgyer