iOS持續(xù)集成篇

概述

持續(xù)集成是一種軟件開(kāi)發(fā)實(shí)踐,即團(tuán)隊(duì)開(kāi)發(fā)成員經(jīng)常集成他們的工作叁扫,通過(guò)每個(gè)成員每天至少集成一次仪糖,也就意味著每天可能會(huì)發(fā)生多次集成瘦锹。每次集成都通過(guò)自動(dòng)化的構(gòu)建(包括編譯,發(fā)布,自動(dòng)化測(cè)試)來(lái)驗(yàn)證篇梭,從而盡早地發(fā)現(xiàn)集成錯(cuò)誤币绩。

集成條件

  • 同一網(wǎng)段隧甚,局域網(wǎng)或外網(wǎng)
  • 配置Jenkins +fastlane +pgyer +webHook强岸,相關(guān)概念文章中做了簡(jiǎn)要說(shuō)明

主要實(shí)現(xiàn)流程

  • 上傳代碼到GitLab
  • webHook(鉤子)通知Jenkins
  • Jenkins收到消息自動(dòng)觸發(fā)構(gòu)建拉取上傳的最新代碼,執(zhí)行Shell腳本完成自動(dòng)化測(cè)試掩宜,自動(dòng)化代碼檢查蔫骂,打包上傳蒲公英等第三方App托管平臺(tái)
  • 第三方App托管平臺(tái)通過(guò)短信和郵件通知測(cè)試人員

最終將會(huì)實(shí)現(xiàn):你只用上傳代碼到服務(wù)器指定的分支??,剩下的工作都將自動(dòng)化,你的App最終將會(huì)直接到測(cè)試人員手中牺汤,省去中間重復(fù)無(wú)意義的工作流程

說(shuō)明:
1辽旋,研究持續(xù)集成,遇到的坑多不勝數(shù)檐迟,出現(xiàn)的問(wèn)題已在文章中做了說(shuō)明
2补胚,配置環(huán)境比較繁瑣,若你是單人開(kāi)發(fā)在本機(jī)構(gòu)建追迟,可只安裝使用fastlane溶其,使用文章最后提供的腳本完成自動(dòng)打包上傳的功能

一,前置環(huán)境

1.1敦间,安裝ruby環(huán)境 如果你安裝過(guò)CocoPods瓶逃,可輸入

$ ruby -v (顯示版本大于2.0不用安裝)

出現(xiàn)報(bào)錯(cuò)信息或者版本小于2.0,請(qǐng)參考此鏈接安裝或更新每瞒,此處不做累述金闽。

1.2,安裝brew

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝成功輸入剿骨,會(huì)跳轉(zhuǎn)到Homebrew官網(wǎng),即為成功

$ brew home

1.3埠褪,Jenkins依賴(lài)于Java環(huán)境浓利,首先需安裝和配置Java環(huán)境

$ brew cask install java 

1.4, 詳細(xì)命令可使用 brew help 查看


二挤庇,安裝fastlane

Fastlane 是一個(gè) ruby 腳本集合成的套件, 包括了向 App Store 提交新應(yīng)用或更新已有應(yīng)用所需要的常用任務(wù)贷掖,相比自定義腳本嫡秕,穩(wěn)定性和功能會(huì)更多。

  • gym 編譯打包生成 ipa 文件
  • deliver 用于上傳應(yīng)用的二進(jìn)制代碼苹威,應(yīng)用截屏和元數(shù)據(jù)到 App Store
  • sigh 可以生成并下載開(kāi)發(fā)者的 App Store 配置文件
  • snapshot 可以自動(dòng)化iOS應(yīng)用在每個(gè)設(shè)備上的本地化截屏過(guò)程

2.1昆咽,依次執(zhí)行下列命令

$ xcode-select --install

已安裝出現(xiàn)錯(cuò)誤提示:

xcode-select: error: command line tools are already installed, use    
"Software Update" to install updates ,可跳過(guò)這一步

未安裝牙甫,點(diǎn)擊安裝會(huì)出現(xiàn)彈框提示掷酗,點(diǎn)擊安裝

