Flutter Jenkins打包

前段時(shí)間公司重構(gòu)了一個(gè)flutter項(xiàng)目,自動(dòng)化打包用的是Jenkins,在這過(guò)程中頁(yè)遇到了一些坑,借此寫一篇文章來(lái),讓大家少走些彎路。
先看一下打包完成的效果圖:


image.png

我實(shí)現(xiàn)的效果是打包成功后顯示工程名+打包模式+分支名,并顯示fir掃碼安裝的地址,這些都是通過(guò)插件來(lái)完成的,下面會(huì)詳細(xì)介紹到。
在打包之前首先要做一些環(huán)境配置的工作,比如:

  • iOS需要單獨(dú)配一臺(tái)Mac來(lái)進(jìn)行打包,因?yàn)樾枰猉code,Docker是沒(méi)有Xcode環(huán)境
  • android最好也放在這臺(tái)Mac上打包,因?yàn)槟阋肈ocker的話會(huì)遇到文件讀寫權(quán)限的問(wèn)題
  • 搭建Flutter開(kāi)發(fā)環(huán)境
  • 確保本地能打包成功,本地打包請(qǐng)參考iOS,Android

Jenkins環(huán)境配置

1. 安裝 JRE環(huán)境

Jenkins 運(yùn)行依賴于java環(huán)境 ,沒(méi)有安裝的請(qǐng)去官網(wǎng)自行下載安裝

2. 安裝 Jenkins

千萬(wàn)別用官網(wǎng)下載的pkg包進(jìn)行安裝,它會(huì)默認(rèn)將 Jenkins安裝在/Users/Shared目錄下,在打包的時(shí)候會(huì)遇到權(quán)限問(wèn)題, 所以強(qiáng)烈建議大家用brew來(lái)安裝Jenkins.

  1. 安裝Jenkins

    brew install jenkins

  2. 命令行啟動(dòng)Jenkins

    java -jar /usr/local/Cellar/jenkins/${你的Jenkins版本}/libexec/jenkins.war --httpPort=8080
    或
    Jenkins
    
  3. 打開(kāi)瀏覽器,輸入 localhost:8080 就可看到Jenkins的web界面

  4. Jenkins開(kāi)機(jī)啟動(dòng)

    命令行安裝的jenkins不自備開(kāi)機(jī)啟動(dòng)功能,每次重啟后都要命令行執(zhí)行啟動(dòng),非常麻煩,使用以下步驟可以在每次開(kāi)機(jī)后自動(dòng)拉起一個(gè)jenkins的命令行。

    1. 創(chuàng)建開(kāi)機(jī)啟動(dòng)腳本 jenkinsBoot.sh

    2. 加入啟動(dòng)jenkins代碼


      image.png
    3. 設(shè)置腳本權(quán)限

      sudo chmod 777 xxxx/jenkinsBoot.sh

    4. 設(shè)置腳本打開(kāi)方式


      image.png
    5. 設(shè)置腳本引用,使腳本可執(zhí)行
      chmod +x xxxx/jenkinsBoot.sh

    6. 加入用戶的登錄項(xiàng)


      image.png
    7. 重新啟動(dòng)計(jì)算機(jī),會(huì)發(fā)現(xiàn)自動(dòng)執(zhí)行了jenkinsBoot.sh這個(gè)腳本。

3. Jenkins配置

第一次打開(kāi)Jenkins時(shí)需要解鎖Jenkins,你看到的頁(yè)面是這樣的


image.png

進(jìn)入紅色字體路徑下將密碼拷貝到輸入框,點(diǎn)擊continue

然后點(diǎn)擊左側(cè)一個(gè)模塊進(jìn)入下載頁(yè)面,時(shí)間可能會(huì)很久,耐心等待

image.png
image.png

自定義設(shè)置用戶名及密碼,點(diǎn)擊保存并完成按鈕,進(jìn)入下圖頁(yè)面。

image.png

安裝插件flutter打包所需要的插件,點(diǎn)擊系統(tǒng)管理->插件設(shè)置

  1. Keychains and Provisioning Profiles Management(iOS證書管理)
  2. Xcode integration(iOS專用)
  3. Gradle plugin(Android專用)
  4. description setter plugin(根據(jù)構(gòu)建日志文件的RegEx,設(shè)置每個(gè)構(gòu)建的描述。比如fir的上傳地址)

4. 項(xiàng)目工程配置

iOS

  1. 新建項(xiàng)目
image.png
  1. 項(xiàng)目構(gòu)建配置
image.png

打包類型(注意:AdHoc需要在你項(xiàng)目中配置configuration,自行g(shù)oogle)

image.png

打包分支

image.png

源代碼管理


image.png

SSH私鑰添加


image.png

證書和描述文件配置


image.png
image.png

iOS證書和描述文件首先要在系統(tǒng)管理->Keychains and Provisioning Profiles Management中設(shè)置和上傳后才能在你的項(xiàng)目中選擇添加,iOS證書和描述文件的制作我就不多說(shuō)了,自行Google


image.png

