uni-app配置离线打包到android平台-进阶篇

685 阅读5分钟

基于jenkins实现uniapp android平台的自动打包

本文使用的轻量服务器1核/2GB/1Mbps(不会有比这个配置还低的服务器吧😭),centOS7系统,安装1panel管理容器

安装了1panel面板来管理网站和容器

uniapp项目打包流程是先生成打包资源,打包资源复制到android项目的资源目录下,配置android项目进行打包构建。

生成打包资源这一步骤有两种模式

  1. 使用vuecli创建的项目,执行npm命令build:app-plus(vue2)。资源文件生成在dist目录中
  2. 使用HBuilderX界面操作生成打包资源,或者使用HBuilderX的CLI命令生成,CLI命令要求当前已经打开了HBuilderX软件才可以使用

HBuilderX目前并不支持linux环境,配置一个windows安装HBuilderX做为打包节点的方案也是一个可选项。

本文选择方案1的模式。非vuecli创建的项目不能使用npm命令进行构建,项目模式互转参考ask.dcloud.net.cn/article/357…

android项目中打包可以使用gradle assembleRelease实现,版本号自动获取可以参照基础篇中编写的脚本

基本流程

  1. 安装准备一个jenkins环境
  2. 安装准备Node.jsjavagradleandroidSDK
  3. 创建流水线任务,分别拉取uniapp项目、android离线打包工程
  4. 构建uniapp项目生成打包资源
  5. 将打包资源移动到android工程中,执行打包构建
  6. 构建产物apk处理

安装jenkins(在docker中)

在面板的应用商店中找到jenkins,jenkins默认端口为8080这个端口太常用在配置中修改到主机端口映射,例如主机5000 / 容器8080

jenkins最新版本

  1. 安装成功后,查看容器日志的输出可以找到jenkins的初始密码,访问服务器的5000端口,输入初始密码
# 也可以在容器内查看初始密码
# 查看当前所有容器
docker ps -a
# 进入容器环境
docker exec -it [容器id] /bin/bash
# 查看初始密码
cat /var/jenkins_home/secrets/initialAdminPassword

image.png

  1. 安装推荐插件

image.png

1panel中如果因为无网络安装失败,在容器中找到jenkins查看网络是否配置正确

image.png

3.安装成功,主界面如下

image.png

安装node

  1. jenkins-系统管理-插件管理-installed中检查是否安装了NodeJS Plugin,若没有则在Available plugins中查找安装

image.png

2.jenkins-全局工具配置中,配置node版本

image.png

安装gradle

同node在插件管理中检查是否安装了Gradle Plugin,在全局工具配置中配置gradle

image.png

当前碰到了连接问题服务器无法从github中下载,后面选择了手动下载的模式,手动下载参考如下

  1. 找到要下载的gradle版本 services.gradle.org/distributio…
  2. 下载到本地(注意网络环境🪜),上传到服务器中jenkins挂载卷中,unzip命令解压

image.png image.png

执行上传 image.png

没有opt目录,使用mkdir -p新建目录

  1. 在jenkins中配置gradle路径 image.png

安装android sdk

  1. 在服务器上使用sdkmanager安装android sdk 下载地址 image.png 移动到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
  1. 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

  1. jenkins环境是有默认的java环境的,但是java环境的版本可能并不是我们需要的,新版的jenkins最低只支持到11/17,而配置的android项目仍然使用的1.8版本
  2. 在安装android sdk步骤中实际使用到的jdk使jenkins容器中的jdk环境,还需要添加一个1.8版本的jdk用于打包构建
  3. 下载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环境变量

  1. jenkins-系统配置-全局属性-环境变量

image.png

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
  1. 新建一个流水线任务,检查环境是否配置正常
// 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"
          }
      }
  
  }
}

image.png

配置打包任务

  1. jenkins-系统管理-凭据管理-添加git的全局凭据(用户名/密码或者)

image.png

  1. 新建流水线任务,勾选参数化构建

image.png 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 ./'
      }
    }
  }
}
  1. 最后的打包产物在工作区目录下

后续可以考虑编写脚本将资源发送到资源服务器生成链接进行下载

image.png