jenkins自動(dòng)化打包

自動(dòng)化打包

使用的工具是jenkins,Jenkins 是一個(gè)開(kāi)源項(xiàng)目,提供了一種易于使用的持續(xù)集成系統(tǒng),主要用于自動(dòng)化打包

安裝

命令行安裝

$ brew install jenkins

卸載

$ brew uninstall jenkins

初始化配置

啟動(dòng)jenkins

$ jenkins

在瀏覽器中配置jenkins,

初始化配置
瀏覽器輸入localhost:8080

這樣就打開(kāi)Jenkins管理頁(yè)面了,此時(shí)有一個(gè)默認(rèn)的管理員jenkins,瀏覽器進(jìn)入重置密碼頁(yè)面


initpsw.png

初始密碼在/Users/dyn/.jenkins/secrets/initialAdminPassword(初始化完成后自動(dòng)消失)
然后就是如下圖片,依次選擇即可

install.png
started.png
創(chuàng)建用戶
createAccount.jpg

輸入用戶名,密碼,郵件這些,就算初始化配置完成了

安裝需要的插件

安裝插件的位置:系統(tǒng)管理->管理插件,在“可選插件”

GitLab插件

用來(lái)管理源代碼,位置:“可選插件”列表中“GitLab Plugin”和“Gitlab Hook Plugin”兩項(xiàng)

Xcode插件

用于完成xcode命令打包,位置在“可選插件”列表中“Xcode integration”選項(xiàng)

簽名證書(shū)管理插件

用于iOS打包內(nèi)測(cè)版時(shí),需要發(fā)布證書(shū)及相關(guān)簽名文件,位置在“可選插件”中選中“Credentials Plugin”和“Keychains and Provisioning Profiles Management”兩項(xiàng)。

腳本插件

用于在build后執(zhí)行相關(guān)腳本。位置在“可選插件”中選中“Post-Build Script Plug-in”選擇。

設(shè)置apple development證書(shū)

新建任務(wù)及打包

新建任務(wù)

安裝完插件后的頁(yè)面如下:


new.jpg

點(diǎn)擊創(chuàng)建一個(gè)新任務(wù)來(lái)開(kāi)始第一個(gè)項(xiàng)目


itemName.jpg

選擇第一個(gè) “構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目”

任務(wù)配置

選中任務(wù)名->配置

基本信息,這里可以設(shè)置包的保留天數(shù)還有個(gè)數(shù)。(可略過(guò))。見(jiàn)下圖
git.png
源碼管理,設(shè)置代碼的獲取方式
git.png

]
Repository URL:項(xiàng)目的git地址
Add按鈕:進(jìn)行認(rèn)證權(quán)限,就是添加git的用戶名密碼


gitAccount.png

填寫(xiě)好用戶和密碼,點(diǎn)擊下面的Add按鈕,然后Credentials下拉框就會(huì)出現(xiàn)這個(gè)用戶

下載代碼

此時(shí)保存,然后選擇立即構(gòu)建,就可以下載代碼

ios構(gòu)建版本配置

構(gòu)建觸發(fā)器

autobuild.png

定時(shí)自動(dòng)打包的配置,

具體寫(xiě)法參見(jiàn)http://blog.csdn.net/e295166319/article/details/52920036

構(gòu)構(gòu)建環(huán)境(掠過(guò))

構(gòu)建(添加構(gòu)建步驟)

選擇xcode就是使用xcode 命令行打包

選擇execute shell 就是使用運(yùn)行shell腳本打包

xcode 命令行打包配置,參見(jiàn)本地jenkins服務(wù)器的test1項(xiàng)目
target.png

需要選擇的選項(xiàng)介紹
Target:就是我們?cè)陧?xiàng)目中建立的Target

命令行查看所有target

xcodebuild -list

Clean before build?:

編譯前是否clean一次,一般是選擇YES,也可不選

Configuration:

對(duì)應(yīng)的是xcodebuild命令里的-configuration的參數(shù),可選項(xiàng)為[Debug、Release],一般都填Debug

Pack application and build .ipa?:

結(jié)束時(shí)是否要產(chǎn)生對(duì)應(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

證書(shū)配置
development.png

Development Team ID :團(tuán)隊(duì)id,在keychain的distrubution證書(shū)名稱的()中就是
Keychain path 固定路徑

Keychain password:應(yīng)該是p12文件密碼

Advanced Xcode build options

Xcode Schema File:對(duì)應(yīng)的是xcodebuild命令中的-scheme的參數(shù)
Xcode Workspace File:xcodebuild中的-workspace的變量,是.xcworkspace的文件路徑,從工程總文件夾開(kāi)始寫(xiě),切無(wú)后綴名
Xcode Project Directory:同理是單工程的工程文件名,無(wú)后綴名
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"

#開(kāi)發(fā)證書(shū)的key
developmentCodeSignIdentifyKey="developmentCodeSignIdentify"

#開(kāi)發(fā)證書(shū)的描述文件key
developmentProvisionProfileKey="developmentProvisionProfile"

#發(fā)布證書(shū)的key
appstoreCodeSignIdentifyKey="appstoreCodeSignIdentify"

#發(fā)布證書(shū)的描述文件Key
appstoreProvisionProfileKey="appstoreProvisionProfile"

#默認(rèn)服務(wù)器地址
serviceURLStr="http://www.xaelink.com:8096"

#顯示名稱.默認(rèn)是工程名
displayName=$projectName

#開(kāi)發(fā)證書(shū)名稱
developmentCodeSignIdentify=""


#開(kāi)發(fā)證書(shū)的描述文件
developmentProvisionProfile=""

#發(fā)布證書(shū)
appstoreCodeSignIdentify=""

#發(fā)布證書(shū)的描述文件
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}

#開(kāi)發(fā)證書(shū)名稱
elif [ "${developmentCodeSignIdentifyKey}" == "${tempKey}" ] ; then
developmentCodeSignIdentify=${line##*=}
echo "developmentCodeSignIdentify=${developmentCodeSignIdentify}"

#開(kāi)發(fā)證書(shū)的描述文件
elif [ "${developmentProvisionProfileKey}" == "${tempKey}" ] ; then
developmentProvisionProfile=${line##*=}
echo "developmentProvisionProfile=${developmentProvisionProfile}"

#發(fā)布證書(shū)
elif [ "${appstoreCodeSignIdentifyKey}" == "${tempKey}" ] ; then
appstoreCodeSignIdentify=${line##*=}
echo "appstoreCodeSignIdentify=${appstoreCodeSignIdentify}"

#發(fā)布證書(shū)的描述文件
elif [ "${appstoreProvisionProfileKey}" == "${tempKey}" ] ; then
appstoreProvisionProfile=${line##*=}
echo "appstoreProvisionProfile=${appstoreProvisionProfile}"


#讀取到最后一個(gè)參數(shù)后,開(kāi)始打包
#建立一些需要的文件路徑
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"


#先打開(kāi)發(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.itdecent.cn/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"

指定要打包的證書(shū)

# 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"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容