iOS 使用Jenkins持續(xù)集成(簡稱CI)

  1. 安裝jenkins
    1.1. 直接到官網(wǎng)下載安裝包,通過安裝包安裝
    1.2. 通過Homebrew使用命令行安裝
1. 安裝Homebrew
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. 安裝Jenkins
$ brew install jenkins
3、啟動(dòng)Jenkins
$ jenkins
  • jenkins需要java環(huán)境,如果沒有安裝會(huì)有提示,java安裝地址

一切順利的話,打開瀏覽器輸入:http://localhost:8080/就能看到jenkins已經(jīng)運(yùn)行起來了,如果你更換了端口就是你后來設(shè)置的端口。接下來打開Jenkins后會(huì)讓去一個(gè)填寫password的頁面如下圖,存儲(chǔ)password的地方就是圖片上那行紅色字體目錄

然后將我們得到的password輸入到Administrator password中,即可進(jìn)入如下界面,接著安裝一些建議的插件左邊的,安裝過程中,有的插件可能會(huì)安裝失敗,強(qiáng)烈建議點(diǎn)擊右下角的重試,直到把建議安裝的都裝好

插件安裝完成后,可能不會(huì)自動(dòng)跳轉(zhuǎn),刷新下界面即可,在刷新后的界面中注冊,輸入用戶名和密碼,建議輸入后點(diǎn)藍(lán)色按鈕保存完成

  1. 安裝jenkins插件
    如果要使用Jenkins的插件構(gòu)建工程的,需要在開始新建工程前安裝一些Jenkins插件,在可選插件中選擇我們需要的插件進(jìn)行安裝
Git Parameter
這是一個(gè)參數(shù)構(gòu)建擴(kuò)展,可以在構(gòu)建的時(shí)候選擇git的某一個(gè)分支來構(gòu)建服務(wù)。
Git Parameter
官方地址:http://wiki.jenkins-ci.org/display/JENKINS/Git+Parameter+Plugin
安裝方式:在Jenkins插件當(dāng)中直接搜索即可安裝。
功能說明:在參數(shù)化構(gòu)建步驟當(dāng)中,可添加Git的branch或者tag來作為參數(shù)進(jìn)行構(gòu)建。

Active Choices
官方地址:https://wiki.jenkins.io/display/JENKINS/Active+Choices+Plugin
安裝方式:在Jenkins插件當(dāng)中直接搜索即可安裝。
功能說明:根據(jù)所選參數(shù),自動(dòng)調(diào)出對應(yīng)參數(shù)所依賴的后續(xù)參數(shù)。

我們今天使用Execute shell Shell腳本構(gòu)建工程

  1. jenkins的使用
    3.1. 構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目

3.2. General參數(shù)

可以設(shè)置包的保留天數(shù)和最大保留個(gè)數(shù),這些可以根據(jù)需要進(jìn)行調(diào)整,可以不要選

  • jenkins插件配置多個(gè)項(xiàng)目extended choice parameter插件主要是構(gòu)建的時(shí)候可以多選框來選擇要構(gòu)建的項(xiàng)目模塊



($+上面的Name)就可以獲取該值

3.3. 源碼管理



3.4. 構(gòu)建觸發(fā)器設(shè)置
觸發(fā)器可自定義的地方很多,可以根據(jù)項(xiàng)目需要選擇可省略

  • 定時(shí)構(gòu)建:不管SVNGit中數(shù)據(jù)有無變化,均執(zhí)行定時(shí)化的構(gòu)建任務(wù)
  • 輪詢SCM:只要SVNGit中數(shù)據(jù)有更新,則執(zhí)行構(gòu)建任務(wù)
    日程表的填寫內(nèi)容有5個(gè)參數(shù),從左到右的參數(shù)含義如下:
    ??第1個(gè)參數(shù):分鐘minute,取值0~59
    ??第2個(gè)參數(shù):小時(shí)hour,取值0~23
    ??第3個(gè)參數(shù):天day,取值1~31
    ??第4個(gè)參數(shù):月month,取值1~12
    ??第5個(gè)參數(shù):星期week,取值0~7,07都是表示星期天
    5個(gè)參數(shù)可選擇性設(shè)定,不寫死的參數(shù)用*號代替,參數(shù)之間用空格隔開。例如:
