Jenkins創(chuàng)建iOS項(xiàng)目自動(dòng)打包

公司最近出了個(gè)打包需求,完成之后記錄一下,避免忘記

1、Jenkins登陸用戶擁有不同權(quán)限,用戶分為「管理員」、「項(xiàng)目管理員」和「項(xiàng)目測(cè)試」。

(1)「管理員」即Jenkins管理員賬戶;

(2)「項(xiàng)目管理員」可以增刪查改負(fù)責(zé)的項(xiàng)目;

(3)「項(xiàng)目測(cè)試」可以下載安裝負(fù)責(zé)項(xiàng)目;

2、每一個(gè)項(xiàng)目在Jenkins上分為2個(gè)工程,一個(gè)工程負(fù)責(zé)打包,另一個(gè)工程只顯示下載地址

(1)打包工程可以選擇打包需要的參數(shù),如:版本號(hào),構(gòu)建版本號(hào),內(nèi)外網(wǎng)環(huán)境

(2)下載工程在打包完成后發(fā)送釘釘通知

前提條件

1、Jenkins使用中文版,英文版請(qǐng)獨(dú)立翻譯或依據(jù)圖標(biāo)辨認(rèn);

2、以下操作默認(rèn)登陸用戶為Jenkins管理員,切換用戶時(shí)會(huì)有特殊說(shuō)明;

3、Jenkins插件手動(dòng)下載地址:http://mirror.xmission.com/jenkins/plugins/

4、會(huì)shell,python,ruby腳本語(yǔ)言

用戶權(quán)限

用戶權(quán)限的首要條件,就是用戶,所以我們先創(chuàng)建2個(gè)用戶?!窺ALeader」和「QAUser」,其中「QALeader」當(dāng)作「項(xiàng)目管理員」,「QAUser」當(dāng)作「項(xiàng)目測(cè)試」。

在Jenkins主頁(yè)的左側(cè)選擇「系統(tǒng)管理」->「管理用戶」->「新建用戶」,根據(jù)要求創(chuàng)建用戶。

注意:用戶ID會(huì)將英文全部按照小寫處理。


首頁(yè)左側(cè)系統(tǒng)管理


管理用戶


新建用戶(用戶列表上admin為Jenkins管理員用戶)


新建用戶


用戶ID被變?yōu)樾?/div>

由于Jenkins本身不帶有用戶權(quán)限功能,所以我們將使用Jenkins插件「Role-based Authorization Strategy」完成用戶權(quán)限功能。選擇「系統(tǒng)管理」->「插件管理」,標(biāo)簽頁(yè)選擇「可選插件」,右上角「過(guò)濾」中輸入插件名或關(guān)鍵字。安裝完成后重啟Jenkins。

Jenkins重啟:在瀏覽器地址欄輸入命令。記得修改成自己的地址和端口號(hào)

直接安裝使用命令

localhost:8080/restart

依賴tomcat使用命令

localhost:8080/jenkins/restart

插件管理
安裝插件

Jenkins重啟后,插件已經(jīng)安裝好了。但此時(shí)插件還沒有生效,無(wú)法使用,需要再配置一些地方。

進(jìn)入「系統(tǒng)管理」->「全局安全配置」,修改「訪問(wèn)控制」和「代理」


全局安全配置


全局安全配置修改

此時(shí),插件生效,可以在「系統(tǒng)管理」中看到新的功能「Manage and Assign Roles」


插件生效

該功能中包含3個(gè)標(biāo)簽,分別是「Manage Roles」「Assign Roles」「Role Strategy Macros」。我們會(huì)用到前兩個(gè),第三個(gè)沒有用到,不在此贅述。

Manage Roles

權(quán)限類型。可以設(shè)置不同權(quán)限類型,使用其中「Global roles」和「Project roles」,將鼠標(biāo)停在每一項(xiàng)中會(huì)有英文提示



Global roles

「Global roles」中我們關(guān)注「Overall」、「任務(wù)」和「Run」。插件會(huì)默認(rèn)記錄一個(gè)admin,

擁有所有權(quán)限,一般,這個(gè)權(quán)限我們留給Jenkins管理員。

在「Role to add」輸入想要的Role,添加到Global roles,比如「subAdmin」和「QA」


新增subAdmin和QA

subAdmin擁有增刪查改項(xiàng)目的權(quán)限,QA擁有查看項(xiàng)目的權(quán)限,所以我們給subAdmin和QA分別賦予權(quán)限。最終權(quán)限為


Project roles

「Project roles」我們關(guān)注「任務(wù)」和「Run」。其中「Pattern」是正則表達(dá),通過(guò)「Pattern」篩選項(xiàng)目。根據(jù)項(xiàng)目需要自行創(chuàng)建。比如「TestProject.*」和「TestProjectipa.*」。

「TestProject.*」意思是獲得該項(xiàng)目權(quán)限的用戶只可以在首頁(yè)可以看到「TestProject」開頭的項(xiàng)目。如:TestProject12345678900965

「TestProjectipa.*」意思是獲得該項(xiàng)目的權(quán)限的用戶只可以可以在首頁(yè)看到「TestProjectipa」開頭的項(xiàng)目。如:TestProjectipaiuhygfdsa

根據(jù)Pattern創(chuàng)建項(xiàng)目


Assign Roles

用戶賦權(quán)。將設(shè)置的不同權(quán)限類型賦予用戶。之后的用戶登陸后只能看到相應(yīng)權(quán)限的按鈕。

為了方便直觀,我們直接將之前創(chuàng)建的「QALeader」和「QAUser」賦予權(quán)限。同時(shí)創(chuàng)建2個(gè)項(xiàng)目,分別叫做「TestProject」和「TestProjectipa」。



