操作系統(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
點擊 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è)置
系統(tǒng)管理-全局工具配置
JDK設(shè)置
Gradle設(shè)置
7烙荷、釘釘插件通知配置
在釘釘群的設(shè)置-智能群助手-添加自定義機器人
要復(fù)制一下webhook鏈接,下面要用檬寂,還有關(guān)鍵字設(shè)置终抽,要釘釘和jenkins一致
在jenkins系統(tǒng)管理-系統(tǒng)配置中,設(shè)置釘釘桶至,點擊測試如果群聊能收到通知就可以
8昼伴、新建任務(wù)
這里是Android和iOS各建一個,選擇freestyle即可镣屹,兩邊別的都一樣圃郊,就是shell命令不一樣,下面會貼
點開新建的任務(wù)女蜈,點擊配置
①描述和釘釘
②git信息
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)建成功队他,就會通知到釘釘群了