- 安裝jenkins
- 配置java環境,android sdk環境,flutter環境
- 配置flutter自動打包腳本
安裝jenkins
1.下載jenkins安裝包
首先下載jenkins安裝包,官網下載地址:https://www.jenkins.io/download/ ,如果嫌太慢可以使用鏡像下載:
http://mirrors.jenkins-ci.org/
-
解壓並安裝jenkins
rpm -ivh jenkins-2.174-1.1.noarch.rpm
-
可以使用
whereis jenkins
查看jenkins安裝位置,看是否安裝成功
-
此時就可以啓動jenkins服務
sudo service start jenkins
-
如果沒有配置JDK路徑之類,可以打開jenkins配置文件進行修改
/etc/init.d/jenkins
-
默認端口是8080,如果需要修改端口,打開
/etc/sysconfig/jenkins
-
此時在瀏覽器輸入
http://localhost:8080
就可以打開jenkins初始的配置頁面。接下來就是一系列的初始配置,應該都看得懂。
安裝android開發環境
- 下載android command line tools, 解壓放到linux服務器。下載地址:https://developer.android.com/studio#downloads
- 使用command line tools裏自帶的sdkmanager工具來進行相關sdk的下載,具體如下:
cd /usr/local/
unzip commandlinetools-linux-6200805_latest.zip -d /usr/local
mkdir -p /usr/local/sdk
cd /usr/local/cmdline-tools/bin
./sdkmanager --list --sdk_root=/usr/local/sdk #顯示可安裝包
./sdkmanager --install "platforms;android-29" --sdk_root=/usr/local/sdk #安裝android-29
./sdkmanager --install "platform-tools" --sdk_root=/usr/local/sdk #安裝platform-tools
./sdkmanager --install "build-tools;29.0.3" --sdk_root=/usr/local/sdk #安裝build-tools
./sdkmanager --install "cmdline-tools;latest" --sdk_root=/usr/local/sdk #安裝cmdline-tools
當然,你也可以直接去下載android sdk,但目前官方推薦的是這種方式,而且能下載到的android sdk是比較老的版本。
- 設置環境變量
# 打開環境變量配置文件
vim /etc/profile
# 添加如下內容到編輯器中
export ANDROID_HOME=/usr/local/sdk
export FLUTTER_HOME=/usr/local/flutter
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH=${FLUTTER_HOME}/bin:${ANDROID_HOME}/build-tools/29.0.3:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${PATH}
# 保存後執行使立即生效
source /etc/profile
輸入adb命令驗證是否安裝成功
安裝Flutter開發環境
- 下載flutter sdk包https://flutter.dev/docs/get-started/install/linux#android-setup
使用git下載到本地:
git clone https://github.com/flutter/flutter.git -b stable # stable可以替換成你想下載的版本號
- 配置環境變量
# 打開環境變量配置文件
vim /etc/profile
# 添加如下內容到編輯器中
export ANDROID_HOME=/usr/local/sdk
export FLUTTER_HOME=/usr/local/flutter
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH=${FLUTTER_HOME}/bin:${ANDROID_HOME}/build-tools/29.0.3:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${PATH}
# 保存後執行使立即生效
source /etc/profile
-
輸入flutter doctor驗證是否配置成功
- 第一次安裝會讓同意google licence,輸入
flutter doctor --android-licenses
genkins build腳本配置
-
創建一個jenkins項目
-
選擇git管理倉庫,輸入git地址和登錄授權。注意這裏的build分支最好是開闢一個專門的分支作爲發佈版本,比如preRelease
-
編寫編譯腳本
我們可以使用git的提交commit數來作爲我們的版本管理數,這樣每當有新的commit,執行genkins build就可以產生遞增的版本號,可以做到持續發佈。
flutter jenkins build script
#!/bin/bash -ilex
export FLUTTER_HOME="/usr/local/flutter/flutter"
export PATH="$FLUTTER_HOME/bin:$PATH"
# get version code and name
time=`date +%Y%m%d`
versionCode=`git rev-list HEAD --count`
versionName=$time.$versionCode
flutter clean
flutter pub get
#run build_runner to generate database
flutter packages pub run build_runner build --delete-conflicting-outputs
#generate i10n using intl_utils
flutter pub global run intl_utils:generate
#build
flutter build apk --debug --build-number=$versionCode --build-name=$versionName
scp build/app/outputs/flutter-apk/app-debug.apk /data/outputs/debug/xmcg.apk #這裏也可以直接上傳到另外的遠程指定空間
# 這裏還需要一個新的版本更新操作,具體看自己服務端提供什麼樣的方式,這裏簡單操作直接更新內容
echo "versionCode=$versionCode&versionName=$versionName" > /data/outputs/debug/version
#如果是release發佈,可以更新tag
tag=$versionName
git tag $tag
git push origin $tag
也附上android jenkins script作參考
export ANDROID_HOME="/data/android/android-sdk"
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"
# android build.gradle會生成一份version文件
lastVersion=`cat $WORKSPACE/app-lt/version |jq ".versionCode"|sed -e "s/\"//g"`
$ANDROID_HOME/gradle/bin/gradle -v
$ANDROID_HOME/gradle/bin/gradle clean --debug
$ANDROID_HOME/gradle/bin/gradle assembleStage -Denv=stage -Dlastversion=$lastVersion
cp $WORKSPACE/app/build/outputs/apk/app-stage.apk /data/android/app.apk
cp $WORKSPACE/app/version /data/android/
scp $WORKSPACE/app/build/outputs/apk/app-stage.apk /data/android/app.apk
scp $WORKSPACE/app/version /data/android/
tag=`cat $WORKSPACE/app/version |jq ".versionName"|sed -e "s/\"//g"`
git tag $tag
git push origin $tag
網上看到的關於多渠道打包的jenkins build,分享下:
#下載flutter 依賴包
flutter packages get
#flutter 打包
flutter build apk
#分渠道創建目錄
rm -rf /data/tgbus_app_android/*
mkdir /data/tgbus_app_android/{_360,anzhi,baidu,gfan,huawei,lenovo,meizu,mumayi,qijian,samsung,sougou,uc,xiaomi,yingyongbao,oppo,vivo}
dir="/data/tgbus_app_android/"
project=`ls /data/tgbus_app_android/`
for i in $project;do
scp -qpr /data/tgbus.jks $dir$i
scp -qpr /data/jenkins/.jenkins/workspace/tgbus_app_android/build/app/outputs/apk/release/app-release.apk $dir$i
cd $dir$i/
#解碼apk
apktool d -f app-release.apk
#修改渠道
sed "s/test1/${i}/g" -i app-release/AndroidManifest.xml
#重新打包apk
apktool b app-release -o app-release-$i-dev.apk
#爲打包後的apk 進行簽名,tgbus.jks 爲開發提供的祕鑰
echo "32100000" | jarsigner -verbose -keystore tgbus.jks -signedjar app-release-$i.apk app-release-$i-dev.apk tgbus
if [ $? -eq 0 ];then
echo "build is ok"
else
echo "build is false"
fi
done
最後後端說要參照他們的規則調上傳APK的功能,無奈又用研究了下curl操作發送
#!/bin/bash -ilex
export FLUTTER_HOME="/usr/local/flutter/flutter"
export PATH="$FLUTTER_HOME/bin:$PATH"
time=`date +%Y%m%d`
versionCode=`git rev-list HEAD --count`
versionName=$time.$versionCode
flutter clean
flutter pub get
flutter build apk --debug --build-number=$versionCode --build-name=$versionName
url=http://x.x.x.x:8050
token=$(curl -s -X POST $url'/api-portal/api/v1/open/oauth/login?userId=admin&password=xxxxxx' -H 'content-type:application/json;charset=utf-8' | jq .body.accessToken)
versionInfo=$(curl -X POST $url'/api-file/api/file/uploadApk' -H "accept: */*" -H "Content-Type: multipart/form-data" -H 'Cookie: accessToken='$token -F "file=@build/app/outputs/flutter-apk/app-debug.apk;type=application/vnd.android.package-archive" | jq .body)
# { "versionCode": "1", "versionName": "1.0.0", "package": "com.example.FlutterDemo", "filePath": "group1/M00/01/EB/rBDLUWFWbM6APGW0AlYUPQvotY0691.apk", "fileName": "app-debug", "apkSize": 39195709, "md5": "fcc2b4fea5ea04a0581b7d8922b5b894", "httpUrl": "http://x.x.x.x:8013/group1/M00/01/EB/rBDLUWFWbM6APGW0AlYUPQvotY0691.apk" }
apkName=`echo $versionInfo|jq .fileName`
filePath=`echo $versionInfo|jq .filePath`
httpUrl=`echo $versionInfo|jq .httpUrl`
versionCode=`echo $versionInfo|jq .versionCode`
md5=`echo $versionInfo|jq .md5`
apkSize=`echo $versionInfo|jq .apkSize`
curl -s -X POST $url'/api-digital/api/v1/version/save' -H 'Content-Type: application/json' -H 'Cookie: accessToken='$token -d '{"apkSize":'$apkSize',"apkName":'$apkName',"apkTypeCode":"xm_app","isCompel":"1","updateContent":"debug","affixes":{"fileName":'$apkName',"filePath":'$filePath',"httpUrl":'$httpUrl'},"versionCode":'$versionCode',"versionName":'$apkName',"md5":'$md5'}'
#tag=$versionName
#git tag $tag
#git push origin $tag
jenkins提權
jenkins腳本運行過程中經常會提醒各種權限的問題,爲了簡單繞過這些檢測,可以對jenkins用戶進行提權。
首先可以查看jenkins的用戶權限:
cat /etc/passwd |grep jenkins
把jenkins用戶加入到root權限組
gpasswd -a root jenkins
修改jenkins配置文件,進入到/etc/sysconfig/jenkins
JENKINS_USER="root"
JENKINS_GROUP="root"
重新啓動jenkins
service jenkins restart
jenkins配置gitee
- 安裝gitee插件
進入manage jenkins
-manage plugins
,搜索gitee
,安裝 - 配置全局git 憑證數據
進入manage jenkins- configure system-
找到gitee configure
-
進入項目配置,配置觸發器
勾選build when a change is pushed ot Gitee
記住勾選的webhook url及生成的webhook token
-
在gitee空間配置webhook
這裏填入剛剛記住的url和token
作者:0x01
鏈接:https://www.jianshu.com/p/6918def344b8
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。