如查看解決流程搓茬、可直接翻到總結(jié)處
前言(可忽略)
項(xiàng)目在測試階段辣往,已經(jīng)配置完成遠(yuǎn)程Jenkins+Fastlane自動化打包AdHoc包,并且完善了各個實(shí)用功能:
- convert命令更改App圖標(biāo),添加版本號、build號帖蔓、打包時間等相關(guān)內(nèi)容,方便QA人員區(qū)分包版本
- Jenkins多參數(shù)化構(gòu)建瞳脓,構(gòu)建時可設(shè)置版本號、build號澈侠、選擇git分支劫侧、選擇釘釘通知人員等功能,并處理好各個參數(shù)的默認(rèn)值
- 接入Jenkins DingTalk插件哨啃,實(shí)現(xiàn)構(gòu)建失敗等意外情況發(fā)生時烧栋,可釘釘通知開發(fā)人員查看日志并解決
- Shell腳本實(shí)現(xiàn)打包完成后,自動上傳ipa包至Fir或蒲公英平臺
- Shell腳本實(shí)現(xiàn)包上傳至三方平臺后拳球,釘釘通知QA人員下載安裝新包進(jìn)行測試
- 接入Fastlane send_email插件审姓,實(shí)現(xiàn)打包完成后,郵件通知開發(fā)人員(個人空閑郵箱)
后續(xù)會將以上實(shí)現(xiàn)的功能進(jìn)行總結(jié)
- AdHoc包的自動化已經(jīng)趨近完善祝峻,但是正式包還是一直由我手動去打包并手動上傳至AppStore的魔吐。
- 之前我一直不建議正式包使用自動化的方式去構(gòu)建,原因是我認(rèn)為正式包不會去經(jīng)常構(gòu)建莱找,且出于
包大谐昴贰(比如fastlane ShenZhen會影響ipa包大小)奥溺、包安全性(之前有小伙伴用不同Xcode打出來的包運(yùn)行起來會導(dǎo)致閃退)
考慮還是手動更放心一些辞色。但是因?yàn)榘姹镜目焖俚視霈F(xiàn)各個版本穿插發(fā)布的情況浮定,自動化被迫(被現(xiàn)實(shí)打斚嗦)提上了日程。 - 考察了下桦卒,發(fā)現(xiàn)市面上其實(shí)有很多都有介紹正式包自動化的文章立美,說明我之前擔(dān)心的問題其實(shí)是多余的,所以就放手去做了這個事
一闸盔、前期準(zhǔn)備
還是采用Jenkins+Fastlane的方案悯辙,前期為了將AdHoc包和正式包區(qū)分開來,所以在Jenkins上,對此分別構(gòu)建了兩個Item躲撰,一個專門構(gòu)建AdHoc包针贬,一個專門構(gòu)建正式包。后期其實(shí)可以合并為一個Item拢蛋,用Jenkins的多參數(shù)構(gòu)建加以區(qū)分
二桦他、配置Jenkins
- 在AdHoc任務(wù)項(xiàng)的基礎(chǔ)上,去除convert更改圖標(biāo)谆棱、釘釘通知快压、郵箱通知、上傳三方平臺等QA輔助功能
- 更新fastlane文件垃瞧,更改對應(yīng)的正式包證書與配置文件
- fastlane添加deliver這個action蔫劣,上傳至AppStore(下面會詳細(xì)點(diǎn)總結(jié)下deliver)
三、Fastlane action之deliver
對于Fastlane最常用的兩個action个从,就是gym和deliver脉幢,gym是Shenzhen的進(jìn)階,作為App構(gòu)建使用的工具嗦锐。deliver是將二進(jìn)制上傳至App Store Connect的工具嫌松。其分別有自己對應(yīng)的配置項(xiàng),在fastlane官方文檔可查奕污,也可以使用fastlane action deliver
命令進(jìn)行查看萎羔。
下面是我從網(wǎng)上看到前人文章后二次總結(jié)的deliver部分常用的配置項(xiàng)及說明。
配置項(xiàng) | 說明 | 備注 |
---|---|---|
ipa | ipa壓縮包文件所在路徑 | |
pkg | pkg壓縮包文件所在路徑 | mac應(yīng)用使用 |
username | 上傳的蘋果郵箱賬號 | 默認(rèn)值為打包機(jī)鑰匙串存儲的賬號 |
app_identifier | 應(yīng)用程序的BundleId | |
team_id | 如果你在多個團(tuán)隊(duì)碳默,你的iTunes Connect團(tuán)隊(duì)的ID | |
team_name | 如果你在多個團(tuán)隊(duì)中贾陷,你的iTunes Connect團(tuán)隊(duì)的名字 | |
platform | 使用的平臺 | 默認(rèn)值為ios |
metadata_path | 包含元數(shù)據(jù)文件夾的路徑,元數(shù)據(jù)中保存的appStore中你應(yīng)用的具體內(nèi)容介紹(如標(biāo)題腻窒、描述) | |
screenshots_path | 包含屏幕快照文件夾的路徑 | 不建議使用昵宇,若使用則需遵循AppStoreConnect要求的規(guī)則 |
skip_screenshots | 不上傳屏幕快照 | 默認(rèn)值為false,建議設(shè)置為true |
skip_metadata | 不上傳元數(shù)據(jù) | 默認(rèn)值為false儿子,建議設(shè)置為true |
app_version | 應(yīng)該編輯或創(chuàng)建的App版本 | 默認(rèn)是Xcode中設(shè)置的版本號 |
build_number | build號 | 默認(rèn)是Xcode中設(shè)置的build號 |
force | 跳過HTML報告文件驗(yàn)證 | 默認(rèn)值為false瓦哎,建議設(shè)置為true |
submit_for_review | 在上傳所有內(nèi)容后提交新版本進(jìn)行審核 | 默認(rèn)值為false |
automatic_release | 審核通過后,是否自動發(fā)布 | 默認(rèn)值false |
auto_release_date | 審核通過后自動發(fā)布App Store的以毫秒為單位的日期 | 默認(rèn)值為false |
price_tier | 元數(shù)據(jù)相關(guān):價格層級 | 元數(shù)據(jù)相關(guān)的不建議在此使用 |
subtitle柔逼、name 蒋譬、description 、app_icon 等 | 元數(shù)據(jù)相關(guān):應(yīng)用程序副標(biāo)題愉适、名字犯助、描述、圖標(biāo)等 | 元數(shù)據(jù)的配置不建議自動化 |
generate_ipa(typePrefix,options,exportMethod,codeSigningIdentify,matchType)
deliver(
ipa: "./build/#{APP_NAME}.ipa",
skip_screenshots: true,
skip_metadata: true,
force: true,
submit_for_review: false
...
)
end
四维咸、Deliverfile
以上介紹了fastlane的其中一個action deliver的相關(guān)配置剂买,可以發(fā)現(xiàn)其實(shí)deliver的很多配置可以多個應(yīng)用是通用的惠爽,比如說使用的開發(fā)者郵箱、是否手動發(fā)布等配置項(xiàng)瞬哼。這時就可以建立一個與Fastfile同目錄的名為Deliverfile的文件婚肆,其顧名思義,就是deliver的配置文件坐慰,deliver的通用配置都可以在此文件中去設(shè)置较性。
app_identifier "com.xxx.xxxxx" # The bundle identifier of your app
username "xxx@xxx.cn" # your Apple ID user
automatic_release false
force true
...
注意:Deliverfile的優(yōu)先級要高于fastfile中deliver的配置
這樣另外一個App下Fastlane中deliver的一些通用配置就不用設(shè)置了,直接復(fù)制粘貼過來Deliverfile即可
五结胀、賬號登錄(雙重認(rèn)證)
做完以上這一切赞咙,覺得應(yīng)該萬事大吉了。打包機(jī)鑰匙串里也存有對應(yīng)的蘋果賬號的密碼糟港,所以瀟灑地按下立即構(gòu)建攀操。一段時間過后發(fā)現(xiàn)構(gòu)建成功了,但是并沒有收到蘋果的郵件啊~打開Jenkins的構(gòu)建日志如下:
Error: Unable to validate your application. Sign in with the app-specific password you generated.
If you forgot the app-specific password or need to create a new one, go to appleid.apple.com
打包雖然成功了秸抚,但是因?yàn)樘O果開發(fā)者賬號開啟了雙重認(rèn)證崔赌,所以僅有賬號和密碼還是不能夠成功登錄賬號的。于是屁顛地跑去fastlane官網(wǎng)尋找解決方案耸别,發(fā)現(xiàn)了這個:
fastlane官網(wǎng)針對雙重認(rèn)證情況下給出的deliver解決方案
可以看到官方給出四種方案,前兩種方案都是Manual verification(內(nèi)心MMP),后兩種有一個被標(biāo)記了deprecated县钥,那就只有第三個方案了??秀姐。正好解決了我的選擇困難癥。下面就介紹一下這個方案的流程:
- 生成一個不需要進(jìn)行短信認(rèn)證的application specific password若贮,這個需要到 蘋果開發(fā)者中心的賬號管理下進(jìn)行生成省有。注意生成后將其備份,因?yàn)轫撁嬉坏╆P(guān)閉將無法再次查看
- 執(zhí)行命令 fastlane spaceauth -u [開發(fā)者賬號]谴麦,生成FASTLANE_SESSION,將其備份
- 配置環(huán)境變量如下:
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=[application specific password(替換為你自己的)]
export FASTLANE_SESSION=[FASTLANE_SESSION(替換為你自己的)]
- 執(zhí)行source ~/.bash_profile使新增的環(huán)境變量生效蠢沿,分別執(zhí)行以下命令查看環(huán)境變量是否設(shè)置成功
echo $FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
echo $FASTLANE_SESSION
注意:
- 生成的FASTLANE_SESSION,真正的實(shí)體要從第一個value處開始到第一個value結(jié)束匾效,不要全部一股腦全部配置到環(huán)境變量文件中舷蟀,否則會因?yàn)楦袷絾栴}導(dǎo)致變量設(shè)置失敗
- 如官網(wǎng)提示,使用application specific password的情況下面哼,deliver不要做上傳二進(jìn)制之外的其他操作野宜,比如設(shè)置元數(shù)據(jù)等,否則可能會導(dǎo)致方案失效
六魔策、上傳二進(jìn)制文件至App Store Connect(雙重認(rèn)證)
做完以上操作后匈子,Jenkins重新構(gòu)建,一段時間后仍顯示成功闯袒,卻沒收到蘋果郵件虎敦。繼續(xù)查看Jenkins構(gòu)建日志如下:
Login to App Store Connect (xxx@xxx.cn)
Login successful
...
Uploading binary to App Store Connect
Going to upload updated app to App Store Connect
[32mThis might take a few minutes. Please don't interrupt the script.?[0m
[31mTransporter transfer failed.?[0m
[31mSign in with the app-specific password you generated. If you forgot the app-specific password or need to create a new one, go to appleid.apple.com (-22938)
?[0m
[31mYour account has 2 step verification enabled?[0m
[31mPlease go to [https://appleid.apple.com/account/manage?[0m](https://appleid.apple.com/account/manage%1B[0m)
[31mand generate an application specific password for?[0m
[31mthe iTunes Transporter, which is used to upload builds?[0m
[31mTo set the application specific password on a CI machine using?[0m
[31man environment variable, you can set the?[0m
[31mFASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD variable?[0m
可以看到這次賬號登錄成功了游岳,但是上傳二進(jìn)制到App Store Connect時再次被雙重認(rèn)證攔截,并且fastlane還給出了建議的解決方案其徙,仔細(xì)一看胚迫,MMP!@揲佟晌区!這不就是我解決登錄時的解決方案嗎?不禁感嘆用謊言去驗(yàn)證謊言通贞,得到的一定是謊言朗若。
所幸繼續(xù)往下看,發(fā)現(xiàn)這么兩句
[32mPlease provide your Apple Developer Program account credentials?[0m
[32mThe login information you enter will be stored in your macOS Keychain
這兩句給了我靈感昌罩,可以把keychain下開發(fā)者賬號對應(yīng)的密碼改為application specific password哭懈,我們可以使用CredentialsManager重設(shè)鑰匙串對應(yīng)的開發(fā)者賬號密碼。步驟如下:
可以看到官網(wǎng)上也是說這種方案會對持續(xù)集成的情況下有效
注意:application specific password和FASTLANE_SESSION的有效期為一個月左右茎用,所以切記要及時對環(huán)境變量和鑰匙串對應(yīng)的密碼進(jìn)行更新
后話
最后再次進(jìn)行重新構(gòu)建遣总,如愿看到以下日志信息:
[32mSuccessfully exported and compressed dSYM file?[0m
[32mSuccessfully exported and signed the ipa file:?[0m
...
Login to App Store Connect (xxx@xxx.cn)
Login successful
...
[32mSuccessfully set the version to '3.0.0'?[0m
Uploading binary to App Store Connect
Fetching password for transporter from environment variable named `FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD`
Going to upload updated app to App Store Connect
[32mThis might take a few minutes. Please don't interrupt the script.?[0m
[32miTunes Transporter successfully finished its job?[0m
[32m--------------------------------------------------------------------?[0m
[32mSuccessfully uploaded package to App Store Connect. It might take a few minutes until it's visible online.?[0m
[32m--------------------------------------------------------------------?[0m
[32mFinished the upload to App Store Connect?[0m
大功告成,登錄開發(fā)者后臺可以再次確認(rèn)一下是否上傳成功~
總結(jié)
- 基本的Jenkins+fastlane配置
- 配置fastlane的deliver轨功、Deliverfile
- 配置bash_profile環(huán)境變量旭斥,增加FASTLANE_SESSION、FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD變量古涧,使得CI情況下正常登錄雙重認(rèn)證賬號
- 使用CredentialsManager重設(shè)鑰匙串對應(yīng)的開發(fā)者賬號密碼為application specific password,使得CI情況下可以正常上傳二進(jìn)制包到雙重認(rèn)證賬號的后臺中