Android(安卓)持续集成实践(二)——配置 Docker + gitlab-runner 实现线上自动编译
文章目录
- 前言
- 系列文章
- Android 持续集成实践(二)——配置 Docker + gitlab-runner 实现线上自动编译
- 安装 Docker
- 安装 gitlab-runner
- 安装
- 注册 runner
- 配置 runner 缓存路径
- 签名文件的处理
- 测试线上自动编译
- 参考资料
前言
最近幸得空闲,就来自己实践一遍 Android 的持续集成,之前公司一直在使用同事搭建的 gitlab+ci+firim
,确实是方便了很多,所以就有了自己实现一遍的想法。
在实践的过程中,也是磕磕绊绊各种填坑。网上有很多实现持续集成的教程,但是自己实践的时候各种坑总是出其不意的出现,所以我想记录一下我的实践过程,尽可能的做到详细,希望实践过程中遇到的问题,在这里都能找到解决方案。
系列文章
Android 持续集成实践(一)——从0开始搭建 Gitlab 服务器
Android 持续集成实践(二)——配置 Docker + gitlab-runner 实现线上自动编译
Android 持续集成实践(三)——编写 .gitlab-ci.yml 实现自动化
Android 持续集成实践(四)——配置 WebHook 通知编译结果
Android 持续集成实践(二)——配置 Docker + gitlab-runner 实现线上自动编译
在整个流程中,配置 docker
和 gitlab-runner
的过程是我遇到问题最多的一个过程,也是由于我对他俩的概念不太清晰,所以在配置的过程中出现了很多麻烦和困扰。所以在开始之前,希望我们都能了解一下 docker 和 gitlab-runner 的工作原理。
安装 Docker
这里引用一下百度百科对 Docker 的介绍:传送门
# 查看当前系统内核版本,docker 要求内核版本高于 3.10 uname -r# 确保 yum 包更新到最新sudo yum update# 卸载旧版本(如果安装过旧版本的话)sudo yum remove docker docker-common docker-selinux docker-engin# 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 设置yum源sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 查看仓库中所有 docker 版本yum list docker-ce --showduplicates | sort -r# 安装docker sudo yum install <FQPN> # 例如:sudo yum install docker-ce-18.03.1.ce
安装成功后启动 docker 并加入开机启动
sudo systemctl start dockersudo systemctl enable docker
安装 gitlab-runner
安装
# Add GitLab’s official repositorycurl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash# install the latest version of GitLab Runnersudo yum install gitlab-runner
注册 runner
这里假设你已经在 gitlab 上创建 git 仓库了。因为注册 runner 的时候需要用到 token
,而 token
是在创建仓库或创建 group 之后才有的
sudo gitlab-runner register
运行注册命令后,会提示你填写一些配置信息:
-
gitlab-ci coordinator URL
和gitlab-ci token
在仓库的 Settings->CI/CD 页面,直接复制就行
-
gitlab-ci description
是这个 runner 的描述 -
gitlab-ci tags
设置 runner 的标签,runner 只响应对应标签的编译任务 -
executor
这里填 docker,我们要用 docker 运行 android 编译环境 -
default Docker image
设置默认的镜像,这里使用 jangrewe/gitlab-ci-android
这个镜像
安装成功后,就可以在仓库的 Settings -> CI/CD 中看到已安装的 runner 了:
配置 runner 缓存路径
在服务器上找一个文件夹挂载到 docker 容器里边,给 .gradle
做一个缓存,这样每次编译的时候,就不用一直下载 gradle 了,这里我挂载的是 /home/android-cache
文件夹:
vi /etc/gitlab-runner/config.toml
pull_policy = "if-not-present"
避免docker 镜像每次都pull
注意,如果你的 gitlab 服务器迁移了之后,如果不想再重新注册 runner,可以改这个配置文件的 url 和 token 为迁移后的值
签名文件的处理
在服务器上打包的时候,不可避免的就要用到签名文件,这里可以利用配置 runner 的时候挂载的缓存分区 /home/android-cache
,把签名文件放在那里,这样处理的话,在 gitlab 服务器的代码仓库是看不到签名文件的,相对安全一点;签名文件的别名、密码等变量可以利用 gitlab-ci 的环境变量保存起来,可以对变量设置权限,这样处理比较安全。
-
上传签名文件到缓存目录
/home/android-cache/keystore
使用 FileZilla 上传签名文件到 缓存目录
/home/android-cache/keystore
注意,此时我们的签名文件在服务器的路径是 /home/android-cache/keystore/key_zhoubin.keystore
-
配置签名文件别名密码等参数
位置:仓库的
Settings -> CI/CD -> Environment variables
,如图:
-
build.gradle 签名配置
签名文件在服务器上配置完了,这时候还需要配置一下 build.gradle 里边的
signingConfigs
节点。
因为我们如果在本地打包的话,肯定是用不了服务器上的配置的,所以需要区分两个情况:
测试线上自动编译
我们来简单写个 .gitlab-ci.yml
,测试一下提交代码推送到远端后的自动编译:
image: jangrewe/gitlab-ci-android # 用来编译 android 项目的镜像variables: GRADLE_OPTS: "-Dorg.gradle.daemon=false" # 禁用 gradle 守护进程before_script:# 配置 gradle 的缓存目录 - export GRADLE_USER_HOME=/cache/.gradle# 获取权限 - chmod +x ./gradlew - chmod +x ./update-version-codestages: - build# 提交代码自动编译build: stage: build only: - master script: - ./gradlew assembleDebug tags: - android# 利用标签打测试包,格式:“x.x.x-beta.x”beta: stage: build only: - /^[\d]+\.[\d]+\.[\d]+-beta\.[\d]+$/ script: - ./update-version-code - ./gradlew assembleDebug artifacts: paths: - app/build/outputs/apk/debug/ tags: - android# 利用标签打测试包,格式:“x.x.x”release: stage: build only: - /^[\d]+\.[\d]+\.[\d]+$/ except: - branches script: - ./update-version-code - ./gradlew assembleRelease artifacts: paths: - app/build/outputs/apk/ tags: - android
测试编译结果:
下一篇:Android 持续集成实践(三)——编写 .gitlab-ci.yml 实现自动化
目标是:编译+加固+渠道+部署
参考资料
Centos7上安装docker
Install GitLab Runner using the official GitLab repositories
Registering Runners
本地电脑向 CentOS 7 虚拟机 传文件
更多相关文章
- Android7.0适配教程与心得
- Android(安卓)项目中文件夹作用(res文件夹详细介绍)
- Android工程编译时报 Error running app: Default Activity not
- Ogre3d 之使用 Android(安卓)NativeActivity
- ShareSDK for Android(安卓)只有新浪微博分享
- 学习android随手记 之 android:name android:id
- android-1-Android简单入门
- Android中DNS解析
- Mac下搭建 Android(安卓)反编译环境