iOS jenkins持續(xù)集成

僅需一鍵或配置時(shí)間 就可以自動(dòng)打包通知測(cè)試童鞋,短信通知眼刃,公眾號(hào)通知绕辖,郵件通知等等~

一、jenkins安裝&配置

需要java環(huán)境擂红,自行安裝
JDK

java -version
1仪际、安裝

jenkins官網(wǎng)
找個(gè)穩(wěn)定版的下載安裝围小,一路下一步就行

安裝完之后會(huì)自動(dòng)打開(kāi)
http://localhost:8080

之后

打開(kāi)/Users/Shared/Jenkins/Home/secrets/initialAdminPassword 拷貝密碼,如果沒(méi)有打開(kāi)讀權(quán)限設(shè)置就好了

設(shè)置完之后可以更改密碼树碱,或保存在瀏覽器吧肯适,忘記了就去上面的路徑去找密碼

2、配置

之后進(jìn)入到系統(tǒng)管理-> 管理插件成榜,按需安裝

Xcode integration 構(gòu)建的時(shí)候可以用Xcode
Keychains and Provisioning Profiles Management 管理Keychainsd
GitLab Plugin 如果用GitLab需安裝
Gitlan Hook Plugin 如果用GitLab需安裝
Subversion Plug-inSVN插件
Email Extension Plugin 發(fā)送郵件插件
Upload to pgyer 上傳蒲公英
fir.im Jenkins 插件使用方法

jenkins證書(shū)配置

打開(kāi)鑰匙串把用到證書(shū)的權(quán)限開(kāi)放到全部程序(在鑰匙串訪(fǎng)問(wèn)去改)

~/Library/Keychains 里面的login.keychainlogin.keychain-db拷貝到

/Users/Shared/Jenkins/Library/Keychains下(沒(méi)有文件夾就創(chuàng)建一個(gè))

把~/Library/MobileDevice里的內(nèi)容拷貝到
/Users/Shared/Jenkins/Library/MobileDevice下(沒(méi)有文件夾就創(chuàng)建一個(gè))

需安裝插件Keychains and Provisioning Profiles Management
進(jìn)入系統(tǒng)管理框舔,進(jìn)入Keychains and Provisioning Profiles Management,

Keychains
3赎婚、SSH

去Jenkins->Credentials->System-> Global credentials配置SSH
一看就懂了刘绣,生成公鑰方式自行百度

4、構(gòu)建項(xiàng)目配置

新建一個(gè)任務(wù)名稱(chēng)隨便起

之后配置
1挣输、General
隨便起就行


2纬凤、源碼管理

gitssh.png

3、構(gòu)建觸發(fā)器
這里的效果是撩嚼,何時(shí)去打包停士,自行配置就行了

Poll SCM 輪詢(xún)的方法,輸入H/5 * * * *表示5分鐘check一次SVN/Git的路徑完丽,如果源碼有變化就構(gòu)建

4恋技、構(gòu)建

這了按需選擇了,Xcode需要安裝Xcode integration插件 Upload to pgyer需要Upload to pgyer插件

如果用Xcode 9 之后的版本會(huì)有個(gè)問(wèn)題舰涌,下面QA會(huì)講到
選擇Xcode的話(huà)感覺(jué)配置比較麻煩錯(cuò)誤較多猖任,不在敘述

也可以選擇用fastlane gym --export_method ad-hoc --output_name ${IPANAME}
需要安裝fastlane,這里我遇到一個(gè)小問(wèn)題does not contain an Xcode project or workspace瓷耙,解決方案“構(gòu)建 ”--“ xcode” -- “Advanced Xcode build options” -- “Xcode Project Directory”朱躺,這里填寫(xiě)你的項(xiàng)目工程所在目錄就可以了

參考腳本

#!/usr/bin/env bash

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120

rm -rf /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData
******隱藏代碼******
fastlane gym -w ${buildProjectDir}lazyaudio.xcworkspace --clean -o ${buildDir} -s lazyaudio -n "${buildIpaName}.ipa" -q ${buildConfigStr} --export_method ${exportMethod} -a
******隱藏代碼******

lftp << EOF
open ftp://xxxxxx:xxxxx@xxx.xxx.x.xxx
mkdir ${ftpPath}
cd ${ftpPath}
lcd ${ftpIpaPath}
mput *
close
bye
EOF


我這里用 xcodebuild方式打包
xcodebuild官方文檔

選擇Execute shell
添加腳本

記得把路徑改了

按需要更改configuration Release/Debug