$ brew cask install fastlane (輸入密碼等待安裝成功)

安裝成功后提示: fastlane was successfully installed!

$ export PATH="$HOME/.fastlane/bin:$PATH"  (安裝成功后執(zhí)行)

$ fastlane env (查看fastlane當(dāng)前環(huán)境,會(huì)提示你是否復(fù)制到剪切板窟哺,輸入n即可)

$ fastlane -version (輸出版本信息即為成功)

2.2泻轰,安裝蒲公英插件

 $ fastlane add_plugin pgyer

2.3,在.xcodeproj項(xiàng)目目錄下且轨,初始化fastlane:

 $ fastlane init

終端會(huì)提示要你填寫(xiě)你的開(kāi)發(fā)者賬號(hào)與密碼浮声,然后fastlane會(huì)自動(dòng)檢測(cè)當(dāng)前目錄下項(xiàng)目的App Name和App Identifier、Project旋奢。然后自行確認(rèn)并按流程執(zhí)行

2.4泳挥,若你的項(xiàng)目使用了Cocopods,在Gemfile文件中加入下面代碼:

gem "cocoapods"

三至朗,安裝Jenkins

Jenkins是用java編寫(xiě)的開(kāi)源持續(xù)集成工具屉符,可在此步步驟做代碼靜態(tài)檢查,語(yǔ)法檢查爽丹,腳本自動(dòng)化測(cè)試筑煮,根據(jù)測(cè)試結(jié)果發(fā)布最穩(wěn)定的版本等,大公司用的比較多粤蝎,功能很強(qiáng)大真仲,支持多樣化的插件機(jī)制,支持Git初澎,SVN秸应。

Jenkins的安裝方式

  • pkg安裝,此方法會(huì)新建一個(gè)jenkins用戶(hù)后續(xù)會(huì)涉及了各種坑碑宴,不推薦
  • brew安裝软啼,相對(duì)第一種比較好
  • 最好的方案是使用tomcat+war部署Jenkins

3.1,點(diǎn)擊apache-tomcat-8.5.20下載文件延柠,并解壓重命名為T(mén)omcat祸挪,復(fù)制到資源庫(kù)目錄下

01.png

3.2,cd 到Tomcat文件的bin目錄下贞间,給sh文件賦予管理員權(quán)限贿条,按提示輸入密碼

