自動化打包
使用的工具是jenkins,Jenkins 是一個開源項目,提供了一種易于使用的持續集成系統,主要用于自動化打包
安裝
命令行安裝
$ brew install jenkins
卸載
$ brew uninstall jenkins
初始化配置
啟動jenkins
$ jenkins
在瀏覽器中配置jenkins,
初始化配置
瀏覽器輸入localhost:8080
這樣就打開Jenkins管理頁面了,此時有一個默認的管理員jenkins,瀏覽器進入重置密碼頁面
初始密碼在/Users/dyn/.jenkins/secrets/initialAdminPassword(初始化完成后自動消失)
然后就是如下圖片,依次選擇即可
創建用戶
輸入用戶名,密碼,郵件這些,就算初始化配置完成了
安裝需要的插件
安裝插件的位置:系統管理->管理插件,在“可選插件”
GitLab插件
用來管理源代碼,位置:“可選插件”列表中“GitLab Plugin”和“Gitlab Hook Plugin”兩項
Xcode插件
用于完成xcode命令打包,位置在“可選插件”列表中“Xcode integration”選項
簽名證書管理插件
用于iOS打包內測版時,需要發布證書及相關簽名文件,位置在“可選插件”中選中“Credentials Plugin”和“Keychains and Provisioning Profiles Management”兩項。
腳本插件
用于在build后執行相關腳本。位置在“可選插件”中選中“Post-Build Script Plug-in”選擇。
設置apple development證書
新建任務及打包
新建任務
安裝完插件后的頁面如下:
點擊創建一個新任務來開始第一個項目
選擇第一個 “構建一個自由風格的軟件項目”
任務配置
選中任務名->配置
基本信息,這里可以設置包的保留天數還有個數。(可略過)。見下圖
源碼管理,設置代碼的獲取方式
]
Repository URL:項目的git地址
Add按鈕:進行認證權限,就是添加git的用戶名密碼
填寫好用戶和密碼,點擊下面的Add按鈕,然后Credentials下拉框就會出現這個用戶
下載代碼
此時保存,然后選擇立即構建,就可以下載代碼
ios構建版本配置
構建觸發器
定時自動打包的配置,
具體寫法參見http://blog.csdn.net/e295166319/article/details/52920036
構構建環境(掠過)
構建(添加構建步驟)
選擇xcode就是使用xcode 命令行打包
選擇execute shell 就是使用運行shell腳本打包
xcode 命令行打包配置,參見本地jenkins服務器的test1項目
需要選擇的選項介紹
Target:就是我們在項目中建立的Target
命令行查看所有target
xcodebuild -list
Clean before build?:
編譯前是否clean一次,一般是選擇YES,也可不選
Configuration:
對應的是xcodebuild命令里的-configuration的參數,可選項為[Debug、Release],一般都填Debug
Pack application and build .ipa?:
結束時是否要產生對應的ipa文件,選中即可
.ipa filename pattern:
配置ipa的文件名,比如${VERSION}_${BUILD_DATE}
其中${VERSION}和${SVN_REVISION}都是可以直接用的環境變量,所有可用的環境變量地址為:http://localhost:8080/env-vars.html
Output directory:
配置ipa的輸出目錄。比如$WORKSPACE/build/ipa-build
證書配置
Development Team ID :團隊id,在keychain的distrubution證書名稱的()中就是
Keychain path 固定路徑
Keychain password:應該是p12文件密碼
Advanced Xcode build options
Xcode Schema File:對應的是xcodebuild命令中的-scheme的參數
Xcode Workspace File:xcodebuild中的-workspace的變量,是.xcworkspace的文件路徑,從工程總文件夾開始寫,切無后綴名
Xcode Project Directory:同理是單工程的工程文件名,無后綴名
Build output directory:ipa的路徑
shell打包腳本
特點:自動讀取參數配置文件
自動循環打包
參考本地jenkins服務器的項目shelldemo
#獲取當前工程路徑,即工程的總文件夾
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
#配置文件相關
#服務器地址key
serviceURLKey="serviceURL"
#顯示名稱key
displayNameKey="name"
#開發證書的key
developmentCodeSignIdentifyKey="developmentCodeSignIdentify"
#開發證書的描述文件key
developmentProvisionProfileKey="developmentProvisionProfile"
#發布證書的key
appstoreCodeSignIdentifyKey="appstoreCodeSignIdentify"
#發布證書的描述文件Key
appstoreProvisionProfileKey="appstoreProvisionProfile"
#默認服務器地址
serviceURLStr="http://www.xaelink.com:8096"
#顯示名稱.默認是工程名
displayName=$projectName
#開發證書名稱
developmentCodeSignIdentify=""
#開發證書的描述文件
developmentProvisionProfile=""
#發布證書
appstoreCodeSignIdentify=""
#發布證書的描述文件
appstoreProvisionProfile=""
#打印plist文件內容
#/usr/libexec/PlistBuddy -c "print" ${appInfoPlistPath}
#讀取配置文件內容.并以此替換plist 文件,然后打包
cat ${configPath} | while read line
do
#獲取等號左邊的值
tempKey=${line%%=*}
#服務器地址
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 文件的應用程序名
/usr/libexec/PlistBuddy -c "set :CFBundleDisplayName $displayName" ${appInfoPlistPath}
/usr/libexec/PlistBuddy -c "set :CFBundleName $displayName" ${appInfoPlistPath}
#開發證書名稱
elif [ "${developmentCodeSignIdentifyKey}" == "${tempKey}" ] ; then
developmentCodeSignIdentify=${line##*=}
echo "developmentCodeSignIdentify=${developmentCodeSignIdentify}"
#開發證書的描述文件
elif [ "${developmentProvisionProfileKey}" == "${tempKey}" ] ; then
developmentProvisionProfile=${line##*=}
echo "developmentProvisionProfile=${developmentProvisionProfile}"
#發布證書
elif [ "${appstoreCodeSignIdentifyKey}" == "${tempKey}" ] ; then
appstoreCodeSignIdentify=${line##*=}
echo "appstoreCodeSignIdentify=${appstoreCodeSignIdentify}"
#發布證書的描述文件
elif [ "${appstoreProvisionProfileKey}" == "${tempKey}" ] ; then
appstoreProvisionProfile=${line##*=}
echo "appstoreProvisionProfile=${appstoreProvisionProfile}"
#讀取到最后一個參數后,開始打包
#建立一些需要的文件路徑
basepath=${projectPath}
#編譯輸出文件夾名稱
myfile="autobuild"
#日志文件路徑
logPath="${basepath}/${myfile}/log.rtf"
#編譯模式,debug 還是release,默認是release
configuration="Release"
#工作環境名稱
workspaceName="${projectName}.xcworkspace"
#scheme 名字
scheme="${targetName}"
#build 路徑
configurationBuildDir="${basepath}/${myfile}/build"
#archive路徑
archivepath="${basepath}/${myfile}/archive/${projectName}.xcarchive"
#ipa 文件路徑
#當前時間
qs_date=`date +%Y_%m_%d_%H_%M_%S`
#ipa導出的文件夾路徑,按時間排序
exportpath="${basepath}/${myfile}/ipa/${projectName}_${qs_date}"
#appstore的ipa到處路徑
appstorepath="${basepath}/${myfile}/appstore/${projectName}_${qs_date}"
#導出配置路徑,暫不需要
exportOptionsPlist="${basepath}/${myfile}/DevelopmentExportOptions.plist"
#ipa的真實路徑
ipaPath="${exportpath}/${scheme}.ipa"
#appstore的ipa真實路徑
appstoreipaPath="${appstorepath}/${scheme}.ipa"
cd ${basepath}
#clear
echo "\033[31m Start Clear!\033[0m" #輸出顏色為紅色的Start Clear!
rm -f $logPath #強制刪除日志文件
xcodebuild clean -configuration "${configuration}" >> $logPath || exit
echo "\033[31m clear success!\033[0m"
#先打開發者包,上傳到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"
#導出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"
#打包發布者包
#上傳到appstore的包,準備上傳
else
echo "-----------"
fi
done
關鍵命令解釋:
PlistBuddy:是Mac自帶的專門解析plist的小工具
PlistBuddy使用詳解
參考網址http://www.lxweimin.com/p/2167f755c47e
使用PlistBuddy打印plist 內容
/usr/libexec/PlistBuddy -c "print" ${appInfoPlistPath}
使用PlistBuddy給plist添加內容
添加字符串
/usr/libexec/PlistBuddy -c 'Add :Version string 1.0' test.plist
Version是鍵
string是類型
1.0是值
添加數組
# 先添加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已有鍵值的內容
/usr/libexec/PlistBuddy -c "set :CFBundleDisplayName $displayName" ${appInfoPlistPath}
-c:意思是執行后面“”內的命令
CFBundleDisplayName:是plist 存在的鍵
$displayName:是新的值
${appInfoPlistPath} :plist 文件內容
刪除某個字段
/usr/libexec/PlistBuddy -c 'Delete :Version' info.plist
讀取配置文件詳解
shell使用cat逐行讀取文件內容
cat ${configPath} | while read line
獲取cat 當行的文本內容
獲取等號左邊的值
tempKey=${line%%=*}
獲取等號右邊的值
serviceURLStr=${line##*=}
打包命令詳解:
項目的總文件夾路徑
project_path=$(pwd)
指定打包的sdk名稱
sdk="iphoneos9.3"
指定打包的target名稱
target="PictureTest"
指定項編譯環境 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"