賦予賬號(hào)系統(tǒng)管理權(quán)限



賦予賬號(hào)項(xiàng)目管理權(quán)限


項(xiàng)目創(chuàng)建

按照之前的規(guī)定,創(chuàng)建2個(gè)自由風(fēng)格項(xiàng)目,分別是「TestProject」和「TestProjectipa」。

在這里就可以使用「subAdmin」類型創(chuàng)建,不再使用「admin」。

?點(diǎn)擊「新建項(xiàng)目」,輸入項(xiàng)目名,選擇「構(gòu)建一個(gè)自由風(fēng)格軟件項(xiàng)目」,點(diǎn)擊確定。


新建項(xiàng)目

依次創(chuàng)建完成后「QALeader」可以看到2個(gè)項(xiàng)目,「QAUser」只能看到1個(gè)項(xiàng)目。


QALeader項(xiàng)目權(quán)限


QAUser項(xiàng)目權(quán)限

項(xiàng)目配置


項(xiàng)目配置

項(xiàng)目配置中「源碼管理」選擇使用的管理工具,默認(rèn)提供了「Git」和「Subversion」(就是SVN)。根據(jù)不同需求自行解決。

「構(gòu)建」中,下拉選擇「Excute shell」,使用shell腳本打包。

shell腳本如下

#!/bin/sh

projectPath="下載的項(xiàng)目中xcodeproj絕對(duì)路徑"

ipaPath="保存ipa包的絕對(duì)路徑"

projectTarget="項(xiàng)目中需要構(gòu)建的TARGETS"

targetName="項(xiàng)目中需要構(gòu)建的TARGETS"

ipaName="不帶后綴的ipa包名字"

ipafile="${ipaPath}/${targetName}/${ipaName}.ipa

cd /Users/admin/.jenkins/workspace/slots_iOS

mkdir ipaFolder

cd ${ipaPath}

mkdir "$targetName"

cd "$projectPath"

releaseDir="build/Release-iphoneos"

appfile="${releaseDir}/${projectTarget}.app"

rm -rdf "$releaseDir"

xcodebuild -target "$projectTarget" -configuration Release -sdk iphoneos11.0 clean build

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$appfile" -o "$ipafile"

rm -rdf "build

iphoneos11.0代表著打包使用的iOS SDK版本。自行查看Xcode中版本

xcodebuild -target "$projectTarget" -configuration Release -sdk iphoneos11.0 clean build

但是這樣不符合要求啊。無(wú)法配置版本、切換環(huán)境,總不能每次為了打不同環(huán)境的包提交一次代碼。

接下來(lái)我們追加版本和環(huán)境的配置。

勾選「參數(shù)化構(gòu)建過(guò)程」,根據(jù)需求選擇相應(yīng)參數(shù)。如:版本號(hào)選擇「字符參數(shù)」;服務(wù)器環(huán)境選擇「選項(xiàng)參數(shù)」。

參數(shù)化構(gòu)建過(guò)程


其中「名稱」是展示到打包前會(huì)用,也是變量必填,需要在shell腳本中使用;「默認(rèn)值」額。。。就是默認(rèn)值,可不填;「描述」是該參數(shù)說(shuō)明,可不填。

字符參數(shù)

此時(shí)再去打包,會(huì)發(fā)現(xiàn)原先的「Build」變成了「Build with Parameters」,點(diǎn)擊后沒有立即打包,而是進(jìn)入?yún)?shù)配置頁(yè)面。


參數(shù)配置頁(yè)面

外殼已經(jīng)完成,下面就開始實(shí)現(xiàn)方法。

首先是版本號(hào)的修改。修改思路:iOS項(xiàng)目中版本號(hào)是寫在info.plist文件中,info.plist文件實(shí)際上是一堆key-value組成,那么知道了版本號(hào)的key,對(duì)應(yīng)替換value就可以了。

版本號(hào)對(duì)應(yīng)的key是「CFBundleShortVersionString」,找到這一行的key,替換掉下一行value,重新保存文件;服務(wù)器環(huán)境也是類似思路,不在此單獨(dú)列出。腳本:


#!/usr/bin/python
# encoding: utf-8
import sys
version=sys.argv[1]
fo = open("Info.plist", "r+")
print "fileno is ",fo.fileno()
print "file name is ",fo.name
i=0
verionIndex=0
versionLine="<string>%s</string>\n"%version
flist=fo.readlines()
for line in flist:
??? i=i+1
??? if 'CFBundleShortVersionString' in line:
??? ??? verionIndex=i
print "flist is ",flist
flist[verionIndex]=versionLine
print "new flist is ",flist
fo=open("Info.plist", "w+")
fo.writelines(flist)
fo.close()

將該腳本放到一個(gè)不會(huì)變動(dòng)的文件夾中或直接放入代碼文件一同上傳,如果選擇放入本地文件夾,請(qǐng)先將文件復(fù)制到info.plist所在目錄。

在打包開始前,追加以下腳本以修改版本號(hào)

chmod 777 param.py

python param.py 版本號(hào)「名稱」

打包完成后,需要分發(fā)給「QAUser」,但是「QAUser」并不能查看到該項(xiàng)目,需要將ipa包導(dǎo)入另一個(gè)項(xiàng)目中,供「QAUser」使用。在「構(gòu)建后操作」選擇「Build other projects」,填寫項(xiàng)目名,選擇構(gòu)建時(shí)機(jī)。


Build other projects

啥時(shí)候有興趣了,啥時(shí)候繼續(xù)寫好了。

?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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