這里的login.keychain文件可能需要自己copy到桌面并改下文件后綴,因?yàn)樗请[藏文件


image.png

這里的描述文件都要上傳,其實(shí)路徑就可以寫/Users/xxxx/Library/MobileDevice/Provisioning Profiles路徑,這是Xcode保存描述文件的路徑,上傳的時(shí)候也可以去這個(gè)路徑下去上傳


image.png

一切準(zhǔn)備好后就可以在項(xiàng)目配置中選擇證書和描述文件了,這時(shí)我們第一次add keychain可能不能去選擇Code Signing Identity,需要我們保存一下后就能選擇了

image.png

image.png

在這里我們使用shell腳本來(lái)構(gòu)建,以便我們構(gòu)建完成能夠上傳到fir上。

腳本代碼

 security set-key-partition-list -S apple-tool:,apple: -s -k "開(kāi)機(jī)密碼" ~/Library/Keychains/login.keychain-db
#假設(shè)腳本放置在與項(xiàng)目相同的路徑下
project_path=$(pwd)
# flutter環(huán)境變量設(shè)置
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH=/Users/yongjianhe/flutter/bin:$PATH
flutter build ios
cd $project_path/ios
#取當(dāng)前時(shí)間字符串添加到文件結(jié)尾
now=$(date +"%Y_%m_%d_%H:%M")
#指定項(xiàng)目的scheme名稱
scheme="Runner"
#指定要打包的配置名
configuration=${BUILD_TYPE}
#指定打包所使用的輸出方式,目前支持app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method參數(shù)
if [ $BUILD_TYPE == "Release" ]
then
    export_method="app-store"
elif [ $BUILD_TYPE == "AdHoc" ]
then
    export_method="ad-hoc"
else
    export_method="development"
fi
#指定項(xiàng)目地址
workspace_path="${project_path}/ios/Runner.xcodeproj"
#指定輸出路徑
rm -rf "${project_path}/ipa"
mkdir -p "${project_path}/ipa"
output_path="${project_path}/ipa"
#指定輸出歸檔文件地址
archive_path="$output_path/zaihui_crm_${export_method}_${now}.xcarchive"
#指定輸出ipa地址
ipa_path="$output_path/zaihui_crm_${BUILD_TYPE}_${BUILD_BRANCH}_${BUILD_REPOSITORY}_${now}.ipa"
#指定輸出ipa名稱
ipa_name="zaihui_crm_${BUILD_TYPE}_${BUILD_BRANCH}_${now}.ipa"
commit_msg="$1"
#輸出設(shè)定的變量值
echo "===workspace path: ${workspace_path}==="
echo "===archive path: ${archive_path}==="
echo "===ipa path: ${ipa_path}==="
echo "===export method: ${export_method}==="
echo "===commit msg: $1==="
#先清空前一次build
fastlane gym --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}
#上傳到fir
if [ ${export_method} != "app-store" ]
then
fir publish ${ipa_path} -T "fir API token" -c $commit_msg
fi

因?yàn)槲沂褂玫氖莊astlane指令打包的,所以打包的電腦需要安裝fastlane

這里有個(gè)地方需要注意的點(diǎn)就是當(dāng)出現(xiàn)打包失敗是由于運(yùn)行flutter腳本錯(cuò)誤造成的時(shí)候,這個(gè)原因可能是你當(dāng)前的flutter版本運(yùn)行flutter build iOS時(shí),在Generated.xcconfig中并沒(méi)有生成FLUTTER_BUILD_MODE參數(shù),這個(gè)是運(yùn)行flutter腳本所需要的參數(shù),不過(guò)沒(méi)事,你只需要在你的工程文件再添加一個(gè)腳本就行了。

image.png

最后還要在你的工程中設(shè)置描述文件(制作相應(yīng)環(huán)境的描述文件,下載并打開(kāi),debug對(duì)應(yīng)開(kāi)發(fā)證書,adhoc和release對(duì)應(yīng)生產(chǎn)證書),到了這里大家可能有個(gè)疑問(wèn),就是前面我都上傳了證書了,為什么這里還要填寫,原因是前面上傳的證書只是為了保存Code Signing Identity以便在login.keychain去訪問(wèn)他,而不是去保存它,我想描述文件也同樣如此,所以我們需要設(shè)置描述文件的路徑

image.png

構(gòu)建名稱設(shè)置工程名+打包模式+分支名

image.png

最后一步,在編譯歷史中成功顯示fir地址,先要設(shè)置Html顯示


WechatIMG4650.jpeg
image.png

這時(shí)候你就能打出iOS包了并顯示了

Android

安卓打包相對(duì)于iOS來(lái)說(shuō)就簡(jiǎn)單很多了

  1. 新建項(xiàng)目


    image.png
  2. 項(xiàng)目構(gòu)建配置


    image.png

    image.png

    image.png

    image.png

    image.png
如果大家在iOS證書和描述文件以及安卓上有其它問(wèn)題,可以參考一下以下兩篇文章:
最后編輯于
?著作權(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)容