$ sudo chmod 755 /Users/用戶(hù)名/Library/Tomcat/bin/*.sh

3.3雹仿, 然后執(zhí)行

$ sudo sh startup.sh
02.png

3.4,瀏覽器輸入 localhost:8080 打開(kāi)頁(yè)面如下整以,即安裝成功胧辽!

03.png

3.5,添加環(huán)境變量
因?yàn)閟tartup.sh與shutdown.sh需要在Tomcat的bin目錄下執(zhí)行公黑,每次輸入路徑比較麻煩邑商,設(shè)置以下環(huán)境變量即可

$ touch .bash_profile (創(chuàng)建bash_profile)
$ open -e .bash_profile(打開(kāi)bash_profile)
$ export PATH=$PATH:/Users/用戶(hù)名/Library/Tomcat/bin (在打開(kāi)的bash_profile中輸入) 
$ source .bash_profile (更新配置的環(huán)境變量)
$ echo $PATH (驗(yàn)證是否成功)

3.5,配置JENKINS_HOME凡蚜,這一步很重要人断,如果不配置將會(huì)創(chuàng)建到私有目錄下,各種權(quán)限訪問(wèn)不到番刊!

在Tomcat的bin目錄下含鳞,編輯 catalina.sh 文件 找到如下代碼

# OS specific support.  $var _must_ be set to either true or false.
在上面的代碼上面一行添加下面這句話,在引號(hào)中填入你的路徑芹务,
可在資源庫(kù)創(chuàng)建.jenkins文件夾用于存放蝉绷,如下圖所示
export JENKINS_HOME="Jenkins構(gòu)建的項(xiàng)目存放的路徑"
04.png
05.png

3.7,設(shè)置完畢上面的環(huán)境變量枣抱,可使用如下命令操作tomcat

$ sudo sh startup.sh  (啟動(dòng)tomcat)
$ sudo sh shutdown.sh (關(guān)閉tomcat)

3.8熔吗,下載war,將war文件移動(dòng)到Tomcat文件夾的webapps目錄下

06.png

3.9佳晶,打開(kāi)鏈接 localhost:8080/jenkins/ 啟用Jenkins桅狠,等待大概兩分鐘左右就啟動(dòng)完成了

開(kāi)啟secrets目錄權(quán)限,
$ sudo chmod 755 /Users/用戶(hù)名/.jenkins/secrets 

然后如下圖打開(kāi)initialAdminPassword轿秧,復(fù)制密碼粘貼到文本框中

07.png

3.10中跌,選擇左側(cè)的選項(xiàng),安裝jenkins推薦的插件就可以了

08.png

3.11菇篡,等待大概10分鐘左右就安裝完成了

09.png

3.12漩符,輸入對(duì)應(yīng)信息,防止忘記你可以使用你電腦的名稱(chēng)與密碼驱还,注意密碼忘記了你只能重裝Jenkins

10.png

3.13嗜暴,點(diǎn)擊開(kāi)始使用Jenkins按鈕

11.png
四,配置Jenkins

4.1议蟆,大功告成闷沥!點(diǎn)擊創(chuàng)建一個(gè)新任務(wù)

12.png

4.2,輸入項(xiàng)目名稱(chēng)咐容,選擇第一項(xiàng)構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目舆逃,點(diǎn)擊OK,有時(shí)候出現(xiàn)加載中的情況,多刷新幾次頁(yè)面即可

13.png

4.3颖侄,輸入描述信息鸟雏,項(xiàng)目構(gòu)建久了會(huì)有很多老舊的構(gòu)建不需要享郊,一個(gè)個(gè)刪除比較麻煩览祖,初始化項(xiàng)目可設(shè)置丟棄舊的構(gòu)建選項(xiàng),填寫(xiě)保持構(gòu)建的天數(shù)炊琉,保持構(gòu)建的最大個(gè)數(shù)展蒂,這里設(shè)置保持7天,最大構(gòu)建個(gè)數(shù)為30

14.png

4.4苔咪,點(diǎn)擊上方源碼管理菜單锰悼,選中Git選項(xiàng)
Repository URL:項(xiàng)目地址
Branch Specifier (blank for 'any') :分支,默認(rèn)為master团赏,這里設(shè)置的develoepr

15.png

4.5箕般,若你的Repository URL地址為SSH,你需要點(diǎn)擊Credentials 右側(cè) 的Add按鈕舔清,然后選中Jenkins選項(xiàng)配置SSH公鑰
Kind選項(xiàng)丝里,如下圖所示選擇SSH

16.png

4.6,選中 Private Key 的Enter directly 按鈕体谒,輸入用戶(hù)名與SHH公鑰杯聚,點(diǎn)擊Add

17.png

4.7,選中你所添加的用戶(hù)秘鑰抒痒,然后點(diǎn)擊最下方保存按鈕

18.png

4.6幌绍,添加shell腳本

選擇上面的構(gòu)建菜單,點(diǎn)擊底部增加構(gòu)建步驟故响,選擇第二項(xiàng) Execute shell

19.png

輸入如下腳本

#cd到項(xiàng)目fastlane文件夾所在根目錄傀广,一般為.xcodeproj所在目錄,這里是相對(duì)路徑
cd ./fastlane文件夾所在根目錄/

#打印當(dāng)前的路徑,驗(yàn)證是否正確
pwd

# 項(xiàng)目名稱(chēng)
IPANAME="項(xiàng)目名稱(chēng)"

echo "正在打包中..."

# 使用fastlane打包彩届,注意這里的scheme填入你項(xiàng)目對(duì)應(yīng)scheme即可
fastlane gym --scheme scheme --export_method ad-hoc --output_name ${IPANAME}

echo "上傳蒲公英..."

#注意:
#其中伪冰,USER_KEY 和 API_KEY 可以在蒲公英的「賬戶(hù)設(shè)置」中找到,之后進(jìn)行相應(yīng)替換惨缆。
#export_method 可以根據(jù)打包類(lèi)型進(jìn)行相應(yīng)設(shè)置糜值。
#可選的值有:app-store、ad-hoc坯墨、development寂汇、enterprise。
#對(duì)于 Xcode 8.3 以下的版本捣染,則不需要設(shè)置 export_method骄瓣。
curl -F "file=@${IPANAME}.ipa" -F "uKey=USER_KEY" -F "_api_key=API_KEY" https://qiniu-storage.pgyer.com/apiv1/app/upload

4.7,保存修改耍攘,回到主界面榕栏,點(diǎn)擊系統(tǒng)管理進(jìn)入系統(tǒng)設(shè)置
(全局設(shè)置&路徑)畔勤,勾選Environment variables, 終端輸入

$ echo $PATH 

復(fù)制輸出的值,在鍵值對(duì)列表中扒磁,鍵填入PATH庆揪,值填入復(fù)制輸出的值

配置Environment variables.png
4.8,定時(shí)構(gòu)建

選擇上面的構(gòu)建觸發(fā)器菜單

Build periodically選項(xiàng):
定時(shí)觸發(fā)構(gòu)建妨托,輸入H */1 * * *

 H */1 * * * (H */1 表示每小時(shí)任意分鐘執(zhí)行一次)

