基于jenkins实现uniapp android平台的自动打包
本文使用的轻量服务器1核/2GB/1Mbps(不会有比这个配置还低的服务器吧😭),centOS7系统,安装1panel管理容器
安装了1panel面板来管理网站和容器
uniapp项目打包流程是先生成打包资源,打包资源复制到android项目的资源目录下,配置android项目进行打包构建。
生成打包资源这一步骤有两种模式
- 使用vuecli创建的项目,执行npm命令
build:app-plus
(vue2)。资源文件生成在dist目录中 - 使用HBuilderX界面操作生成打包资源,或者使用HBuilderX的CLI命令生成,CLI命令要求当前已经打开了HBuilderX软件才可以使用
HBuilderX目前并不支持linux环境,配置一个windows安装HBuilderX做为打包节点的方案也是一个可选项。
本文选择方案1的模式。非vuecli创建的项目不能使用npm命令进行构建,项目模式互转参考ask.dcloud.net.cn/article/357…
android项目中打包可以使用gradle assembleRelease
实现,版本号自动获取可以参照基础篇中编写的脚本
基本流程
- 安装准备一个jenkins环境
- 安装准备
Node.js
、java
、gradle
、androidSDK
- 创建流水线任务,分别拉取uniapp项目、android离线打包工程
- 构建uniapp项目生成打包资源
- 将打包资源移动到android工程中,执行打包构建
- 构建产物apk处理
安装jenkins(在docker中)
在面板的应用商店中找到jenkins,jenkins默认端口为8080这个端口太常用在配置中修改到主机端口映射,例如主机5000 / 容器8080
jenkins最新版本
- 安装成功后,查看容器日志的输出可以找到jenkins的初始密码,访问服务器的5000端口,输入初始密码
# 也可以在容器内查看初始密码
# 查看当前所有容器
docker ps -a
# 进入容器环境
docker exec -it [容器id] /bin/bash
# 查看初始密码
cat /var/jenkins_home/secrets/initialAdminPassword
- 安装推荐插件
1panel中如果因为无网络安装失败,在容器中找到jenkins查看网络是否配置正确
3.安装成功,主界面如下
安装node
- jenkins-系统管理-插件管理-installed中检查是否安装了NodeJS Plugin,若没有则在Available plugins中查找安装
2.jenkins-全局工具配置中,配置node版本
安装gradle
同node在插件管理中检查是否安装了Gradle Plugin,在全局工具配置中配置gradle
当前碰到了连接问题服务器无法从github中下载,后面选择了手动下载的模式,手动下载参考如下
- 找到要下载的gradle版本 services.gradle.org/distributio…
- 下载到本地(注意网络环境🪜),上传到服务器中jenkins挂载卷中,unzip命令解压
执行上传
没有opt目录,使用mkdir -p新建目录
- 在jenkins中配置gradle路径
安装android sdk
- 在服务器上使用sdkmanager安装android sdk
下载地址
移动到jenkins挂载卷
mv commandlinetools-linux-11076708_latest.zip /opt/1panel/apps/jenkins/jenkins/jenkins/opt
cd /opt/1panel/apps/jenkins/jenkins/jenkins/opt
unzip commandlinetools-linux-11076708_latest.zip -d android_sdk
- 在
android_sdk
目录下将cmdline-tools
里的文件都移动到latest
目录下
mv NOTICE.txt latest
mv lib latest
mv bin latest
mv source.properties latest
cd latest
// 全部yes授权
./sdkmanager --licenses
// 安装sdk
./sdkmanager "build-tools;30.0.3" "platforms;android-30"
// 可以使用--list命令查看已安装的sdk
./sdkmanager --list
安装jdk
- jenkins环境是有默认的java环境的,但是java环境的版本可能并不是我们需要的,新版的jenkins最低只支持到11/17,而配置的android项目仍然使用的1.8版本
- 在安装android sdk步骤中实际使用到的jdk使jenkins容器中的jdk环境,还需要添加一个1.8版本的jdk用于打包构建
- 下载linux环境*.tar.gz*格式的jdk,上传到服务器,解压缩,移动到jenkins_home/opt/jdk1.8目录下oracle.com/java/techno…
// 移动到volume中
mv jdk-8u401-linux-x64.tar.gz /opt/1panel/apps/jenkins/jenkins/jenkins/opt
cd /opt/1panel/apps/jenkins/jenkins/jenkins/opt
// 解压缩
tar -zxvf jdk-8u401-linux-x64.tar.gz
// 重命名
mv jdk1.8.0_401 jdk1.8
配置jenkins环境变量
- jenkins-系统配置-全局属性-环境变量
ANDROID_SDK_ROOT
/var/jenkins_home/opt/android_sdk
JAVA_HOME
/var/jenkins_home/opt/jdk1.8
PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:$JAVA_HOME/bin
- 新建一个流水线任务,检查环境是否配置正常
// pipeline
pipeline {
agent any
tools {
nodejs "node_16"
gradle "gradle_7.2"
jdk "jdk_1.8"
}
stages {
stage('check'){
steps{
sh "node -v"
sh "gradle -v"
sh "java -version"
sh "which java"
sh "echo $ANDROID_SDK_ROOT"
}
}
}
}
配置打包任务
- jenkins-系统管理-凭据管理-添加git的全局凭据(用户名/密码或者)
- 新建流水线任务,勾选参数化构建
3. 编写流水线脚本
不是专业的运维人员,脚本大家自行优化😭
大致逻辑为
- 检查环境,清空工作区
- 分别拉取uniapp项目代码,android项目代码
- 安装uniapp项目依赖,run build生成打包资源,将打包资源移动到android工程中
- 执行gradle命令打包apk,移动产物到工作区外
pipeline {
agent any
tools {
nodejs "node_16"
gradle "gradle_7.2"
jdk "jdk_1.8"
}
stages {
stage('checkEnvironment'){
steps{
sh "node -v"
sh "gradle -v "
sh "java -version"
deleteDir()
}
}
stage('pull') {
steps {
echo '拉取uni项目代码'
checkout([
$class: 'GitSCM', branches: [[name: '*/main']],
extensions: [
[$class: 'CloneOption', depth: 1,shallow: true,timeout: 2],
[$class: 'RelativeTargetDirectory', relativeTargetDir: 'peoject']
],
userRemoteConfigs: [[credentialsId:'109abbf2-b23c-4292-b3b1-f3689c3792dc', url: 'https://gitee.com/mlie/build-demo.git']]
])
echo '拉取android工程代码'
checkout([
$class: 'GitSCM', branches: [[name: '*/main']],
extensions: [
[$class: 'CloneOption', depth: 1,shallow: true,timeout: 2],
[$class: 'RelativeTargetDirectory', relativeTargetDir: 'sdk']
],
userRemoteConfigs: [[credentialsId:'109abbf2-b23c-4292-b3b1-f3689c3792dc', url: 'https://gitee.com/mlie/build-demo-sdk.git']]
])
echo '拉取代码结束'
}
}
stage('build') {
steps {
echo 'install'
dir('peoject') {
sh 'npm install --registry=https://registry.npmmirror.com && npm run build:app-plus'
}
sh 'rm -rf ./sdk/app/src/main/assets/apps/*'
sh 'mkdir -p ./sdk/app/src/main/assets/apps/${APP_ID}/www/'
sh 'cp -rf ./peoject/dist/build/app-plus/* ./sdk/app/src/main/assets/apps/${APP_ID}/www'
}
}
stage('release') {
steps {
echo 'release'
sh 'cd sdk && gradle clean && gradle assembleRelease'
sh 'mv ./sdk/app/build/outputs/apk/release/*.apk ./'
}
}
}
}
- 最后的打包产物在工作区目录下
后续可以考虑编写脚本将资源发送到资源服务器生成链接进行下载