僅需一鍵或配置時(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-in
SVN插件
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.keychain
和login.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,
3赎婚、SSH
去Jenkins->Credentials->System-> Global credentials配置SSH
一看就懂了刘绣,生成公鑰方式自行百度
4、構(gòu)建項(xiàng)目配置
新建一個(gè)任務(wù)名稱(chēng)隨便起
之后配置
1挣输、General
隨便起就行
2纬凤、源碼管理
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插件
這里就配置完事了源请,返回點(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屡贺、
三蠢棱、遇到的問(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