自動(dòng)化打包
使用的工具是jenkins,Jenkins 是一個(gè)開源項(xiàng)目粹断,提供了一種易于使用的持續(xù)集成系統(tǒng),主要用于自動(dòng)化打包
安裝
命令行安裝
$ brew install jenkins
卸載
$ brew uninstall jenkins
初始化配置
啟動(dòng)jenkins
$ jenkins
在瀏覽器中配置jenkins癌压,
初始化配置
瀏覽器輸入localhost:8080
這樣就打開Jenkins管理頁面了,此時(shí)有一個(gè)默認(rèn)的管理員jenkins撰洗,瀏覽器進(jìn)入重置密碼頁面
初始密碼在/Users/dyn/.jenkins/secrets/initialAdminPassword(初始化完成后自動(dòng)消失)
然后就是如下圖片篮愉,依次選擇即可
創(chuàng)建用戶
輸入用戶名,密碼差导,郵件這些试躏,就算初始化配置完成了
安裝需要的插件
安裝插件的位置:系統(tǒng)管理->管理插件,在“可選插件”
GitLab插件
用來管理源代碼设褐,位置:“可選插件”列表中“GitLab Plugin”和“Gitlab Hook Plugin”兩項(xiàng)
Xcode插件
用于完成xcode命令打包颠蕴,位置在“可選插件”列表中“Xcode integration”選項(xiàng)
簽名證書管理插件
用于iOS打包內(nèi)測版時(shí),需要發(fā)布證書及相關(guān)簽名文件助析,位置在“可選插件”中選中“Credentials Plugin”和“Keychains and Provisioning Profiles Management”兩項(xiàng)裁替。
腳本插件
用于在build后執(zhí)行相關(guān)腳本。位置在“可選插件”中選中“Post-Build Script Plug-in”選擇貌笨。
設(shè)置apple development證書
新建任務(wù)及打包
新建任務(wù)
安裝完插件后的頁面如下:
點(diǎn)擊創(chuàng)建一個(gè)新任務(wù)來開始第一個(gè)項(xiàng)目
選擇第一個(gè) “構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目”
任務(wù)配置
選中任務(wù)名->配置
基本信息弱判,這里可以設(shè)置包的保留天數(shù)還有個(gè)數(shù)。(可略過)锥惋。見下圖
源碼管理昌腰,設(shè)置代碼的獲取方式
]
Repository URL:項(xiàng)目的git地址
Add按鈕:進(jìn)行認(rèn)證權(quán)限开伏,就是添加git的用戶名密碼
填寫好用戶和密碼,點(diǎn)擊下面的Add按鈕,然后Credentials下拉框就會(huì)出現(xiàn)這個(gè)用戶
下載代碼
此時(shí)保存遭商,然后選擇立即構(gòu)建固灵,就可以下載代碼
ios構(gòu)建版本配置
構(gòu)建觸發(fā)器
定時(shí)自動(dòng)打包的配置,
具體寫法參見http://blog.csdn.net/e295166319/article/details/52920036
構(gòu)構(gòu)建環(huán)境(掠過)
構(gòu)建(添加構(gòu)建步驟)
選擇xcode就是使用xcode 命令行打包
選擇execute shell 就是使用運(yùn)行shell腳本打包
xcode 命令行打包配置,參見本地jenkins服務(wù)器的test1項(xiàng)目
需要選擇的選項(xiàng)介紹
Target:就是我們在項(xiàng)目中建立的Target
命令行查看所有target
xcodebuild -list
Clean before build?:
編譯前是否clean一次劫流,一般是選擇YES巫玻,也可不選
Configuration:
對應(yīng)的是xcodebuild命令里的-configuration的參數(shù),可選項(xiàng)為[Debug祠汇、Release]仍秤,一般都填Debug
Pack application and build .ipa?:
結(jié)束時(shí)是否要產(chǎn)生對應(yīng)的ipa文件,選中即可
.ipa filename pattern:
配置ipa的文件名可很,比如${VERSION}_${BUILD_DATE}
其中${VERSION}和${SVN_REVISION}都是可以直接用的環(huán)境變量诗力,所有可用的環(huán)境變量地址為:http://localhost:8080/env-vars.html
Output directory:
配置ipa的輸出目錄。比如$WORKSPACE/build/ipa-build
證書配置
Development Team ID :團(tuán)隊(duì)id我抠,在keychain的distrubution證書名稱的()中就是
Keychain path 固定路徑
Keychain password:應(yīng)該是p12文件密碼
Advanced Xcode build options
Xcode Schema File:對應(yīng)的是xcodebuild命令中的-scheme的參數(shù)
Xcode Workspace File:xcodebuild中的-workspace的變量苇本,是.xcworkspace的文件路徑,從工程總文件夾開始寫菜拓,切無后綴名
Xcode Project Directory:同理是單工程的工程文件名瓣窄,無后綴名
Build output directory:ipa的路徑
shell打包腳本
特點(diǎn):自動(dòng)讀取參數(shù)配置文件
自動(dòng)循環(huán)打包
參考本地jenkins服務(wù)器的項(xiàng)目shelldemo
#獲取當(dāng)前工程路徑,即工程的總文件夾
projectPath=$PWD
echo $projectPath
#工程名
projectName="ElinkIphoneClientApp"
projectPath=${projectPath}/${projectName}
#target名字
targetName="ElinkIphoneClientApp"
#fir的api token
apiToken="ceea173a583a842243b7d08af5a0a870"
#配置文件路徑
configPath=${projectPath}/buildConfig.txt
#plist文件路徑
appInfoPlistPath=${projectPath}/${projectName}/Info.plist
#配置文件相關(guān)
#服務(wù)器地址key
serviceURLKey="serviceURL"
#顯示名稱key
displayNameKey="name"
#開發(fā)證書的key
developmentCodeSignIdentifyKey="developmentCodeSignIdentify"
#開發(fā)證書的描述文件key
developmentProvisionProfileKey="developmentProvisionProfile"
#發(fā)布證書的key
appstoreCodeSignIdentifyKey="appstoreCodeSignIdentify"
#發(fā)布證書的描述文件Key
appstoreProvisionProfileKey="appstoreProvisionProfile"
#默認(rèn)服務(wù)器地址
serviceURLStr="http://www.xaelink.com:8096"
#顯示名稱.默認(rèn)是工程名
displayName=$projectName
#開發(fā)證書名稱
developmentCodeSignIdentify=""
#開發(fā)證書的描述文件
developmentProvisionProfile=""
#發(fā)布證書
appstoreCodeSignIdentify=""
#發(fā)布證書的描述文件
appstoreProvisionProfile=""
#打印plist文件內(nèi)容
#/usr/libexec/PlistBuddy -c "print" ${appInfoPlistPath}
#讀取配置文件內(nèi)容.并以此替換plist 文件纳鼎,然后打包
cat ${configPath} | while read line
do
#獲取等號(hào)左邊的值
tempKey=${line%%=*}
#服務(wù)器地址
if [ "${serviceURLKey}" == "${tempKey}" ] ; then
serviceURLStr=${line##*=}
echo "serviceURLStr=${serviceURLStr}"
#替換plist 文件的ServicesURLStr字符串
/usr/libexec/PlistBuddy -c "set :ServicesURLStr $serviceURLStr" ${appInfoPlistPath}
#程序顯示名稱
elif [ "${displayNameKey}" == "${tempKey}" ] ; then
displayName=${line##*=}
echo "displayName=${displayName}"
#替換plist 文件的應(yīng)用程序名
/usr/libexec/PlistBuddy -c "set :CFBundleDisplayName $displayName" ${appInfoPlistPath}
/usr/libexec/PlistBuddy -c "set :CFBundleName $displayName" ${appInfoPlistPath}
#開發(fā)證書名稱
elif [ "${developmentCodeSignIdentifyKey}" == "${tempKey}" ] ; then
developmentCodeSignIdentify=${line##*=}
echo "developmentCodeSignIdentify=${developmentCodeSignIdentify}"
#開發(fā)證書的描述文件
elif [ "${developmentProvisionProfileKey}" == "${tempKey}" ] ; then
developmentProvisionProfile=${line##*=}
echo "developmentProvisionProfile=${developmentProvisionProfile}"
#發(fā)布證書
elif [ "${appstoreCodeSignIdentifyKey}" == "${tempKey}" ] ; then
appstoreCodeSignIdentify=${line##*=}
echo "appstoreCodeSignIdentify=${appstoreCodeSignIdentify}"
#發(fā)布證書的描述文件
elif [ "${appstoreProvisionProfileKey}" == "${tempKey}" ] ; then
appstoreProvisionProfile=${line##*=}
echo "appstoreProvisionProfile=${appstoreProvisionProfile}"
#讀取到最后一個(gè)參數(shù)后康栈,開始打包
#建立一些需要的文件路徑
basepath=${projectPath}
#編譯輸出文件夾名稱
myfile="autobuild"
#日志文件路徑
logPath="${basepath}/${myfile}/log.rtf"
#編譯模式,debug 還是release,默認(rèn)是release
configuration="Release"
#工作環(huán)境名稱
workspaceName="${projectName}.xcworkspace"
#scheme 名字
scheme="${targetName}"
#build 路徑
configurationBuildDir="${basepath}/${myfile}/build"
#archive路徑
archivepath="${basepath}/${myfile}/archive/${projectName}.xcarchive"
#ipa 文件路徑
#當(dāng)前時(shí)間
qs_date=`date +%Y_%m_%d_%H_%M_%S`
#ipa導(dǎo)出的文件夾路徑喷橙,按時(shí)間排序
exportpath="${basepath}/${myfile}/ipa/${projectName}_${qs_date}"
#appstore的ipa到處路徑
appstorepath="${basepath}/${myfile}/appstore/${projectName}_${qs_date}"
#導(dǎo)出配置路徑,暫不需要
exportOptionsPlist="${basepath}/${myfile}/DevelopmentExportOptions.plist"
#ipa的真實(shí)路徑
ipaPath="${exportpath}/${scheme}.ipa"
#appstore的ipa真實(shí)路徑
appstoreipaPath="${appstorepath}/${scheme}.ipa"
cd ${basepath}
#clear
echo "\033[31m Start Clear!\033[0m" #輸出顏色為紅色的Start Clear!
rm -f $logPath #強(qiáng)制刪除日志文件
xcodebuild clean -configuration "${configuration}" >> $logPath || exit
echo "\033[31m clear success!\033[0m"
#先打開發(fā)者包登舞,上傳到fir上
#打包
echo "\033[31m Start archive!\033[0m"
xcodebuild archive -workspace "${workspaceName}" -scheme "${scheme}" -configuration "${configuration}" -archivePath "${archivepath}" CODE_SIGN_IDENTITY="${developmentCodeSignIdentify}" PROVISIONING_PROFILE="${developmentProvisionProfile}" >> $logPath || exit
echo "\033[31m archive success!\033[0m"
#導(dǎo)出ipa 包
echo "\033[31m Start export ipa!\033[0m"
echo "exportPath=${exportpath}"
xcodebuild -exportArchive -archivePath "${archivepath}" -exportPath "${exportpath}" -exportOptionsPlist "${exportOptionsPlist}" >> $logPath || exit
echo "\033[31m Export ipa success!,ipa path :${ipaPath}\033[0m"
#打包發(fā)布者包
#上傳到appstore的包贰逾,準(zhǔn)備上傳
else
echo "-----------"
fi
done
關(guān)鍵命令解釋:
PlistBuddy:是Mac自帶的專門解析plist的小工具
PlistBuddy使用詳解
參考網(wǎng)址http://www.reibang.com/p/2167f755c47e
使用PlistBuddy打印plist 內(nèi)容
/usr/libexec/PlistBuddy -c "print" ${appInfoPlistPath}
使用PlistBuddy給plist添加內(nèi)容
添加字符串
/usr/libexec/PlistBuddy -c 'Add :Version string 1.0' test.plist
Version是鍵
string是類型
1.0是值
添加數(shù)組
# 先添加key值
/usr/libexec/PlistBuddy -c 'Add :ApplicationInfo array' test.plist
# 添加value值
/usr/libexec/PlistBuddy -c 'Add :ApplicationInfo: string app1' test.plist
/usr/libexec/PlistBuddy -c 'Add :ApplicationInfo: string app2' test.plist
添加字典
# 先添加key值
/usr/libexec/PlistBuddy -c 'Add :Person dict' info.plist
# 添加value值
/usr/libexec/PlistBuddy -c 'Add :Age string secret' info.plist
/usr/libexec/PlistBuddy -c 'Add :Name string yans67'
info.plist
PlistBuddy替換plist已有鍵值的內(nèi)容
/usr/libexec/PlistBuddy -c "set :CFBundleDisplayName $displayName" ${appInfoPlistPath}
-c:意思是執(zhí)行后面“”內(nèi)的命令
CFBundleDisplayName:是plist 存在的鍵
$displayName:是新的值
${appInfoPlistPath} :plist 文件內(nèi)容
刪除某個(gè)字段
/usr/libexec/PlistBuddy -c 'Delete :Version' info.plist
讀取配置文件詳解
shell使用cat逐行讀取文件內(nèi)容
cat ${configPath} | while read line
獲取cat 當(dāng)行的文本內(nèi)容
獲取等號(hào)左邊的值
tempKey=${line%%=*}
獲取等號(hào)右邊的值
serviceURLStr=${line##*=}
打包命令詳解:
項(xiàng)目的總文件夾路徑
project_path=$(pwd)
指定打包的sdk名稱
sdk="iphoneos9.3"
指定打包的target名稱
target="PictureTest"
指定項(xiàng)編譯環(huán)境 Release Debug
configuration="Release"
指定要打包的證書
# code_sign_identity="iPhone Developer: lei zhang (HWQV7JV39T)"
指定打包所使用的provisioning profile名稱
# provisioning_profile="14765a74-1d60-4697-a38b-2183ac1dcfb3"
provisioning_profile="64f58c03-4649-405c-9c5a-c2d8a6527aa9"
指定輸出ipa地址
ipa_path="${project_path}/${target}_${now}.ipa"