Poll SCM (poll source code management) 選項(xiàng)
輪詢(xún)?cè)创a管理,需要設(shè)置源碼的路徑才能起到輪詢(xún)的效果缸榛。一般設(shè)置為類(lèi)似結(jié)果: 0/5 每5分鐘輪詢(xún)一次

20.png

點(diǎn)擊保存,回到主界面點(diǎn)擊立即構(gòu)建兰伤,點(diǎn)擊#1可查看第一次構(gòu)建的信息

21.png

進(jìn)入點(diǎn)擊 左側(cè)Console Output 查看日志内颗,這里顯示打包上傳蒲公英成功!

22.png
4.9敦腔,自動(dòng)化構(gòu)建

4.9.1均澳,點(diǎn)擊最上方Jenkins頭像,回到主頁(yè)面符衔,點(diǎn)擊主頁(yè)面的系統(tǒng)配置按鈕

23.png

4.9.2找前,點(diǎn)擊第六項(xiàng),管理插件

24.png

4.9.3柏腻,選中可選插件選項(xiàng)纸厉,依次安裝插件

  • Gitlab Hook Plugin
  • GitLab Plugin
  • Build Authorization Token Root Plugin
25.png

4.9.4,安裝到最后一項(xiàng)的時(shí)候五嫂,勾選安裝完成后重啟Jenkins颗品,重啟后需要重新登錄,可選中在這臺(tái)計(jì)算機(jī)上保持登錄狀態(tài)

26.png

4.9.5沃缘,重新進(jìn)入項(xiàng)目的配置頁(yè)面躯枢,選擇上面的構(gòu)建觸發(fā)器菜單

  • 勾選Build when a change is pushed to GitLab. GitLab CI Service URL選項(xiàng)
  • 勾選觸發(fā)遠(yuǎn)程構(gòu)建 (例如,使用腳本)選項(xiàng),在終端輸入如下命令槐臀,獲取Token令牌锄蹂,填入身份驗(yàn)證令牌文本框
  $ openssl rand -hex 12
27.png

4.9.6,根據(jù)身份驗(yàn)證令牌下的提示水慨,拼接webHook URL

JENKINS_URL/job/tyfocgApp(iOS)/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME

例如如下鏈接得糜,中間不能有空格,如果是本機(jī)需要設(shè)置端口號(hào)
http://192.168.91.33:8080/buildByToken/build?job=tyfocgApp(iOS)&token=26acd09446289127aaa7f8d0

4.9.7晰洒,進(jìn)入GitLab對(duì)應(yīng)的項(xiàng)目朝抖,點(diǎn)擊左側(cè)菜單的Setting按鈕(此選項(xiàng)需要權(quán)限,沒(méi)有此選項(xiàng)找倉(cāng)庫(kù)管理員開(kāi)通)谍珊,選擇Web Hook 填入上方的地址治宣,點(diǎn)擊AddWebhook即可

