flutter項目使用jenkins自動部署

操作系統(tǒng):macOS Big Sur
前置需求:

# Terminal:homebrew码泛、rvm、ruby饿这、gem浊伙、cocoapods
# 編譯器:vscode、androidStudio长捧、xcode
# Flutter:flutter sdk嚣鄙、dart
# Android&iOS:android sdk、gradle串结、jdk哑子、.keystore、P12肌割、.mobileprovision等
# terminal運行flutter doctor無異常
# vscode編譯運行flutter項目成功
# androidStudio和xcode單獨編譯運行flutter項目下的android和ios項目成功

ok卧蜓,開始搞jenkins

1、使用homebrew安裝jenkins

Terminal運行命令brew install Jenkins

2把敞、運行jenkins

Terminal運行命令jenkins弥奸,最終出現(xiàn) Jenkins is fully up and running代表運行成功

3、初始化jenkins

在瀏覽器地址欄輸入http://localhost:8080/
然后首次安裝啟動就會出現(xiàn)新手引導(dǎo)奋早,根據(jù)引導(dǎo)操作
自定義jenkins那里選擇安裝推薦的插件
PS:這里我很多插件都安裝失敗了盛霎,這個沒關(guān)系,可以進去再自己安裝或者不再安裝貌似也沒啥影響耽装,繼續(xù)向下操作即可
最后的實例配置那愤炸,默認即可,也可以設(shè)置一個地址
PS:如果要設(shè)置的話掉奄,就是自己的電腦ip地址+8080端口就行规个,配置完之后系統(tǒng)管理里報了一個反向代理設(shè)置有誤,目前沒發(fā)現(xiàn)這個報錯有什么不好的影響姓建,這個地址也可以以后在jenkins系統(tǒng)管理-系統(tǒng)配置里改的诞仓,這個主要是用來讓別的同事來訪問時要用的,自己用的話就不用設(shè)置引瀑,額外說一個狂芋,如果同事電腦掛了vpn,大概率是訪問不了你設(shè)置的這個地址的憨栽,退掉vpn即可

4帜矾、安裝插件

進來第一步就是安裝插件了,這里要用到哪些我也是根據(jù)別人的博客找的屑柔,但是由于我主要是用shell命令屡萤,所以好像很多都沒用上,但是安裝了也不虧掸宛。死陆。。
gitLab Plugin、gitLab Hook Plugin措译、Xcode integration别凤、keychains and provisioning profiles Management,DingTalk等
PS:說下這個Upload Keychain or Provisioning Profile File插件领虹,這個是用來管理iOS證書和配置文件的规哪,但是吐血的是,無論如何都傳不上去塌衰,搞到頭禿诉稍,最后沒辦法,放棄治療最疆,好在還有別的辦法杯巨,往下看
然后DingTalk這個是在構(gòu)建成功后自動通知到釘釘群的插件,我這邊用到了努酸,下面也有介紹

5服爷、iOS相關(guān)設(shè)置

系統(tǒng)管理-Manage Credentials


WX20210624-114517.png

點擊 Stores scoped to Jenkins下面的域-全局,然后就可以添加全局憑據(jù)了获诈,這里要添加的是:

gitLab或者gitHub賬號密碼(Username with password)
/Library/Keychains路徑(macOS Keychain password and path)
mobileprovision文件(Apple Developer Profile)
P12文件(Certificate)

Upload Keychain or Provisioning Profile File插件用不了层扶,配置文件在這里添加也是一樣的

6、Android相關(guān)設(shè)置

系統(tǒng)管理-系統(tǒng)配置-全局屬性-環(huán)境變量
Android SDK設(shè)置


2.png

系統(tǒng)管理-全局工具配置
JDK設(shè)置


3.png

Gradle設(shè)置


4.png

7烙荷、釘釘插件通知配置

在釘釘群的設(shè)置-智能群助手-添加自定義機器人
要復(fù)制一下webhook鏈接,下面要用檬寂,還有關(guān)鍵字設(shè)置终抽,要釘釘和jenkins一致


5.png

在jenkins系統(tǒng)管理-系統(tǒng)配置中,設(shè)置釘釘桶至,點擊測試如果群聊能收到通知就可以


6.png

8昼伴、新建任務(wù)

這里是Android和iOS各建一個,選擇freestyle即可镣屹,兩邊別的都一樣圃郊,就是shell命令不一樣,下面會貼
點開新建的任務(wù)女蜈,點擊配置

①描述和釘釘


8.png

②git信息


9.png

git這里是自己項目的git地址和之前全局配置的git賬號密碼持舆,也可以再這里添加新的賬號密碼

③構(gòu)建觸發(fā)器和構(gòu)建環(huán)境都不用選

④構(gòu)建
選擇執(zhí)行shell,然后填寫shell命令(iOS和Android我都貼上了伪窖,可以自己參考和修改)
里面的一些關(guān)鍵密碼和文件名等逸寓,我改成了文字描述或者***,都填自己的
此shell支持的一些功能:清空指定文件夾覆山,替換指定文件竹伸,替換指定文件的指定內(nèi)容,導(dǎo)出安裝包簇宽,上傳蒲公英勋篓,安裝包重命名(version+build+時間)吧享,安裝包上傳svn

