Jenkins 是一个持续集成的工具,帮你构建和打包自动化,不用手动做这些操作。构建完成后可以帮你上传到第三方测试平台,或者做其他一些操作。例如:发送邮件通知测试人员可以开始测试了,邮件中包含下载地址,或者二维码。整个流程不需要手动管理,非常高效。

<!–more–>

Docker 中的 Jenkins

Jenkins 官方提供 docker 的镜像,我们可以直接使用。但如果要用来打包 Android 项目还需要把 Android SDK 装上,不然没法构建 Android 项目。

所以我们基于 Jenkins 镜像进行定制,把它改造成带有 Android SDK 的镜像。

命令行管理 SDK

由于在 docker 中是没有 GUI 的,所以在构建之前我们需要了解一下怎么在命令行下管理 Android SDK

列出所有已安装、可安装、可更新的包

1
sdkmanager --list

安装指定的包

1
sdkmanager "platforms;android-26"

使用 sdkmanager 时会提示要你同意协议,在 docker 中我们肯定是不会每次安装一个都去输入 yes 去同意。所以通过 Linux 的管道来自动同意协议。命令就变成了

1
yes | sdkmanager "platforms;android-26"

一次性更新全部

1
sdkmanager --update

构建带有 Android 环境的 Jenkins

了解了怎么在命令行中怎么管理 Android SDK 后,我们就可以来构建带有 Android 环境的 docker 镜像了。编写如下 Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
From jenkins

USER root

RUN apt update && apt upgrade -y && apt install wget unzip && mkdir /opt/android && cd /opt/android  && wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip && unzip sdk-tools-linux-4333796.zip

ENV ANDROID_HOME=/opt/android

RUN yes | /opt/android/tools/bin/sdkmanager "platform-tools" && yes | /opt/android/tools/bin/sdkmanager "build-tools;28.0.2" && yes | /opt/android/tools/bin/sdkmanager "platforms;android-28"

USER jenkins

Dockerfile 中安装的 SDK 包,需要根据自己项目动态调整,也没有必要所有的都安装,用不到的也没必要安装,不然构建出来的镜像很大。

写好 Dockerfile 后使用 docekr build -t jenkand:v1 . 来构建。这里如果网速不好,花费的时间是比较久的,docker 可以使用国内的加速会快一些。

运行容器

1
docker run -p 80:8080 jenkand:v1

运行起来之后会输出管理员密码,用来初始化安装。 在浏览器中输入 127.0.0.1 访问 Jenkins ,输入控制台打印的密码,点击 Continue。 接下来会让你选择安装默认的插件还是自定义安装,我们选择默认就可以了。 安装插件需要花一些时间,喝杯茶再回来。有些插件无法安装成功,我们可以以后再装,点击 Continue。 紧接着创建第一个管理员用户,输入相关信息后点击 Save and Finish Jenkins 就可以用了,但是要想打包 Android 程序还要装一些插件。

配置 Android 环境

上一节,我们搭好了 Jenkins ,接下来就要配置一下 Android 环境。

ANDROID_HOME

在 系统管理->系统设置,找到全局属性,把 Environment variables 给勾上,点击增加,键为 ANDROID_HOME ,值为 /opt/android

Gradle

在 系统管理->Global Tool Configuration,找到 Gradle ,点击 新增 Gradle ,填入 name ,可以随便填,但是为了好记,还是写上版本号。这里 Gradle 的版本要根据自己项目使用的版本调整。

JDK

本来打包 Android 是需要 Java 环境的,所以需要安装 JDK ,但由于 Jenkins 就是用 Java 写的,所以 JDK 是安装好了的,如果你要用不同版本的 JDK ,和 Gradle 的安装方式一样,新建一个就好了,这里就不再啰嗦了。

命令行下打包 Android

自动化打包就是不需要人工操作,把打包的过程交给程序。Android 使用 Gradle 执行打包,所以通过执行 Gradle 命令就能打包 Android 应用。