什么是webhooks呢?

鉤子功能(callback),是幫助用戶(hù)push了代碼后侮邀,自動(dòng)回調(diào)一個(gè)您設(shè)定的http地址坏怪。 這是一個(gè)通用的解決方案,用戶(hù)可以自己根據(jù)不同的需求绊茧,來(lái)編寫(xiě)自己的腳本程序(比如發(fā)郵件铝宵,自動(dòng)部署等),例如你提交代碼到倉(cāng)庫(kù),釘釘上會(huì)有消息通知按傅,也是通過(guò)鉤子實(shí)現(xiàn)的捉超。

28.png

4.9.8,點(diǎn)擊下方的Test Hook按鈕測(cè)試此鏈接

鏈接有效
Hook successfully executed.
鏈接無(wú)效唯绍,請(qǐng)檢查Git服務(wù)器能否訪問(wèn)你的鏈接地址,如果是本地域名枝誊,請(qǐng)綁一下hosts况芒。需在同一網(wǎng)段,比如同是局域網(wǎng)環(huán)境叶撒,或同是外網(wǎng)環(huán)境
Hook execution failed. Ensure hook URL is correct and service is up.

此時(shí)需要再重啟一下GitLab服務(wù)器绝骚,此時(shí)可修改代碼,提交GitLab祠够,測(cè)試是否觸發(fā)構(gòu)建
如果點(diǎn)Test可以成功布署压汪,但提交git還是不會(huì)自動(dòng)布署,請(qǐng)執(zhí)行

$ /opt/codereview/phabricator/bin/phd start)

現(xiàn)在push代碼到develoer分支古瓤,你會(huì)發(fā)現(xiàn)Jenkins自動(dòng)執(zhí)行構(gòu)建任務(wù)止剖,checkout代碼, 觸發(fā)腳本打包上傳蒲公英落君,一分鐘后你將收到蒲公英的郵件短信通知??

五穿香,異常情況
  • 4.1,輸入sudo sh startup.sh 命令出現(xiàn)錯(cuò)誤提示:

    Cannot find ./catalina.sh
    The file is absent or does not have execute permission
    This file is needed to run this program
    
    終端輸入如下命令绎速,前面設(shè)置過(guò)有時(shí)候還是報(bào)錯(cuò)
    $ cd /Users/用戶(hù)名/Library/Tomcat/bin/
    $ chmod 777  *.sh
    
  • 4.2皮获, 出現(xiàn) fastlane: command not found

這個(gè)情況一般是由于 jenkins 沒(méi)有設(shè)置正確的 $PATH 環(huán)境變量導(dǎo) 致的。正確設(shè)置的方法為:

$ echo $PATH

記錄上面命令輸出的結(jié)果在Jenkins 中系統(tǒng)管理-系統(tǒng)設(shè)置中纹冤,
找到 環(huán)境變量(Environment variables)洒宝,選中此項(xiàng)
在 key 中填寫(xiě) PATH,在 value 中填寫(xiě)第一步中輸出的結(jié)果
保存即可

  • 4.3萌京, fastlane: command not found

    命令行報(bào)錯(cuò)
    -bash: fastlane: command not found
    終端輸入 $ echo $PATH   發(fā)現(xiàn)輸出內(nèi)容只有Tomcat的環(huán)境
    /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/rzj/Library/Tomcat/bin
    這時(shí)候輸入任何的 fastlane 命令都會(huì)報(bào)錯(cuò) fastlane: command not found
    $ which fastlane
    $ whereis fastlane
    以上兩個(gè)命令均沒(méi)有輸出信息
    這是輸入 $ rvm -v 會(huì)發(fā)現(xiàn) 報(bào)錯(cuò) rvm: command not found
    

    解決方法:

    重新載入RVM環(huán)境即可雁歌,造成的原因可能為上面修改環(huán)境變量造成的覆蓋
    $ source ~/.rvm/scripts/rvm
    
  • 4.4,關(guān)閉防止跨站點(diǎn)請(qǐng)求偽造功能