"0 21 * * *"表示每晚21點(diǎn)0分自動(dòng)化構(gòu)建一次
"0 * * * *"表示每個(gè)小時(shí)的第0分鐘執(zhí)行一次構(gòu)建
"H/5 * * * *"每隔5分鐘構(gòu)建一次
"H H/2 * * *"每兩小時(shí)構(gòu)建一次
"H H 30 * *"每月30號構(gòu)建一次
"H(0-29)/10 * * * *"每個(gè)小時(shí)的前半個(gè)小時(shí)內(nèi)的每10分鐘
"0 8-17/2 * * 1-5"周一到周五,8點(diǎn)~17點(diǎn),兩小時(shí)構(gòu)建一次
"H H 1,15 1-11 *"每月1號、15號各構(gòu)建一次,除12月等

3.5. 構(gòu)建環(huán)境設(shè)置
本文使用的是shell腳本構(gòu)建工程,所以該項(xiàng)可以省去
3.6. 構(gòu)建
有兩種方式打包,一是用Xcode插件打包,二是用Shell腳本打包,本文選擇第二種

  • iOS自動(dòng)打包—Jenkins Shell如下:
## !/bin/sh
## 項(xiàng)目名
TARGET_NAME=NNAlgorithm
## Scheme名
SCHEME=NNAlgorithm
##=======================
## 編譯類型
BUILD_TYPE=Release
## 當(dāng)前目錄
SORCEPATH=${WORKSPACE}
## workspace名
SPACE=${WORKSPACE}/${TARGET_NAME}.xcodeproj
##xcarchive文件的存放路徑
ARCHIVEPATH=$SORCEPATH/build/$SCHEME.xcarchive
## ipa文件的存放路徑
EXPORTPATH=$SORCEPATH/build/$SCHEME
## ExportOptions.plist文件的存放路徑,該文件要存放在這個(gè)路徑下內(nèi)容如下
EXPORTOPTIONSPLIST=$SORCEPATH/build/ExportOptions.plist
## 導(dǎo)出后的ipa路徑
EXPORTPATHIPA=$SORCEPATH/build/$SCHEME/$SCHEME.ipa

echo -e "============First Build Clean============"
## 清理緩存
## 如果工程使用的是cocoapods,則'-project %s.xcodeproj'替換為'-workspace %s.xcworkspace'
xcodebuild clean -project $SPACE -scheme ${SCHEME} -configuration ${BUILD_TYPE}
echo -e "============Build Clean============"
## 輸出關(guān)鍵信息
echo -e "  TARGET_NAME    : ${TARGET_NAME}"
echo -e "  BUILD_TYPE    : ${BUILD_TYPE}"
echo -e "  SORCEPATH    : ${SORCEPATH}"
echo -e "  ARCHIVEPATH    : ${ARCHIVEPATH}"
echo -e "  EXPORTPATH    : ${EXPORTPATH}"
echo -e "  EXPORTOPTIONSPLIST    : ${EXPORTOPTIONSPLIST}"
echo -e "============Build Archive============"

## 導(dǎo)出archive包
xcodebuild archive -project ${SPACE} -scheme ${SCHEME} -archivePath $ARCHIVEPATH
echo -e "============Build Archive Success============"

echo -e "============Export IPA============"
## 導(dǎo)出IPA包
xcodebuild -exportArchive -archivePath $ARCHIVEPATH -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST}
echo -e "============Export IPA SUCCESS============"

## 編譯完成時(shí)間 20181030_0931
BUILD_DATE="$(date +'%Y%m%d_%H%M')"

## info.plist路徑
PROJECT_INFOPLIST_PATH="${SORCEPATH}/${TARGET_NAME}/Info.plist"
## 取版本號
BUNDLESHORTVERSION=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${PROJECT_INFOPLIST_PATH}")
## 取build值
VERSION=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${PROJECT_INFOPLIST_PATH}")
## ipa更名規(guī)則  項(xiàng)目名V版本_年月日_時(shí)分
IPANAME="${TARGET_NAME}V${BUNDLESHORTVERSION}_${BUILD_DATE}.ipa"
## 更名后ipa路徑
EXPORTPATHNEWIPA=$EXPORTPATH/$IPANAME

echo -e "============Export end :${BUILD_DATE}============"
echo -e "============IPA Old Name: ${EXPORTPATHIPA}============"
echo -e "============IPA New Name: ${EXPORTPATHNEWIPA}============"

## IPA更名
cp $EXPORTPATHIPA $EXPORTPATHNEWIPA
echo -e "============Create New Name Success============"
## 刪除老IPA
rm $EXPORTPATHIPA
echo -e "============Delete Old Name Success============"

