jenkins自動(dòng)化打包

自動(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)入重置密碼頁面


initpsw.png

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

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

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

安裝需要的插件

安裝插件的位置:系統(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ù)

安裝完插件后的頁面如下:


new.jpg

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


itemName.jpg

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

任務(wù)配置

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

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

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


gitAccount.png

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

下載代碼

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

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

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

autobuild.png

定時(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)目
target.png

需要選擇的選項(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.png

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"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市菠秒,隨后出現(xiàn)的幾起案子疙剑,更是在濱河造成了極大的恐慌,老刑警劉巖践叠,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件言缤,死亡現(xiàn)場離奇詭異,居然都是意外死亡禁灼,警方通過查閱死者的電腦和手機(jī)管挟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄捕,“玉大人僻孝,你說我怎么就攤上這事导帝。” “怎么了穿铆?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵您单,是天一觀的道長。 經(jīng)常有香客問我荞雏,道長虐秦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任凤优,我火速辦了婚禮悦陋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘别洪。我一直安慰自己叨恨,他們只是感情好奸鬓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布忌愚。 她就那樣靜靜地躺著搔涝,像睡著了一般误墓。 火紅的嫁衣襯著肌膚如雪卷要。 梳的紋絲不亂的頭發(fā)上衙熔,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天赶撰,我揣著相機(jī)與錄音蝌以,去河邊找鬼哪替。 笑死栋荸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凭舶。 我是一名探鬼主播晌块,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帅霜!你這毒婦竟也來了匆背?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤身冀,失蹤者是張志新(化名)和其女友劉穎钝尸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搂根,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珍促,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剩愧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猪叙。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沐悦,到底是詐尸還是另有隱情成洗,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布藏否,位于F島的核電站瓶殃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏副签。R本人自食惡果不足惜遥椿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淆储。 院中可真熱鬧冠场,春花似錦、人聲如沸本砰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽点额。三九已至舔株,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間还棱,已是汗流浹背载慈。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珍手,地道東北人办铡。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像琳要,于是被迫代替她去往敵國和親寡具。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容