該功能可能造成使用直接POST請(qǐng)求觸發(fā)自動(dòng)構(gòu)建報(bào)錯(cuò)403枫夺,在Jenkins系統(tǒng)管理中點(diǎn)擊Configure Global Security将宪,去掉勾選防止跨站點(diǎn)請(qǐng)求偽造功能即可

29.png
  • 4.5,如果提示缺少 cloudbees-folder 的,可以前往這里下載其插件cloudbees-folder下載完成是一個(gè)hpi文件较坛,然后將該文件放到.jenkins的plugins里面即可印蔗,此情況一般不會(huì)遇到。

  • 4.6丑勤,注意安裝 JRE 华嘹,這個(gè)需要注意版本,如果版本不符合要求法竞,會(huì)無(wú)法訪問(wèn) Jenkins耙厚,由于版本問(wèn)題導(dǎo)致的無(wú)法訪問(wèn)會(huì)在 tomcat/logs目錄下生成 log 文件, localhost.日期.log 岔霸,內(nèi)部有如下的錯(cuò)誤提示薛躬,如果你也遇到這個(gè)問(wèn)題,升級(jí) JRE 就好呆细,注意 升級(jí)JRE 需要重啟電腦型宝。

    嚴(yán)重: Error configuring application listener of class    
            jenkins.util.SystemProperties  
            java.lang.UnsupportedClassVersionError:                  
            jenkins/util/SystemProperties : Unsupported major.minor   
           version 51.0 (unable to load class        
           jenkins.util.SystemProperties) .......
    
六,卸載Jenkins

5.1絮爷,通過(guò)安裝包安裝的卸載方式

  cmd+shift+g 前往文件夾 輸入
  /Library/Application\ Support/Jenkins/  
  點(diǎn)擊Uninstall.command 

5.1趴酣,通過(guò)Homebrew安裝的卸載方式

$ brew uninstall jenkins

5.3 通過(guò)Tomcat+war安裝刪除Tomcat對(duì)應(yīng)的Jenkin文件夾即可

六,fastfile腳本

打開(kāi)項(xiàng)目fastlane目錄下的文件夾坑夯,將下列代碼替換到Fastfile文件中

#使用方法 cd到項(xiàng)目.xcworkspace目錄 終端輸入 fastlane automaticPackagingUpload

# 定義fastlane版本號(hào)
fastlane_version “2.55.0” 

# 定義打包平臺(tái)
default_platform :ios

#指定項(xiàng)目的scheme名稱(chēng)
scheme = “ scheme”

#蒲公英api_key和user_key
api_key  = “api_key”
user_key = “user_key”


def updateProjectBuildNumber

currentTime = Time.new.strftime("%Y%m%d")
build = get_build_number()
if build.include?"#{currentTime}."
# => 為當(dāng)天版本 計(jì)算迭代版本號(hào)
lastStr = build[build.length-2..build.length-1]
lastNum = lastStr.to_i
lastNum = lastNum + 1
lastStr = lastNum.to_s
if lastNum < 10
lastStr = lastStr.insert(0,"0")
end
build = "#{currentTime}.#{lastStr}"
else
# => 非當(dāng)天版本 build 號(hào)重置
build = "#{currentTime}.01"
end
puts("*************| 更新build #{build} |*************")
# => 更改項(xiàng)目 build 號(hào)
increment_build_number(
build_number: "#{build}"
)
end


# 任務(wù)腳本
platform :ios do
lane :automaticPackagingUpload do|options|
branch = options[:branch]

puts “*************| 開(kāi)始打包.ipa文件 |*************”

updateProjectBuildNumber #更改項(xiàng)目build號(hào)

# 開(kāi)始打包
gym(
#輸出的ipa名稱(chēng)
output_name:”#{scheme}_#{get_build_number()}”,
#指定項(xiàng)目的scheme
scheme:"#{scheme}",
# 是否清空以前的編譯信息 true:是
clean:true,
# 指定打包方式岖寞,Release 或者 Debug
configuration:"Release",
# 指定打包所使用的輸出方式,目前支持app-store, package, ad-hoc, enterprise, development
export_method:"ad-hoc",
# 指定輸出文件夾
output_directory:"~/Desktop/fastlaneBuild",
)

