linux環境下jenkins搭建過程+Flutter打包集成

  1. 安裝jenkins
  2. 配置java環境,android sdk環境,flutter環境
  3. 配置flutter自動打包腳本
安裝jenkins

1.下載jenkins安裝包
首先下載jenkins安裝包,官網下載地址:https://www.jenkins.io/download/ ,如果嫌太慢可以使用鏡像下載:
http://mirrors.jenkins-ci.org/

  1. 解壓並安裝jenkins
    rpm -ivh jenkins-2.174-1.1.noarch.rpm

  2. 可以使用whereis jenkins查看jenkins安裝位置,看是否安裝成功

     
    image.png

     

  3. 此時就可以啓動jenkins服務
    sudo service start jenkins

     
    image.png

     

  4. 如果沒有配置JDK路徑之類,可以打開jenkins配置文件進行修改 /etc/init.d/jenkins

  5. 默認端口是8080,如果需要修改端口,打開/etc/sysconfig/jenkins

     
    image.png

     

  6. 此時在瀏覽器輸入http://localhost:8080就可以打開jenkins初始的配置頁面。接下來就是一系列的初始配置,應該都看得懂。

     
    image.png

     

安裝android開發環境
  1. 下載android command line tools, 解壓放到linux服務器。下載地址:https://developer.android.com/studio#downloads
  2. 使用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是比較老的版本。

  1. 設置環境變量
# 打開環境變量配置文件
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開發環境
  1. 下載flutter sdk包https://flutter.dev/docs/get-started/install/linux#android-setup
    使用git下載到本地:
git clone https://github.com/flutter/flutter.git -b stable   # stable可以替換成你想下載的版本號
  1. 配置環境變量
# 打開環境變量配置文件
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
  1. 輸入flutter doctor驗證是否配置成功


     
    image.png
  1. 第一次安裝會讓同意google licence,輸入
flutter doctor --android-licenses
genkins build腳本配置
  1. 創建一個jenkins項目


     
    image.png

     
    image.png
  2. 選擇git管理倉庫,輸入git地址和登錄授權。注意這裏的build分支最好是開闢一個專門的分支作爲發佈版本,比如preRelease


     
    image.png
  3. 編寫編譯腳本


     
    image.png

    我們可以使用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
     
    image.png

     
    image.png
  • 進入項目配置,配置觸發器
    勾選build when a change is pushed ot Gitee
    記住勾選的webhook url及生成的webhook token


     
    image.png

     
    image.png
  • 在gitee空間配置webhook


     
    image.png

     
    image.png

    這裏填入剛剛記住的url和token


     
    image.png


作者:0x01
鏈接:https://www.jianshu.com/p/6918def344b8
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章