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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章