iOS打包shell

# keychain-這里可能你進去看到只有l(wèi)ogin.keychain-db,復(fù)制一份然后去掉-db即可
security unlock-keychain -p 電腦密碼 ${HOME}/library/keychains/login.keychain

# 工程名-在xcode中查看PROJECT
APP_NAME="Runner"

# target-在xcode中查看TARGETS
TARGET_NAME="primary"

# 證書
# 這里是鑰匙串中證書的顯示簡介-常用名稱
CODE_SIGN_DISTRIBUTION="Apple Development: *** (Q3******UZ)"

# 這里是mobileprovision文件的UUID
provisoning_profile="e4270330-***********-473b3a50de58"

# 模式
CONFIGURATION="Release"

# 路徑 這個路徑要自己看/Users/你的電腦用戶名/.jenkins/workspace/下的譬嚣,你每建一個項目钢颂,構(gòu)建后都會在這下面創(chuàng)建對應(yīng)的文件夾存放git clone下來的項目
WORKSPACE_PATH=${WORKSPACE}/witparking/ios/${APP_NAME}.xcworkspace
# 這個是導(dǎo)出ipa用的文件,用xcode導(dǎo)出一個對應(yīng)模式的ipa就能獲取到孤荣,把那個文件的路徑放這里
EXPORT_OPTIONS=/Users/你的電腦用戶名/Desktop/***/ExportOptions.plist
ArchivePath=/Users/***/.jenkins/workspace/witParkingIOS@tmp/
EXPORTIPA=/Users/***/.jenkins/workspace/witParkingIOS@tmp/

# 清空存放ipa的文件夾
cd ${EXPORTIPA}
rm -rf *

# 將指定文件的指定內(nèi)容替換掉pro/dev/test
# 這里是修改main_primary文件的指定內(nèi)容甸陌,切換環(huán)境
# 如下示例意思是,使用app5test.wit替換該文件的從app開始盐股,到wit結(jié)束的指定字段
cd ${WORKSPACE}/witparking/lib/flavors
sed -i '' "s/app.*wit/app5test.wit/" main_primary.dart

# flutter pub get
cd ${WORKSPACE}/witparking/
flutter pub get

# build app钱豁,里面的primary是前面的target
flutter build ios --release --flavor primary -t lib/flavors/main_primary.dart

# 進入原生項目 archive和export
cd ${WORKSPACE}/witparking/ios/

pod install

# 導(dǎo)出achive,里面的primary是前面的target
xcodebuild archive -workspace ${WORKSPACE_PATH} -scheme "primary" -configuration ${CONFIGURATION} -sdk iphoneos -archivePath ${ArchivePath}runner.xcarchive

# 導(dǎo)出ipa
xcodebuild -exportArchive -archivePath ${ArchivePath}runner.xcarchive -exportPath ${EXPORTIPA}runner -exportOptionsPlist ¥{EXPORT_OPTIONS}

# echo "=================上傳到蒲公英分發(fā)平臺 ================="
curl -F "file=@${EXPORTIPA}runner/Runner.ipa" \