之前的時(shí)候也可以去清理項(xiàng)目

xcodebuild \
-workspace "${project_name}.xcworkspace" \
-scheme "${scheme_name}"  \
-configuration "${development_mode}" \
clean

如果工程用到pod了的話(huà)需要 - workspace
否則 - project

生成archive包

xcodebuild \
archive -workspace "/Users/Shared/Jenkins/Home/workspace/工程名/xxx/xxx.xcworkspace" \
-scheme "xxx" \
-configuration "Debug" \
-archivePath "/Users/Shared/Jenkins/Home/workspace/工程名/build/xxx.xcarchive" \

ExportOptions.plist如果不會(huì)配置的話(huà),手動(dòng)打包之后導(dǎo)出搁痛,放到一個(gè)不會(huì)變的地方

生成ipa包

xcodebuild -exportArchive -archivePath "/Users/Shared/Jenkins/Home/workspace/工程名/build/xxx.xcarchive" \
-exportPath "/Users/Shared/Jenkins/Home/workspace/工程名/build" \
-configuration "Debug" \
-exportOptionsPlist "/Users/Shared/Jenkins/Home/workspace/工程名/ExportOptions.plist" \
-allowProvisioningUpdates \

之后需要上傳蒲公英或者fir长搀,添加響應(yīng)的插件,或腳本就行鸡典,去相應(yīng)的官網(wǎng)去查
pgyer腳本官方文檔

curl -F "file=@路徑.ipa" \
-F "uKey=XXX" \
-F "_api_key=XXX" \
-F "updateDescription=升級(jí)描述可以不寫(xiě)" \
https://www.pgyer.com/apiv1/app/upload

或者pgyer插件


aaa.png

fir腳本官方文檔

這里就配置完事了源请,返回點(diǎn)擊立即構(gòu)建,等著吧彻况,可能會(huì)遇到各種各樣的問(wèn)題參見(jiàn)QA

二谁尸、Other

2、Fastlane安裝

Fastlane是一套使用Ruby寫(xiě)的自動(dòng)化工具集纽甘,用于iOS和Android自動(dòng)化打包發(fā)布等工作良蛮,節(jié)約大量的時(shí)間
下面是安裝過(guò)程
1、檢查Ruby版本悍赢,需要2.0及以上版本

ruby -v

2决瞳、需要注意的是需要將gem的source改為https://gems.ruby-china.org/

gem sources

3货徙、檢查Xcode命令行工具是否安裝

xcode-select --install

4、安裝Fastlane

sudo gem install fastlane --verbose

5皮胡、檢查Fastlane是否安裝正確

fastlane --version
3痴颊、Mac 下執(zhí)行腳本

直接拖然后回車(chē)就行

如果報(bào)Permission denied,就是沒(méi)有權(quán)限

chmod 777 XX.sh

然后再次執(zhí)行就行

4屡贺、

獲取UDID

三蠢棱、遇到的問(wèn)題

這里有一些其他人總結(jié)的QA
http://www.reibang.com/p/8b2fc2da0466

Q1、
error: exportArchive: "APPNAME.app" requires a provisioning profile with the Push Notifications feature.

Error Domain=IDEProvisioningErrorDomain Code=9 ""APPNAME.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="APPNAME.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}

** EXPORT FAILED **
A1甩栈、

因?yàn)?Xcode 9 默認(rèn)不允許訪(fǎng)問(wèn)鑰匙串的內(nèi)容裳扯,必須要設(shè)置 allowProvisioningUpdates 才會(huì)允許,但是由于 Xcode integration 插件封閉谤职,并不能對(duì)其進(jìn)行修改加上這個(gè)屬性,所以決定使用 Shell 腳本代替插件亿鲜。

Q2允蜈、
User defaults from command line:
    IDEArchivePathOverride = /Users/Shared/Jenkins/Home/workspace/Test/build/RepaymentCreditCard.xcarchive

Build settings from command line:
    SDKROOT = iphoneos11.2
A2、

腳本中去掉-project APPNAME.xcodeproj -sdk iphoneos

Q3蒿柳、fastlane: command not found
A3饶套、

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

在命令行下執(zhí)行 echo $PATH垒探,記錄下輸出的結(jié)果
在 jenkins中系統(tǒng)管理-系統(tǒng)設(shè)置中妓蛮,找到 環(huán)境變量(Environment variables)
在 key 中填寫(xiě) PATH,在 value 中填寫(xiě)第一步中輸出的結(jié)果
保存即可圾叼。

