gitlable iphone_使用gitlab ci构建IOS包并发送通知消息到企业微信
在之前的文章中,我們介紹了使用gitlab ci構(gòu)建Android包的方法。今天我們介紹使用gitlab ci如何構(gòu)建IOS包,并且在打包成功或者失敗時(shí),如何將消息通知到企業(yè)微信。
如果對gitlab ci還不熟悉的,可以參考之前的文章使用gitlab ci構(gòu)建Android包,這篇文章我們主要涉及三個(gè)知識點(diǎn):
IOS開發(fā)者證書。
IOS打包命令。
如何往企業(yè)微信發(fā)消息。
IOS開發(fā)者證書
IOS打包離不開開發(fā)者證書,因此首先我們需要先搞清楚IOS的證書是怎么回事,它是怎么工作的。
為什么需要證書
我們知道,如果手機(jī)不越獄的情況下,iphone手機(jī)安裝app只能通過官方的App Store。這種限制是怎么做到的呢?其實(shí)很簡單,主要用到了非對稱加密。
首先蘋果官方生成一堆公私鑰,在所有的iphone手機(jī)里內(nèi)置了一個(gè)公鑰,在蘋果公司的后臺保存著私鑰。當(dāng)app開發(fā)者上傳app到App Store時(shí),會(huì)用保存在后臺的私鑰對App進(jìn)行簽名,在iphone手機(jī)上下載這個(gè)app后,用手機(jī)上的公鑰來驗(yàn)證這個(gè)簽名,如果簽名驗(yàn)證通過,則表示這個(gè)app是由蘋果后臺認(rèn)證的,并且沒有被篡改過。
基于這種簽名機(jī)制,保證了在iphone手機(jī)上安裝的每一個(gè)app都是經(jīng)過蘋果認(rèn)證允許的。
但是,一個(gè)新的問題來了,如果我們的app還處于開發(fā)中,還沒有上傳到appStore,該怎么安裝到iphone手機(jī)上呢?這就需要用到開發(fā)者證書在中間做一個(gè)過渡作用。
證書類型
常用的開發(fā)者證書分為兩種,一種是個(gè)人開發(fā)者證書,一種是企業(yè)開發(fā)者證書。其中,我們常見的有兩種模式:
In-House:企業(yè)內(nèi)部分發(fā),可以直接的安裝ipa包(一般是將包上傳到服務(wù)端,生成鏈接,點(diǎn)擊鏈接可以下載)。不過最新的ios系統(tǒng),需要在【通用—關(guān)于本機(jī)—證書信任設(shè)置】中對企業(yè)證書進(jìn)行信任。
Ad-Hoc:相當(dāng)于是企業(yè)分發(fā)的限制版,限制100個(gè)設(shè)備安裝,需要提前在蘋果后臺配置iphone設(shè)備的設(shè)備號(可通過第三方工具或者訪問蒲公英查詢)。
需要注意的是由企業(yè)證書簽名的包,是不能上傳到App Store的,因此需要根據(jù)自己公司的情況申請不同的開發(fā)者證書。
原理介紹
上面其實(shí)已經(jīng)提到,證書的工作原理是通過非對稱加密,從網(wǎng)上找了一幅圖,很好的介紹了這個(gè)過程:
上圖對應(yīng)的步驟如下:
在mac電腦上申請一對公私鑰,圖中是公鑰M和私鑰M。
對于蘋果的證書來說,跟App Store工作原理一樣,在蘋果后臺服務(wù)器放置了私鑰A,在蘋果設(shè)備上存放了對應(yīng)的公鑰A。
將公鑰M上傳到蘋果后臺,用私鑰A進(jìn)行簽名,得到包含公鑰M及其簽名。同時(shí)還有一個(gè)Provision profile(大家常說的pp文件)文件(其中包含了AppID、設(shè)備列表、App可使用的權(quán)限),將證書文件下載到本地mac。
在開發(fā)app時(shí),使用本地的私鑰M對app進(jìn)行簽名,連同上面的pp文件一起被打包到app中。
在安裝app時(shí),ios系統(tǒng)獲取證書,通過內(nèi)置的公鑰A,去驗(yàn)證app內(nèi)的證書是正確的。如果能驗(yàn)證通過,則可以將App內(nèi)的證書數(shù)據(jù)取出來,使用公鑰M驗(yàn)證App的簽名是否正確,驗(yàn)證安裝app的設(shè)備ID是否存在設(shè)備列表中等。
上面的步驟,大致描述了蘋果開發(fā)者證書的工作原理,如果你沒太理解也沒關(guān)系。可以結(jié)合著上圖多看幾遍。
另外,這里還有個(gè)知識點(diǎn),在mac電腦申請的公鑰和私鑰M只能在申請的電腦使用,怎么讓其他伙伴也能正常使用呢?可以將私鑰M導(dǎo)出成.p12文件,其他Mac電腦導(dǎo)入私鑰M,就可以正常使用了。
IOS打包
首先打包之前,需要清理工程(workspace和scheme參數(shù)的值需要拿到ios代碼才能查看):
$ xcodebuild clean -workspace xxxx.xcworkspace -scheme xxxx
其次,如果你想要ios包的構(gòu)建號是自動(dòng)遞增的,可以使用agvtool這個(gè)工具:
$ agvtool next-version -all
接著,就可以開始archive包(對Target進(jìn)行編譯、歸檔,生成.xcarchive)。
$ xcodebuild -workspace xxxx.xcworkspace -scheme xxxx -configuration Debug archive -archivePath xxxxPath/xxxxx.xcarchive
最后,就是將歸檔文件導(dǎo)出,生成不同渠道的ipa包:
$ xcodebuild -exportArchive -archivePath build/$SCHEME_NAME.xcarchive -exportPath build -exportOptionsPlist $EXPORT_OPTIONS_PLIST
這里需要指定一個(gè)exportOptionsPlist,是對導(dǎo)出ipa的配置,我這里寫的比較簡單,格式如下:
compileBitcode
destination
export
method
development
signingStyle
automatic
stripSwiftSymbols
teamID
xxxxxxxx
thinning
<none>
如果你覺得使用命令行的方式相對麻煩的話,可以考慮使用打包工具fastlane(后面我再專門寫文章介紹)。
發(fā)送消息通知
企業(yè)微信中可以創(chuàng)建一個(gè)群機(jī)器人,然后通過webhook來進(jìn)行消息通知。企業(yè)微信提供了詳細(xì)的配置方式,可以參考:企業(yè)機(jī)器人配置。其本質(zhì)上就是發(fā)送了一個(gè)請求:
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "hello world"
}
}'
我們只需要將key替換成我們創(chuàng)建機(jī)器人的key即可。
整合之后的.gitlab-ci.yml配置文件
最后貼一個(gè)我在項(xiàng)目中使用的配置文件,如下所示:
variables:
CONFIGURATION: "Debug"
WORKSPACE: "xxxx.xcworkspace"
SCHEME_NAME: "xxxx"
EXPORT_MAIN_DIRECTORY: "build"
EXPORT_OPTIONS_PLIST: "ExportOptions-dev.plist"
CODE_SIGN_IDENTITY: "xxxxxx"
PROVISIONING_PROFILE: "xxxxx"
LANG: "en_US.UTF-8"
stages:
- makedir
- archive
- ipa
- upload
- notify
# 創(chuàng)建對應(yīng)目錄
dir_job:
stage: makedir
script:
- mkdir $EXPORT_MAIN_DIRECTORY
- EXPORT_MAIN_DIRECTORY=$EXPORT_MAIN_DIRECTORY/$(date "+%Y%m%d%H%M%S")
- echo $EXPORT_MAIN_DIRECTORY
- mkdir $EXPORT_MAIN_DIRECTORY
tags:
- ios
# 構(gòu)建archive
archive_job:
stage: archive
script:
- agvtool next-version -all # 更新構(gòu)建號,版本號之后再更新
- xcodebuild clean -workspace $WORKSPACE -scheme $SCHEME_NAME
- xcodebuild -workspace $WORKSPACE -scheme $SCHEME_NAME -configuration Debug archive -archivePath $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive
artifacts:
expire_in: '2 day'
name: "下載xcarchive,保留2天"
paths:
- $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive
tags:
- ios
# 導(dǎo)出ipa
ipa_job:
stage: ipa
script:
- echo 'export ipa'
- xcodebuild -exportArchive -archivePath $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.xcarchive -exportPath $EXPORT_MAIN_DIRECTORY -exportOptionsPlist $EXPORT_OPTIONS_PLIST
artifacts:
expire_in: '5 day'
name: "下載ipa,保留5天"
paths:
- $EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.ipa
only:
- qa
tags:
- ios
# 上傳ipa
upload_job:
stage: upload
script:
- curl -H "Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVlOTE4Yzc5MmMzZGQ0MDAxZTRiOGY1YiIsInVzZXJuYW1lIjoic3VodWNoZW4ddiLCJlbWFdddpbCI6InN1aHVjaGVuQHFxLmNvbSJ9LCJleHAiOjQ3NDAxOTcyODgsImlhdCI6MTU4NjU5NzI4OH0.5UUkM4lJddYrnvXvHaNNJIY_j5OsBQmLw0mBUrXG3d9E4" -F "file=@$EXPORT_MAIN_DIRECTORY/$SCHEME_NAME.ipa" http://上傳包地址/api/apps/5e916b9eac2363001dd7554a/upload
only:
- qa
tags:
- ios
# 構(gòu)建失敗時(shí)的通知消息
notifyFailWeChat:
stage: notify
script:
- curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=26b07c1b-03ea-49da-afc7-f68a359f2a52' -H 'Content-Type:application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"ios項(xiàng)目構(gòu)建結(jié)果:失敗\n>本次構(gòu)建由:$GITLAB_USER_NAME 觸發(fā)\n>項(xiàng)目名稱:$CI_PROJECT_NAME\n>提交號:$CI_COMMIT_SHA\n>提交日志:$CI_COMMIT_MESSAGE\n>構(gòu)建分支:$CI_COMMIT_BRANCH\n>流水線地址:[$CI_PIPELINE_URL]($CI_PIPELINE_URL)\"}}"
tags:
- ios
only:
- qa
when: on_failure
# 構(gòu)建成功時(shí)的通知消息
notifySuccessWeChat:
stage: notify
script:
- curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=26b07c1b-03ea-49da-afc7-f68a359f2a52' -H 'Content-Type:application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"ios項(xiàng)目構(gòu)建結(jié)果:成功\n>請前往發(fā)布平臺下載體驗(yàn):[下載地址](http://app下載地址)\n>本次構(gòu)建由:$GITLAB_USER_NAME 觸發(fā)\n>項(xiàng)目名稱:$CI_PROJECT_NAME\n>提交號:$CI_COMMIT_SHA\n>提交日志:$CI_COMMIT_MESSAGE\n>構(gòu)建分支:$CI_COMMIT_BRANCH\n>流水線地址:[$CI_PIPELINE_URL]($CI_PIPELINE_URL)\"}}"
tags:
- ios
only:
- qa
when: on_success
總結(jié)
如果你們公司目前還沒搞起來Jenkins,我推薦嘗試用gitlab實(shí)現(xiàn)ci/cd流水線,因?yàn)榭梢詼p少很多配置和插件的安裝。相對來說實(shí)現(xiàn)成本更低一些,從目前我用gitlab ci的情況來看,基本上Jenkins能實(shí)現(xiàn)的gitlab ci都能滿足。
總結(jié)
以上是生活随笔為你收集整理的gitlable iphone_使用gitlab ci构建IOS包并发送通知消息到企业微信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 领先水平!国产芯片厂商富满微确认5G射频
- 下一篇: 操作表格_Excel表格基础操作-新手入