#userKey和apiKey需要在蒲公英的賬號設(shè)置中查找
userKey="xxx"
apiKey="xxx"
#蒲公英打包
curl -F "file=@${EXPORTPATHNEWIPA}" \
-F "uKey=${userKey}" \
-F "_api_key=${apiKey}" \
-F "isPublishToPublic=2" \
http://www.pgyer.com/apiv1/app/upload
  • ExportOptions.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>provisioningProfiles</key>
    <dict>
        <key>com.Y***ane</key>
        <string>azur***_dev</string>
    </dict>
    <key>method</key>
    <string>development</string>
    <key>signingCertificate</key>
    <string>iPhone Developer</string>
    <key>signingStyle</key>
    <string>manual</string>
    <key>teamID</key>
    <string>42***ZL</string>
    <key>compileBitcode</key>
    <false/>
    <key>uploadSymbols</key>
    <false/>
</dict>
</plist>
  • 其中plist文件中的method參數(shù)有如下幾個(gè)方法:app-store, ad-hoc, enterprise, development
    3.7. 構(gòu)建后操作

  • 郵件通知系統(tǒng),通過系統(tǒng)管理系統(tǒng)設(shè)置,進(jìn)行郵件配置

  • 設(shè)置jenkins地址和管理員郵箱地址

  • 設(shè)置發(fā)件人等信息
    這里的發(fā)件人郵箱地址切記要和系統(tǒng)管理員郵件地址保持一致


  • 注:上圖的Password為郵箱的SMTP授權(quán)秘鑰,至此系統(tǒng)管理處的內(nèi)容已配置完成

  • 配置Jenkins自帶的郵件功能(測試郵件功能是否正常使用,可以不配置,不影響)

和上面Extended E-mail Notification配置一樣即可,點(diǎn)擊Test configuration,收到郵件并且顯示Email was successfully sent,代表郵件配置成功,接下來可以去項(xiàng)目中具體配置就可以使用了

  • 進(jìn)入項(xiàng)目,然后找到構(gòu)建后操作,點(diǎn)擊增加構(gòu)建后的操作步驟,點(diǎn)擊Editable Email Notification


  • 至此所有的配置已完成,點(diǎn)擊應(yīng)用后保存,enjoy it!

Project Recipient List:這個(gè)項(xiàng)目的需要發(fā)送郵件給哪些人,可以在這里輸入多個(gè)郵箱,中間以英文逗號隔開
Project Reply-To List:保持默認(rèn)即可,這個(gè)是收到郵件的人回復(fù)郵件時(shí)候回復(fù)給誰用的,一般不會(huì)回復(fù)郵件
Content Type:可以選擇Html或者Default也行,因?yàn)槲覀冊趈enkins系統(tǒng)設(shè)置中的默認(rèn)格式就是html
Default Subject: 郵件主題,可以書寫成:XXX項(xiàng)目iOS打包通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! 分析下這幾個(gè)參數(shù)什么意思:$PROJECT_NAME 構(gòu)建項(xiàng)目的名稱;$BUILD_NUMBER 構(gòu)建的號碼;$BUILD_STATUS 構(gòu)建狀態(tài),這幾個(gè)參數(shù),它會(huì)自動(dòng)讀取,按照這種格式書寫即可
Default Content:郵件內(nèi)容,以下內(nèi)容為模板,可直接復(fù)制修改使用:

<hr/>
本郵件是程序自動(dòng)下發(fā)的,請勿回復(fù)!<br/><hr/>
項(xiàng)目名稱:$PROJECT_NAME<br/><hr/>
構(gòu)建編號:$BUILD_NUMBER<br/><hr/>
構(gòu)建狀態(tài):$BUILD_STATUS<br/><hr/>
觸發(fā)原因:${CAUSE}<br/><hr/>
構(gòu)建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console/</a><br/><hr/>
構(gòu)建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/>
構(gòu)建報(bào)告:<a href="${BUILD_URL}testReport">${BUILD_URL}testReport/</a><br/><hr/>
變更集:${JELLY_SCRIPT,template="html"}<br/><hr/>
  1. Jenkins卸載方法(Windows/Linux/MacOS)
  • 如果使用brew安裝的,可以執(zhí)行以下命令$ brew uninstall jenkins

  • 注:Jenkins修改工程的工作空間
    在項(xiàng)目的配置中點(diǎn)擊高級,選擇使用自定義工作空間,輸入工作空間路徑即可


  • 注意:使用Jenkins Pipeline動(dòng)態(tài)參數(shù)傳遞Git分支時(shí),需要取消Pipeline輕量級檢出選項(xiàng),不然git分支參數(shù)傳遞會(huì)有問題

附:我的博客地址

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

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