Jenkins自動(dòng)化打包iOS

準(zhǔn)備工作
1.jenkins官網(wǎng)下載、安裝好jenkins,插件選擇新手推薦安裝,安裝完后再安裝個(gè)Xcode intergram插件用來打包.
2.如果使用的是ssh,提前準(zhǔn)備好ssh秘鑰,放到/Users/iosmac/.ssh下,代碼量比較大,打包下載代碼的時(shí)候可能會(huì)出現(xiàn)超時(shí)的情況,需要多試幾下。

創(chuàng)建項(xiàng)目,添加構(gòu)建過程:
1.新建一個(gè)任務(wù),命名好,選擇第一個(gè)構(gòu)建一個(gè)自由風(fēng)格的軟件。


141669963613_.pic.jpg

2.添加一些打包前用到的參數(shù),branch_name(打包分支名稱)、baletu_configuration(打包環(huán)境)、ipa_type(ipa包的類型)、app_version(app的版本號(hào))、app_build_version(app內(nèi)版本號(hào))等自己下面腳本需要用到的參數(shù),注意參數(shù)名和下面用到的藥一致,別寫錯(cuò)了。


151669963671_.pic.jpg

161669963722_.pic.jpg

421670231411_.pic.jpg

3.準(zhǔn)備好參數(shù)后,配置git分之,以及訪問的賬號(hào)密碼,后面appstore的賬號(hào)密碼也在這次添加憑證的時(shí)候添加了,后面直接選就可以,打包的分支也改成我們上面輸入的要打包的分支$branch_name


181669963934_.pic.jpg

191669963995_.pic.jpg

4.構(gòu)建環(huán)境中,配置需要上傳appstore用的賬號(hào)密碼,在步驟3里已經(jīng)添加過憑證了。


201669964134_.pic.jpg

5.執(zhí)行腳本,上面如果填寫了版本號(hào)和內(nèi)版本號(hào)用腳本寫到項(xiàng)目中的plist文件中去,項(xiàng)目中展示git分支,也是用腳本把獲取到的git分之寫到plist文件中。


211669964522_.pic.jpg

6.BuildSteps中添加我們安裝過的Xcode插件,配置打包流程需要的參數(shù),依次填寫teamID,以及上面選擇的打包環(huán)境、ipa_type,以及要打包項(xiàng)目的scheme,打包出來的ipa名稱、輸出目錄、bitCode等選項(xiàng)。


221669964566_.pic.jpg

231669965003_.pic.jpg

241669965284_.pic.jpg

7.打包完需要簽名,配置簽名環(huán)境。


251669965378_.pic.jpg

8.配置完簽名需要再 Advanced Xcode build options里配置下workspace的名字,不然如果是cocopods管理的項(xiàng)目直接編譯project會(huì)報(bào)找不到cocopods導(dǎo)入的庫的頭文件。


301669973693_.pic.jpg

311669973707_.pic.jpg

9.打包簽名完成,判斷是測(cè)試包還是發(fā)布包,上傳蒲公英或則appstore


261669965454_.pic.jpg

10.上傳bugly(最新的jenkins java環(huán)境是11 bugly的jar包要求環(huán)境是java8,會(huì)報(bào)錯(cuò)誤: 嘗試打開文件/Users/iosmac/Desktop/baletu_bugly_dsym_upload/buglyqq-upload-symbol.jar時(shí)出現(xiàn)意外錯(cuò)誤,需要設(shè)置kenkins的java環(huán)境是java8,如下圖)


5711677577059_.pic.jpg
641670556839_.pic.jpg

!

注意:
有的項(xiàng)目工程比較大,拉去git超時(shí),拉不下來。
1.再git配置下Additional Behaviours添加額外操作,設(shè)置超時(shí)時(shí)間,以及是否是淺克隆。

381670224493_.pic.jpg

2.如果是用戶名密碼拉取代碼的,可以改成ssh訪問,可以提高速度。憑證設(shè)置成ssh,填入賬號(hào)、以及把git ssh私鑰直接復(fù)制過來填寫。
391670224537_.pic.jpg

401670224701_.pic.jpg

3.如果以上都不行,可以創(chuàng)建任務(wù)的時(shí)候選擇流水線的方式來創(chuàng)建,也可以設(shè)置超時(shí)時(shí)間。流水線語法不會(huì)寫,可以點(diǎn)擊流水線語法
來選擇對(duì)應(yīng)的插件,填寫完內(nèi)容后,轉(zhuǎn)換成流水線語法,在復(fù)制過來。(選擇git插件(git) 轉(zhuǎn)換完,選擇驗(yàn)證插件(bind creditails to variables),選擇xcode插件,缺啥流程選啥流程,shell命令轉(zhuǎn)換)