puts “*************| 開(kāi)始上傳蒲公英 |*************”

# 開(kāi)始上傳蒲公英
pgyer(api_key: “#{api_key}”, user_key: “#{user_key}”)

puts “*************| 上傳蒲公英成功柜蜈!|*************”

end
end

使用方法
1仗谆,cd到項(xiàng)目.xcworkspace目錄

$ fastlane automaticPackagingUpload

2,在桌面fastlaneBuild目錄下生成對(duì)應(yīng)的.iap文件

ipa 文件上傳到蒲公英后通知其他人
如果開(kāi)發(fā)者想讓 Jenkins 打包并上傳 ipa 文件到蒲公英后跨释,自動(dòng)通知其他人(常用于通知 App 相關(guān)的測(cè)試者)胸私,那么可以利用蒲公英的通知功能。蒲公英本身已經(jīng)支持了郵件通知鳖谈、短信通知岁疼、微信通知。具體設(shè)置方法可以點(diǎn)擊這里查看: 接收應(yīng)用更新通知

八缆娃,后序

把一件事寫(xiě)明白捷绒,煞費(fèi)苦心,如果你閱讀了本文章贯要,有什么問(wèn)題歡迎交流暖侨,簡(jiǎn)書(shū)會(huì)不定期更新,喜歡的可以點(diǎn)關(guān)注??

30.jpg
九崇渗,參考鏈接

使用 Fastlane 上傳 App 到蒲公英 (官方文檔)
Git鉤子:自定義你的工作流 (推薦閱讀)
OC靜態(tài)代碼檢查及持續(xù)集成(xcode analyzer+oclint+xcpretty)
自動(dòng)化工具Fastlane: 安裝, 打包,上傳(testFlight,app store)
iOS自動(dòng)化打包發(fā)布(Jenkins + Fastlane + GitLab + 蒲公英)
自動(dòng)化測(cè)試定時(shí)構(gòu)建---Jenkins時(shí)間輪詢(xún)配置
Jenkins 定時(shí)構(gòu)建
關(guān)于Mac上部署Jenkins的一些個(gè)人習(xí)慣
APP主題測(cè)試自動(dòng)化:Fastlane篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末字逗,一起剝皮案震驚了整個(gè)濱河市京郑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葫掉,老刑警劉巖些举,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異俭厚,居然都是意外死亡户魏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)挪挤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叼丑,“玉大人,你說(shuō)我怎么就攤上這事扛门○牛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵尖飞,是天一觀的道長(zhǎng)症副。 經(jīng)常有香客問(wèn)我,道長(zhǎng)政基,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任闹啦,我火速辦了婚禮沮明,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窍奋。我一直安慰自己荐健,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布琳袄。 她就那樣靜靜地躺著江场,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窖逗。 梳的紋絲不亂的頭發(fā)上址否,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音碎紊,去河邊找鬼佑附。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仗考,可吹牛的內(nèi)容都是我干的音同。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秃嗜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼权均!你這毒婦竟也來(lái)了顿膨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叽赊,失蹤者是張志新(化名)和其女友劉穎恋沃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛇尚,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芽唇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了取劫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匆笤。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谱邪,靈堂內(nèi)的尸體忽然破棺而出炮捧,到底是詐尸還是另有隱情,我是刑警寧澤惦银,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布咆课,位于F島的核電站,受9級(jí)特大地震影響扯俱,放射性物質(zhì)發(fā)生泄漏书蚪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一迅栅、第九天 我趴在偏房一處隱蔽的房頂上張望殊校。 院中可真熱鬧,春花似錦读存、人聲如沸为流。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敬察。三九已至,卻和暖如春尔当,著一層夾襖步出監(jiān)牢的瞬間莲祸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工居凶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虫给,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓侠碧,卻偏偏與公主長(zhǎng)得像抹估,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弄兜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容