前言
自動化(Automation)是指機器設備喇辽、系統(tǒng)或過程(生產(chǎn)掌挚、管理過程)在沒有人或較少人的直接參與下,按照人的要求菩咨,經(jīng)過自動檢測吠式、信息處理、分析判斷抽米、操縱控制特占,實現(xiàn)預期的目標的過程(摘自百科)。軟件自動化集成能夠提高軟件開發(fā)效率云茸,是快速迭代過程中必備利器是目。jenkins是目前用得比較廣的自動化工具。本來主要是使用jenkins+svn+xcode來構(gòu)建自動化集成環(huán)境标捺。
jenkins環(huán)境搭建
jenkins安裝
jenkins下載地址:https://jenkins.io/index.html下載下來是war包的形式(本次使用的是1.642.4版本)懊纳。jenkins自帶svn插件,如果倉庫使用的是Git亡容,可以安裝jenkins的Git插件嗤疯。
jenkinswar包有兩種安裝方法:
1.下載jenkins.war, 運行java -jar jenkins.war. 在OSX上默認已經(jīng)安裝了java環(huán)境,如果沒有可以先安裝java環(huán)境萍倡,在運行相關命令身弊。
2.將war包放在tomcat的webapps目錄中,運行tomcat。
jenkins啟動完畢后阱佛,在瀏覽器中輸入http://localhost:8080或http://127.0.0.1:8080或者本機IP加8080端口號帖汞,即可訪問jenkin web管理界面。
主界面如下凑术,功能劃分清晰明了翩蘸。
jenkins配置
1.創(chuàng)建任務(點擊新建 > 輸入項目名 > 選擇構(gòu)建多配置項目 > 點擊確認)
2.填寫描述信息
3.設置項目SVN地址
如果出現(xiàn)認證失敗,點擊enter credential 輸入用戶名密碼就行了(jenkin也支持其它兩種認證方式SSH以及HTTPS淮逊,根據(jù)情況來認證就行了)
4.設置shell腳本催首。(jenkin確實很強大除了shell還可以執(zhí)行其它的任務)
可以增加Execute shell的數(shù)量,也可以拖動進行排序泄鹏,確實是比較方便的郎任。
5.設置構(gòu)建后的處理。
在這里選擇郵件通知备籽,項目構(gòu)建失敗會收到郵件提醒舶治。
6.保存項目配置。
保存后主頁多了一個當前添加的構(gòu)建項目车猬。
你可以點擊All之后的添加按鈕添加試圖霉猛,這樣分類更明了。
7.啟動任務珠闰。
a.手動構(gòu)建惜浅。(點擊構(gòu)建按鈕,即可構(gòu)建項目伏嗜。)
構(gòu)建次數(shù)在歷史試圖可以查看
構(gòu)建的時候可以通過Console Output查看命令執(zhí)行結(jié)果坛悉。
自動構(gòu)建。(在配置項目的時候阅仔,配置觸發(fā)時間即可自動構(gòu)建吹散。可以每隔特定的時間八酒,檢查svn變更構(gòu)建,也可以定時構(gòu)建刃唐,很方便)
1.Poll SCM:定時檢查源碼變更(根據(jù)SCM軟件的版本號)羞迷,如果有更新就checkout最新code下來,然后執(zhí)行構(gòu)建動作画饥。例如衔瓮,表達式中填寫H/15 H/30 H/45 * * * *將使Jenkins每隔15,30,45分鐘就檢查一次您源碼倉庫的變化。以下配置為每5分鐘執(zhí)行一次源碼檢查抖甘。
2.Build periodically:周期進行項目構(gòu)建(它不關心源碼是否發(fā)生變化)热鞍。以下設置為定時構(gòu)建任務。
注意:如果對定時任務設置不太清楚,可以點擊問號查看具體如何設置薇宠。
iOS自動化腳本
1.利用xcodebuild命令配合xcrun命令生成ipa文件偷办,并上傳到指定的svn目錄。
build_path="project path" #工程xcodeproj文件目錄
xcode_project="project.xcodeproj" #項目工程文件
target_name="iOS Demo" #要編譯的target
app_path="${build_path}/build/Release-iphoneos/Demo.app" #生成的.app文件路徑
dsymPath="dsym file path" #符號表保存目錄
PLIST_NAME="Info.plist" #plist文件路徑
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${PLIST_NAME}.plist)
bundleID=$(/usr/libexec/PlistBuddy -c "print CFBundleIdentifier" ${PLIST_NAME}.plist)
sign_name="4NUGTCBY12" #簽名文件秘鑰
embed_name="iosdev.mobileprovision" #provision 文件路徑
more_argument="PROVISIONING_PROFILE=d449a8c6-94ea-2ec2-31b4-854627893c2f" #provision 文件uuid
ipa_build_time=$(date +"%Y_%m_%d_%H_%M")
ipa_name="${target_name}_V${bundleVersion}_${ipa_build_time}"
#組合打包命令
xcodebuild -project ${xcode_project} -sdk iphoneos -target ${target_name} -configuration Release ${more_argument} clean build || exit -2
xcrun_cmd='xcrun -sdk iphoneos packageapplication -v '${app_path}' -o '${ipa_path}/${ipa_name}.ipa
#增加–sign –embed
if [ "$sign_name" != "" ]; then
xcrun_cmd=${xcrun_cmd}' --sign '${sign_name}
echo "[[ add sign_name : $xcrun_cmd]]"
fi
if [ "$embed_name" != "" ]; then
xcrun_cmd=${xcrun_cmd}' --embed '${embed_name}
echo "[[ add embed_name : $xcrun_cmd]]"
fi
xcrun_cmd || exit -2
#保存更新DSYM文件
if [[ ! -d "${dsymPath}/${bundleID}" ]]; then
mkdir -p "${dsymPath}/${bundleID}"
fi
echo "[[[========= 開始拷貝DSYM文件 =========]]]"
cp -R "${build_path}/build/Release-iphoneos/Demo.app.dSYM" "${dsymPath}/${bundleID}/${bundleID}.dSYM"
#上傳到svn
echo "svn://127.0.0.1:3698/Production/iOS/${SVN_DIR}${ipa_name}.ipa"
svn delete --username user --password pass -m "delete old ipa" svn://127.0.0.1:3698/Production/iOS/${SVN_DIR}${ipa_name}.ipa
svn import --username user --password pass -m "new Import ipa" ${ipa_path}/${ipa_name}.ipa svn://127.0.0.1:3698/Production/iOS/${SVN_DIR}${ipa_name}.ipa || exit -1
注意:在編譯的時候可能出現(xiàn)以下錯誤:
解決辦法
a.運行xcrun -sdk iphoneos -f PackageApplication澄港,獲取PackageApplication文件目錄
b.以文本的方式打開PackageApplication文件椒涯,做如下修改
my@codesign_args;
if(-e'$destApp/ResourceRules.plist'){# If ResourceRules.plist exists, include it in codesign arguments, for backwards compatability
@codesign_args=("/usr/bin/codesign","--force","--preserve-metadata=identifier,entitlements,resource-rules",
"--sign",$opt{sign},
"--resource-rules=$destApp/ResourceRules.plist");
}else{# If ResourceRules.plist isn't found, don't include it in the codesign arguments
@codesign_args=("/usr/bin/codesign","--force","--preserve-metadata=identifier,entitlements",
"--sign",$opt{sign});
}
2.利用xcodebuild生成ipa文件。
#導出xcarchive文件
xcodebuild archive -project MyApp.xcodeproj -scheme MyApp -archivePath MyApp.xcarchive
#利用xcarchive導出ipa文件
xcodebuild -exportProvisioningProfile "${PROVISIONING_PROFILE_NAME}" -exportArchive -exportFormat IPA -archivePath "MyApp.xcarchive" -exportPath "$IPA_DIR/MyApp.ipa" CODE_SIGN_IDENTITY="${SIGNING_IDENTITY}"
注意:目前的 Xcode 7 中此命令的使用已經(jīng)變成使用 -exportOptionsPlist 的參數(shù)形式了回梧。這種形式支持 bitcode 的功能废岂。
#Xcode7中導出ipa包
xcodebuild -exportArchive -archivePathMyApp.xcarchive-exportPath"$IPA_DIR/MyApp.ipa”-exportOptionsPlist $exportOptionsPlist
OptionsPlist 例子:
http://www.apple.com/DTDs/PropertyList-1.0.dtd">
teamID
MYTEAMID123
method
app-store
uploadSymbols
OptionsPlist 相關參數(shù)(更多參數(shù)可以使用xcodebuild --help命令查看)
自動化構(gòu)建
在配置好jenkins,并編寫好打包腳本以后狱意,即可在Execute shell中運行打包腳本湖苞,構(gòu)建成功后便會自動生成ipa文件并上傳到指定的svn地址或者構(gòu)建itms-services的安裝環(huán)境。通過自動化大大簡化了打包操作详囤,終于可以利用這個時間寫寫文章了财骨,感謝jenkins。
參考資料:
1.http://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts/
2.http://www.matrixprojects.net/p/xcodebuild-export-options-plist/