# uKey和api_key都可以去蒲公英自己的賬號信息里查看
-F "uKey=662aad68ce*****32c8114d87a13" \
-F "_api_key=46755cd719*******b4fd8fa55f" \
[https://www.pgyer.com/apiv1/app/upload](https://www.pgyer.com/apiv1/app/upload)

# ipa重命名(這里重命名是因為上傳svn有統(tǒng)一的命名格式)

# info.plist路徑
project_infoplist_path=${WORKSPACE}/witparking/ios/Info.plist

# 取版本號
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")

# 取build值
bundleBuild=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")

# 獲取年月日時分
DATE="$(date +%Y%m%d%H%M)"

cd ${EXPORTIPA}runner

# 拼接新名字
ipaReName=${bundleVersion}-${bundleBuild}-${DATE}.ipa

# 替換
mv Runner.ipa ${ipaReName}

# 上傳svn

# 賬號信息
svnname=賬號
svnpwd=密碼
hostname=root
hostpwd=rootpwd

# 待提交文件
myFile=${ipaReName}

# ipa文件地址
resource_dir=${EXPORTIPA}runner/${myFile}

# 本地倉庫地址
commit_dir=/Users/***/Desktop/APP/測試環(huán)境/IOS

# svn路徑
target_svn_dir=svn://*****/測試/版本管理/APP版本/APP

cd $commit_dir

# 先更新項目
svn update --username $svnname --password $svnpwd

# 復(fù)制安裝包到提交目錄
cp $resource_dir $commit_dir

#增加項目
svn add $commit_dir/$myFile

#上傳項目
svn commit -m "commit file ipa" $commit_dir --username $svnname --password $svnpwd

echo "====================== svn commit end ======================"

Android apk打包shell

# apk目錄
WORKSPACE_PATH=${WORKSPACE}/witparking/build/app/outputs/apk/primary/release

# 將指定文件的指定內(nèi)容替換掉pro/dev/test
cd ${WORKSPACE}/witparking/lib/flavors
sed -i '' "s/app.*wit/app5test.wit/" main_primary.dart

# 清空存放apk的文件夾(首次編譯沒有這個路徑的文件夾疯汁,因此首次編譯需要注釋掉這里)
cd ${WORKSPACE_PATH}
rm -rf *

# flutter pub get
cd ${WORKSPACE}/witparking/
flutter pub get

# 安卓down下來的插件有個錯誤牲尺,會導(dǎo)致運行失敗,因此需要替換文件內(nèi)容
# 被替換文件

A=/Users/***/Desktop/flutter/.pub-cache/hosted/pub.flutter-io.cn/contact_picker-0.0.2/android/src/main/java/net/goderbauer/flutter/contactpicker/ContactPickerPlugin.java

# 替換文件
B=/Users/****/Desktop/WitParkingDEV/ContactPickerPlugin.java

cat $B > $A

echo "==========已替換插件文件=========="

# 編譯apk
flutter build apk --flavor primary -t lib/flavors/main_primary.dart --no-shrink

# 獲取最新apk包的名稱
cd ${WORKSPACE_PATH}

# apk名稱
fileName="xx"

# 遍歷獲取后綴為apk的文件名
traverse_dir()
{
    filepath=${WORKSPACE_PATH}
    for file in `ls -a $filepath`
    do
        if [ -d ${filepath}/$file ]
        then
            if [[ $file != '.' && $file != '..' ]]
            then
                # 遞歸
                traverse_dir ${filepath}/$file
            fi
        else
            # 調(diào)用查找指定后綴文件
            check_suffix $file
        fi
    done
}

# 獲取后綴為apk的文件
check_suffix()
{
    file=$1
    if [ "${file##*.}" = "apk" ];
    then
        fileName=${file}
    fi   
}

traverse_dir ${WORKSPACE_PATH}

# apk簽名

# 別名
aliase='****'

# 庫密碼
storepass='****'

# 簽名密碼
keypass='****'

# 秘鑰
keystore='/Users/****/Desktop/WitParkingDEV/com.rpms.uaandroid.keystore'
output="output"
if [ ! -d "$output" ];then
   mkdir $output
fi

# 簽名
function sign(){
     jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA -keystore $keystore -storepass $storepass -keypass $keypass -signedjar $tempname $filename $aliase
}
# $output"/"$(basename $filename .apk)"_signed.apk"
for filename in *
do
   if [ "${filename##*.}" = "apk" ]; then
       outputname=$output"/"${filename//_unsign/_signed}
       echo "簽名: "$filename
       tempname=$(basename $filename .apk)"_temp.apk"
       sign
       rm -rf $tempname
   fi
done
echo "-------簽名已完成------"

# echo "=================上傳到蒲公英分發(fā)平臺 ================="
同上

# apk加時間戳
# 獲取年月日時分
DATE="$(date +%Y%m%d%H%M)"

# 獲取不帶apk后綴的包名并重命名--從右邊開始幌蚊,刪除第一個.及右邊的字符
rename=${filename%.*}-${DATE}.apk
mv ${fileName} ${rename}

# 上傳svn
同上

⑤構(gòu)建后操作也不用做谤碳,保存

9、點擊立即構(gòu)建
如果構(gòu)建失敗可以點擊當(dāng)次構(gòu)建溢豆,然后點擊查看控制臺輸出蜒简,查看具體報錯進行修改,一般來說只要androidStudio和xcode能夠編譯成功的話漩仙,這邊問題都不大搓茬,一般都是一些小問題要改,如果構(gòu)建成功队他,就會通知到釘釘群了


10.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卷仑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子麸折,更是在濱河造成了極大的恐慌锡凝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垢啼,死亡現(xiàn)場離奇詭異窜锯,居然都是意外死亡,警方通過查閱死者的電腦和手機膊夹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門衬浑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人放刨,你說我怎么就攤上這事工秩。” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵助币,是天一觀的道長浪听。 經(jīng)常有香客問我,道長眉菱,這世上最難降的妖魔是什么迹栓? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮俭缓,結(jié)果婚禮上克伊,老公的妹妹穿的比我還像新娘。我一直安慰自己华坦,他們只是感情好愿吹,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惜姐,像睡著了一般犁跪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歹袁,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天坷衍,我揣著相機與錄音,去河邊找鬼条舔。 笑死枫耳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孟抗。 我是一名探鬼主播嘉涌,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夸浅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扔役,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帆喇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亿胸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯钦,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年侈玄,在試婚紗的時候發(fā)現(xiàn)自己被綠了婉刀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡序仙,死狀恐怖突颊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤律秃,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布爬橡,位于F島的核電站,受9級特大地震影響棒动,放射性物質(zhì)發(fā)生泄漏糙申。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一船惨、第九天 我趴在偏房一處隱蔽的房頂上張望柜裸。 院中可真熱鬧,春花似錦粱锐、人聲如沸疙挺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衔统。三九已至,卻和暖如春海雪,著一層夾襖步出監(jiān)牢的瞬間锦爵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工奥裸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留险掀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓湾宙,卻偏偏與公主長得像樟氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侠鳄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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