一、Homebrew
Homebrew
是一款Mac OS
平臺下的軟件包管理工具
- 安裝Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- 檢測Homebrew是否安裝成功
brew -v
- 更新Homebrew
brew update
注意
1、Homebrew的命令是以brew開頭
2、Homebrew的默認安裝目錄為 /usr/local/Homebrew
3、通過brew 安裝的程序都會默認安裝到 /usr/local/Cellar/程序名/版本號/ 目錄下
二、Java
- Jenkins需要依賴java環境,當我們用最新的Homebrew來安裝Jenkins時會默認先安裝 java11,但是我們最好使用java8,Java8比較穩定,而且后面流水線要用bugly,bugly不支持Java11。
- brew安裝Java8
brew install --cask homebrew/cask-versions/adoptopenjdk8
- 檢測Java是否安裝成功
java -version
注意
1、JAVA的默認安裝目錄為 /Library/Java,如果你安裝多個版本,/Library/Java/JavaVirtualMachines里面就可以看到多個版本文件夾
二、Jenkins
Jenkins是開源軟件項目,基于Java開發的持續集成工具,用于監控持續重復的工作
- brew安裝Jenkins
brew install jenkins
- 檢測Jenkins是否安裝成功
jenkins --version
- 啟動jenkins
jenkins
jenkins是在前臺啟動關閉終端,jenkins就關閉了
- 設置jenkins后臺啟動、開機啟動
設置開機自啟動:sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist
取消開機自啟動:sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist
后臺啟動(默認端口):nohup java -jar jenkins.war &
后臺啟動(指定端口):nohup java -jar jenkins.war -httpPort=88 &
后臺啟動(HTTPS):nohup java -jar jenkins.war -httpsPort=88 &
- 根據提示輸入,安裝推薦的插件,注冊賬戶
- 你可以把所有的插件都安裝了,常用的有git相關Branch API Plugin、 Build With Parameters之類
三、流水線
-
創建新的流水線任務,名字你自己取
-
配置Discard old builds選項,就是多久釋放舊的構建
-
勾選This project is parameterized,選擇Choice Parameter,這邊的environment名字和內容,其實你都可以按需配置,只要和下面腳本里對的上就可以。這邊就是選擇對應的環境,開發、測試、生產
-
選擇Git Parameter,就是可以選擇對應的Git分支
-
Git源碼管理,填入你的源碼地址,我這邊用的是https的,點這個添加,輸入你的git賬號和密碼就可以了。
- 如果你是SSH,你就選擇SSH Username with private key,把ssh私鑰填進去
6.1 前往文件夾 ~/.ssh 可以看到本機是否已經生成過,有的話可以直接用,也可以生成新的
6.2 ssh-keygen -t rsa -C "youremail@example.com" 生成秘鑰;不需要更名稱和不需要密碼的話直接敲回車就行了。
6.3 生成成功之后,前往 ~/.ssh,里面三個文件id_rsa(私鑰)、id_rsa.pub(公鑰)、known_hosts
6.4 將id_rsa.pub(公鑰)配置到git,將id_rsa(私鑰)配置到jenkins里。
- 構建->增加構建步驟->
Execute shell
- 在填腳本,我們先把釘釘弄一下
8.1 釘釘和測試拉個群
8.2 群設置->智能群助手->添加自定義機器人
8.3 安全設置,必須要選一個,我選擇了關鍵詞 比較簡單一點,這個關鍵詞就是你機器人自動發的文字里必須要有這個關鍵詞才會發,例如發布
。復制Webhook
備用 - 查看蒲公英的
apikey
,在個人設置
里
- 因為xcodebuild打包需要
ExportOptions.plist
文件。所以前往文件夾~/.jenkins/workspace,在這個目錄下創建文件夾ExportOptions。 - 先手動導出你的IPA包,類型的話你就選ad-hoc,導出的文件里有個ExportOptions.plist,把它copy出來,放到剛剛的文件夾里,再復制一份然后修改里面的method屬性為
development
,把這個文件重命名為ExportOptions_dev.plist
。
- 因為我簽名是自動的,所以我不需要配證書什么的,比較方便,直接用了jenkins的腳本,如果你是手動的。還是用
fastlane
比較方便 - 輸入腳本,把腳本復制出來,你全局搜一下****,有****的地方就是你需要自己替換的
echo -e $(pwd)
## !/bin/sh
## 項目名
TARGET_NAME=****
## Scheme名
SCHEME=****
echo -e "============Pod Install============"
cd ${TARGET_NAME}
echo -e $(pwd)
pod install
##=======================
## 編譯類型
if [[ "${environment}" == "生產環境" ]]; then
# 生產環境
BUILD_TYPE=Release
## ExportOptions.plist文件的存放路徑,該文件要存放在這個路徑下內容如下
EXPORTOPTIONSPLIST=${JENKINS_HOME}/workspace/ExportOptions/ExportOptions.plist
else
# 測試環境
BUILD_TYPE=Debug
## ExportOptions.plist文件的存放路徑,該文件要存放在這個路徑下內容如下
EXPORTOPTIONSPLIST=${JENKINS_HOME}/workspace/ExportOptions/ExportOptions_dev.plist
fi
## 當前目錄
SORCEPATH=${WORKSPACE}
## workspace名
SPACE=${WORKSPACE}/${TARGET_NAME}/${TARGET_NAME}.xcworkspace
##xcarchive文件的存放路徑
ARCHIVEPATH=$SORCEPATH/build/$SCHEME.xcarchive
## ipa文件的存放路徑
EXPORTPATH=$SORCEPATH/build/$SCHEME
## 導出后的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============"
## 輸出關鍵信息
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============"
## 導出archive包
xcodebuild archive -workspace ${SPACE} -scheme ${SCHEME} -configuration ${BUILD_TYPE} -quiet -archivePath $ARCHIVEPATH
echo -e "============Build Archive Success============"
echo -e "============Export IPA============"
## 導出IPA包
xcodebuild -exportArchive -archivePath $ARCHIVEPATH -quiet -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST}
echo -e "============Export IPA SUCCESS============"
## 編譯完成時間
BUILD_DATE="$(date +'%Y%m%d_%H%M')"
## 上傳蒲公英
## apiKey和userKey需要在蒲公英的賬號設置中查找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 要不然數據會有""
buildName=`echo $data | jq -r '.buildName'`
#APP版本號
buildVersion=`echo $data | jq -r '.buildVersion'`
#APP下載二維碼
buildQRCodeURL=`echo $data | jq -r '.buildQRCodeURL'`
#釘釘通知
message="#### 【iOS${buildName}】${environment};V${buildVersion} 發布成功 \n 更新說明:${MSG} \n>掃描二維碼安裝: \n #### @****釘釘群里你需要at的人的手機號碼 請注意查收"
MSG_JSON='{"msgtype":"markdown","markdown":{"title":"'${buildName}'App發布通知","text":"'${message}'"},"at":{"atMobiles":["****釘釘群里你需要at的人的手機號碼"]}}'
curl 'https://oapi.dingtalk.com/robot/send?access_token=****釘釘機器人webhook' \
-H 'Content-Type:application/json' \
-d "${MSG_JSON}"
else
echo "蒲公英打包 Failed"
fi
-
構建任務
-
如果你需要在
git push
的時候自動執行,那就設置構建觸發器
,然后將這個GitLab webhook URL復制到你的項目設置里,一般叫網絡回調鉤子
。
四、分配角色權限
因為要給后端和測試同學使用,需要配置一下權限,給他們指定某些任務可以操作,具體的操作也只能是運行和取消。
- 安裝插件
Role-based Authorization Strategy
-
Manage Jenkins->Manage Users->新增用戶test
-
Manage Jenkins->Configure Global Security->勾選Role-Based Strategy ,保存(如果你沒有安裝Role-based Authorization Strategy插件是沒有這個選項的)
- Manage Jenkins->Manage and Assign Roles 進入角色管理
4.1 選擇Manage Roles
,這邊我的理解是用戶組的意思,你輸入一個用戶組的名字,選擇讀權限
4.2 輸入4.1你輸的用戶組名
,然后在Pattern
輸入對應的任務名字,進行綁定,選擇對應的權限。相當于你這個組下的用戶只能操作這個任務
4.3 選擇Assign Roles
,給對應的用戶組,分配用戶
4.4 綁定用戶組和用戶,拉到最下面有個保存
-
登錄test賬號,發現只能看到那一個任務,也只有運行和停止的操作 就OK了
五、外網映射
- 因為測試同學不一定和咱們處于同一個區域網,咱們需要給個
外網地址
給他們,那我們需要用到一個工具花生殼
,自行搜索下載?;ㄉ鷼つJ是開機自啟的,這個軟件有時候后端在測支付的時候 也是可以用它的。 -
添加映射
3-1.png -
輸入你本機的IP地址(按住option,去點擊你的WiFi圖標,可以看到你的IP),端口是8080,保存
3-2.png -
將生成的訪問地址,發給測試他們試試吧
六、Fastlane的使用
fastlane可以簡化我們的操作,之前的shell腳本那么長 很不方便。在集成fastlane之前,咱們先創建一個新的jenkins任務,里面把上面講的git等相關的東西先弄好。
- 安裝fastlane
brew install fastlane
- 查看fastlane版本
fastlane --version
- 進入你的
工程
目錄下,初始化,選擇4 然后下一步確認鍵就可以了
fastlane init
- 成功后會生成fastlane文件夾,里面有Appfile、Fastfile兩個文件
- Appfile主要是填寫你的app_identifier和apple_id賬號的, Fastfile就是你的操作文件了,里面包含了多個lane ,每個lane你就可以想成是個任務或者方法。
- 進入你的
工程
目錄下,添加蒲公英插件,然后會多Gemfile Gemfile.lock Pluginfile文件
fastlane add_plugin pgyer
- 填寫Appfile賬號信息
app_identifier "****"
apple_id "****"
- 編寫fastlane任務,gym(clean:true,scheme:"XMHealth",configuration:"Release",export_method:"ad-hoc"),configuration有release和debug,export_method即導出參數有app-store, package, ad-hoc, enterprise, development, 和developer-iddevelopment。你搜一下里面有****的做一下替換。至于lane傳參數,你可以看一下官網傳參的介紹。
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發布通知??????",
"text":"#### ??????iOS#{buildName}App發布成功\n說明:#{updatemsg}\n###### 掃碼安裝↓↓↓\n\n#### @**** @**** 請注意查收"
},
"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 "生產ad-hoc流水線成功"
else
XMHealth_dev()
uploadToPgyer(msg:options[:msg])
dingdingTalk(msg:options[:msg])
puts "測試dev流水線成功"
end
end
end
- jenkins里execute shell
## 項目名
TARGET_NAME=****
GITMSG=`git log -1 --pretty=%B`
MSG="${environment}、${GITMSG}"
cd ${TARGET_NAME}
pod install
## 編譯類型
if [[ "${environment}" == "生產環境" ]]; then
# 生產環境
fastlane release submit:true msg:${MSG}
else
# 測試環境
fastlane release submit:false msg:${MSG}
fi
- 專門搞一臺閑置的Mac天天開著,在上面部署好,然后用花生殼,開放給測試、后臺他們使用
常見問題
- 如果有Java相關的報錯,記得檢查你本地的環境變量還有安裝的Java,JAVA的默認安裝目錄為 /Library/Java,看看里面是不是安裝了多個,建議使用
java8
,jenkins默認是Java11
的,
1.1 檢查. zshrc文件的里的環境變量JAVA_HOME,前往->文件夾-> ~/. zshrc
1.2 如果有缺JAVA_HOME,請添加你對應的Java地址
1.3 命令行里source .zshrc,保存一下
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home"
- 輸出里看到如下錯誤
DVTPortal: Error:
Error Domain=DVTPortalServiceErrorDomain Code=1100 "Your session has expired. Please log in."
解決:
Xcode —>Preference—> Accounts
重新登錄,注意如果有多個賬號,要確保所有的賬號都是登錄狀態。
- 在jenkins里執行xcodebuild -exportArchive 導出IPA命令的時候,會報錯
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
解決:
將對應打包的證書ExportOptions.plist
文件的compileBitcode
內容由 true 改為 false 就可以
1、Could not find action, lane or variable 'pgyer'. Check out the documentation for more details: https://docs.fastlane.tools/actions
找不到蒲公英插件,原來是安裝目錄錯了,應該在工程目錄下安裝:fastlane add_plugin pgyer