鑰匙串的路徑:
${HOME}/Library/Keychains/login.keychain-db

下面是用到的腳本:

#設(shè)置版本號(hào),寫到plist文件中
echo "set marketing version";
echo $baletu_version;
if [ $baletu_version ]
then
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $baletu_version" ${WORKSPACE}/BlueMobiProject/Baletu-Info.plist
fi

echo "set build version";
echo $baletu_build_version;
if [ $baletu_build_version ]
then
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $baletu_build_version" ${WORKSPACE}/BlueMobiProject/Baletu-Info.plist
fi

#上傳蒲公英  釘釘通知結(jié)果
##json解析函數(shù)
# $1 $2  json lable
function jsonParse() { 
     JSON_CONTENT=$1
     KEY='"'$2'":'
     echo ${JSON_CONTENT} | awk -F  ${KEY}  '{print $2}' | awk -F '"' '{print $2}'
}

##刪除斜杠'\'
function trimSlash() {
    TEXT=$1
    echo ${TEXT//'\'/''}
}

if [[ $ipa_type = "ad-hoc" ]] || [[ $ipa_type = "development" ]]
then
ipaPath=${WORKSPACE}/build/${baletu_configuration}-iphoneos/${BUILD_NUMBER}/Baletu.ipa
RESPONSE=$(curl -F "file=@$ipaPath" -F '_api_key=b6aff1e86753ab7320d45df8ff00587e' https://www.pgyer.com/apiv2/app/upload)
if [ $? -eq 0 ];then
    echo "=============提交蒲公英成功 ============="
    appQRCodeURL=$(trimSlash $(jsonParse "${RESPONSE}" "buildQRCodeURL"))
    appVersion=$(jsonParse "${RESPONSE}" "buildVersion")
    appBuildVersion=$(jsonParse "${RESPONSE}" "buildBuildVersion")
    #通知到釘釘群 將xxxxxxxx替換為真實(shí)access_token `title`需要包含關(guān)鍵詞
    curl 'https://oapi.dingtalk.com/robot/send?access_token=adb9a2b29410ead1fe7cdb6fe1966c593dc98bf3714db64e4aa04635998a0927' \
        -H 'Content-Type: application/json' \
        -d '
    {
        "msgtype": "markdown",
        "markdown": {
            "title":"打包通知",
            "text":"![screenshot]('"$appQRCodeURL"')  \n  **項(xiàng)目:** '"租客版"'  \n  **版本:** '"$appVersion"' (build '"$appBuildVersion"')  \n  **環(huán)境:** '"$ipa_type"'  \n  **分支:** '"$branch_name"' "
        }
    }'
    else
    echo "=============提交蒲公英失敗 ============="
    fi
fi

#上傳appstore
if [ $ipa_type = "app-store" ]
then
xcrun altool --upload-app -f "${WORKSPACE}/build/${baletu_configuration}-iphoneos/${BUILD_NUMBER}/Baletu.ipa" -u ${appstore_user_name} -p ${appstore_password}
fi



#添加bin/bash/ 處理獲取plist文件版本號(hào)導(dǎo)致不往下走的,jenkins默認(rèn)的指令出錯(cuò)停止執(zhí)行,使用bin/bash指令,還可以繼續(xù)往下執(zhí)行
#!/bin/bash
#upload renter dysm
if [ $ipa_type = "app-store" ]
then
APP_ID="8fc434c000"
APP_KEY="ad65ceab-0c93-4fa6-ade1-77b74e4fceb2"
APP_BUNDLEID=com.Bateu.wanjian
PRODUCT_NAME=Baletu
PLIST_FILE="${WORKSPACE}/BlueMobiProject/Baletu-Info.plist"
RELEATIVE_PATH=${WORKSPACE}/build/${baletu_configuration}-iphoneos/
APP_VERSION=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${PLIST_FILE}`
echo "LBLog read plist appversion is $APP_VERSION"
readPlistVersionFailed=$(echo $APP_VERSION | grep "(MARKETING_VERSION)")
if [[ "$readPlistVersionFailed" != "" ]]; then
    echo "LBLog  is MARKETING_VERSION, read Build plist version"
    DISTRIBUTION_PLIST_PATH="$RELEATIVE_PATH/${BUILD_NUMBER}/DistributionSummary.plist"
    APP_VERSION_KEY_PATH="Baletu.ipa:0:versionNumber"
    APP_VERSION=`/usr/libexec/PlistBuddy -c "Print :$APP_VERSION_KEY_PATH" ${DISTRIBUTION_PLIST_PATH}`
fi
echo "upload ipa to app store"
echo "upload exportArchive ${exportArchive}"
echo "upload exportPath ${exportPath}"
echo "APP_BUNDLEID is ${APP_BUNDLEID}  APP_VERSION IS ${APP_VERSION}"

ARCHIVE_XCARCHIVE_PATH=${RELEATIVE_PATH}/${PRODUCT_NAME}.xcarchive
DSYM_PATH=${ARCHIVE_XCARCHIVE_PATH}/dSYMs/${PRODUCT_NAME}.app.dSYM
BACK_UP_DSYM_FOLDER_PATH=${RELEATIVE_PATH}/${BUILD_NUMBER}/UPLOAD_BUGLY_DYSM_BACKUP
BACK_UP_DSYM_FILE_PATH=${RELEATIVE_PATH}/${BUILD_NUMBER}/UPLOAD_BUGLY_DYSM_BACKUP/${PRODUCT_NAME}-dSYM.dSYM
LOG_FILE_PATH=${RELEATIVE_PATH}/$(date "+%Y-%m-%d %H:%M:%S").txt
UPLOAD_JAR_FILE_PATH=${HOME}/Desktop/baletu_bugly_dsym_upload/buglyqq-upload-symbol.jar
# 創(chuàng)建log日志文件
if [ ! -f "${LOG_FILE_PATH}" ]  # 判斷日志文件是否存在
then
    touch $LOG_FILE_PATH
fi
#沒有備份的文件夾路
if [ ! -d "${BACK_UP_DSYM_FOLDER_PATH}" ] #判斷項(xiàng)目文件夾是否存在
 then
    mkdir "${BACK_UP_DSYM_FOLDER_PATH}"
fi
# 復(fù)制符號(hào)表到備份文件夾下
echo "start backup dysm file"
cp -r "${DSYM_PATH}" "${BACK_UP_DSYM_FILE_PATH}"
java -jar ${UPLOAD_JAR_FILE_PATH} -appid $APP_ID -appkey $APP_KEY -bundleid $APP_BUNDLEID -version $APP_VERSION -platform IOS -inputSymbol $DSYM_PATH 2>&1 | tee -ai $LOG_FILE_PATH
fi

使用命令行來備份項(xiàng)目和使用命令行來根據(jù)備份項(xiàng)目創(chuàng)建一個(gè)新的項(xiàng)目(參考:https://blog.csdn.net/wangxiaoyu_m/article/details/119800531
先Jenkins 系統(tǒng)管理-》工具和動(dòng)作-》Jenkins命令接口-》下載jenkins-cli.jar,下載完成后執(zhí)行jar包備份項(xiàng)目

java -jar jenkins-cli.jar -s 【jenkins訪問路徑,即登錄jenkins后的路徑】 -auth 【jenkins登錄賬號(hào)】:【jenkins登錄密碼】 get-job 【job名稱】> 【job名稱】.xml
#備份一個(gè)項(xiàng)目
java -jar jenkins-cli.jar -s http://192.168.83.159:8080 -auth liubin:liubin123 get-job landlord_ios> backup_landlord_ios.xml
#根據(jù)備份創(chuàng)建一個(gè)項(xiàng)目
java -jar jenkins-cli.jar -s http://192.168.83.159:8080 -auth liubin:liubin123 create-job test_backup_project < backup_landlord_ios.xml

備份文件:
https://www.aliyundrive.com/drive/legacy/folder/63903a410181509b45b9452fa4fc82addeafbad3

上傳bugly,項(xiàng)目中上傳的方式

5081670394325_.pic.jpg

上傳腳本文件在:
https://www.aliyundrive.com/drive/folder/63903a410181509b45b9452fa4fc82addeafbad3

xcrun atool上傳appstore的api文檔地址:
https://help.apple.com/asc/appsaltool/#/apdATD1E53-D1E1A1303-D1E53A1126

發(fā)釘釘群消息接入文檔:
https://cloud.tencent.com/developer/article/2057229

jenkins上傳蒲公英插件方式:
https://github.com/jenkinsci/upload-pgyer-plugin/blob/master/README_cn.md

最后編輯于
?著作權(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)容