附錄

xcodebuild + xcrun
# 工程名
APP_NAME="YourProjectName"
# 證書(shū)
CODE_SIGN_DISTRIBUTION="iPhone Distribution: Shanghai ******* Co., Ltd."
# info.plist路徑
project_infoplist_path="./${APP_NAME}/Info.plist"

#取版本號(hào)
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")

#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")

DATE="$(date +%Y%m%d)"
IPANAME="${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"

#要上傳的ipa文件路徑
IPA_PATH="$HOME/${IPANAME}"
echo ${IPA_PATH}
echo "${IPA_PATH}">> text.txt

//下面2行是沒(méi)有Cocopods的用法
echo "=================clean================="
xcodebuild -target "${APP_NAME}"  -configuration 'Release' clean

echo "+++++++++++++++++build+++++++++++++++++"
xcodebuild -target "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'

//下面2行是集成有Cocopods的用法
echo "=================clean================="
xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}"  -configuration 'Release' clean

echo "+++++++++++++++++build+++++++++++++++++"
xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'

xcrun -sdk iphoneos PackageApplication "./Release-iphoneos/${APP_NAME}.app" -o ~/"${IPANAME}"

使用gym自動(dòng)化打包
#計(jì)時(shí)

SECONDS=0

#假設(shè)腳本放置在與項(xiàng)目相同的路徑下

project_path=$(pwd)

#取當(dāng)前時(shí)間字符串添加到文件結(jié)尾

now=$(date +"%Y_%m_%d_%H_%M_%S")

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

scheme="DemoScheme"

#指定要打包的配置名

configuration="Adhoc"

#指定打包所使用的輸出方式蛤克,目前支持app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method參數(shù)

export_method='ad-hoc'

#指定項(xiàng)目地址

workspace_path="$project_path/Demo.xcworkspace"

#指定輸出路徑

output_path="/Users/your_username/Documents/"

#指定輸出歸檔文件地址

archive_path="$output_path/Demo_${now}.xcarchive"

#指定輸出ipa地址

ipa_path="$output_path/Demo_${now}.ipa"

#指定輸出ipa名稱(chēng)

ipa_name="Demo_${now}.ipa"

#獲取執(zhí)行命令時(shí)的commit message

commit_msg="$1"

#輸出設(shè)定的變量值

echo "===workspace path: ${workspace_path}==="

echo "===archive path: ${archive_path}==="

echo "===ipa path: ${ipa_path}==="

echo "===export method: ${export_method}==="

echo "===commit msg: $1==="

#先清空前一次build

gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}

#輸出總用時(shí)

echo "===Finished. Total time: ${SECONDS}s==="


部分參考

http://www.reibang.com/p/41ecb06ae95f
http://www.reibang.com/p/c7b951b9b4f2
http://www.reibang.com/p/9cb3d8c8c78d
http://www.reibang.com/p/1268118d490f
http://www.reibang.com/p/836579dd4837

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夷蚊,一起剝皮案震驚了整個(gè)濱河市构挤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惕鼓,老刑警劉巖筋现,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異箱歧,居然都是意外死亡矾飞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)呀邢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洒沦,“玉大人,你說(shuō)我怎么就攤上這事驼鹅∥⑽剑” “怎么了森篷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)豺型。 經(jīng)常有香客問(wèn)我仲智,道長(zhǎng),這世上最難降的妖魔是什么姻氨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任钓辆,我火速辦了婚禮,結(jié)果婚禮上肴焊,老公的妹妹穿的比我還像新娘前联。我一直安慰自己,他們只是感情好娶眷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布似嗤。 她就那樣靜靜地躺著,像睡著了一般届宠。 火紅的嫁衣襯著肌膚如雪烁落。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天豌注,我揣著相機(jī)與錄音伤塌,去河邊找鬼。 笑死轧铁,一個(gè)胖子當(dāng)著我的面吹牛每聪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播齿风,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼药薯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了救斑?” 一聲冷哼從身側(cè)響起果善,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎系谐,沒(méi)想到半個(gè)月后巾陕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纪他,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年鄙煤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茶袒。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梯刚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薪寓,到底是詐尸還是另有隱情亡资,我是刑警寧澤澜共,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锥腻,受9級(jí)特大地震影響嗦董,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘦黑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一京革、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幸斥,春花似錦匹摇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至经窖,卻和暖如春供搀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钠至。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胎源,地道東北人棉钧。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涕蚤,于是被迫代替她去往敵國(guó)和親宪卿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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