在打包之前我们需要改造 app/build.gradle 使其能够打不同的渠道包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
android {
   signingConfigs {
        signingConfig {
            storeFile file(STORE_FILE_PATH)    // 签名文件的路径
            storePassword STORE_FILE_PASSWORD  // 签名密码
            keyAlias KEY_ALIAS                 // 别名
            keyPassword KEY_PASSWORD           // 签名密码
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            zipAlignEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.signingConfig
        }
        debug {  }
    }
    //渠道 Flavors
    productFlavors {
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
    }
}

打开终端在项目的根目录输入如下指令,就可以打包

1
2
gradlew assembleXiaomiRelease // 小米渠道包
gradlew assembleWandoujiaRelease // 豌豆荚渠道包

创建打包任务

做了这么多,是驴是马拿出来遛遛,看看可行不可行。

回到首页,点击新建,取个名字,选择构建一个自由风格的软件项目 在参数化构建中填入 PRODUCT_FLAVORSBUILD_TYPE 配置源码地址,然后点击 Add 添加证书(账号密码) 为了方便,这里直接使用账号密码的方式,填入 Git 的账号和密码 在构建中点击增加构建步骤,选择 Invoke Gradle Script 配置打包命令,在 Tasks 中填入 clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} 配好之后点击保存。

构建

进入建好的任务,点击 Build with Parameters 选择需要构建的 PRODUCT_FLAVORSBUILD_TYPE 点击开始构建,等待一小会,项目就会构建成功。

上传到蒲公英

项目构建成功后,要先发布到蒲公英, jenkins 有个插件叫 Upload to pgyer ,在打包完成后,帮我们把 apk 上传到蒲公英。

找到 系统管理->插件管理,在可选插件中找到 Upload to pgyer ,选择直接安装。 安装完成后回到刚刚新建的任务,在最后点击 增加构建后操作步骤 ,选择 Upload to pgyer with apiV1 填入 uKeyapi_keyscandirfile widcard 。其中 uKey 是 User Key, api_key 就是 API Key, scandir 是 apk 所在的目录, file widcard 是通配符,用来判断哪些文件要上传。

更新

软件用久了,要更新换代,不断有新版的出现,我们也要与时俱进。但是在 docker 中的 jenkins 都已经固定了难道要重新构建一个,这样会花很久。还有随着 Android 版本的升级 SDK 也在不断增加,这就要求我们要不断更新 docker 中的 Android SDK

Jenkins

jenkins 的更新只需要把 jenkins.war 给替换成新版就可以了,非常的简单。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
➜  ~ docker exec -it --user root 7508 /bin/bash # 进入容器,7508 是容器的 id,要以 root 的身份进入,不然没有权限改变 jenkins.war
root@75082215a3f3:~# ps -ax # 查看进程以便找出 jenkins 所在路径
PID TTY      STAT   TIME COMMAND
1 ?        Ss     0:00 /bin/tini -- /usr/local/bin/jenkins.sh
5 ?        Sl     1:56 java -jar /usr/share/jenkins/jenkins.war # jenkins.war 所在路径
128 ?        Ss     0:00 /bin/bash
167 ?        Ss     0:00 /bin/bash
177 ?        R+     0:00 ps -ax
root@75082215a3f3:/# cd /usr/share/jenkins/
root@75082215a3f3:/usr/share/jenkins# ls
jenkins.war  ref
root@75082215a3f3:/usr/share/jenkins# mv jenkins.war jenkins.war.bak # 备份旧版 jenkins
root@75082215a3f3:/usr/share/jenkins# wget http://mirrors.jenkins.io/war/latest/jenkins.war # 下载最新 jenkins

重启容器就可以看到最新的 jenkins

Android SDK

Android SDK 的升级和 dockerfile 中的一样,没有什么特别的,这里简单举个🌰。

1
2
3
4
5
docker exec -it --user root 7508 /bin/bash # 进入容器
root@75082215a3f3:~# cd /opt/android/tools/bin/
root@75082215a3f3:/opt/android/tools/bin# yes | ./sdkmanager "platform-tools"
Warning: File /root/.android/repositories.cfg could not be loaded.
[=======================================] 100% Computing updates...

参考