最近幸得空闲,就来自己实践一遍 Android 的持续集成,之前公司一直在使用同事搭建的 gitlab+ci+firim
,确实是方便了很多,所以就有了自己实现一遍的想法。
在实践的过程中,也是磕磕绊绊各种填坑。网上有很多实现持续集成的教程,但是自己实践的时候各种坑总是出其不意的出现,所以我想记录一下我的实践过程,尽可能的做到详细,希望实践过程中遇到的问题,在这里都能找到解决方案。
Android 持续集成实践(一)——从0开始搭建 Gitlab 服务器
Android 持续集成实践(二)——配置 Docker + gitlab-runner 实现线上自动编译
Android 持续集成实践(三)——编写 .gitlab-ci.yml 实现自动化
Android 持续集成实践(四)——配置 WebHook 通知编译结果
在整个流程中,配置 docker
和 gitlab-runner
的过程是我遇到问题最多的一个过程,也是由于我对他俩的概念不太清晰,所以在配置的过程中出现了很多麻烦和困扰。所以在开始之前,希望我们都能了解一下 docker 和 gitlab-runner 的工作原理。
这里引用一下百度百科对 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 docker
sudo systemctl enable docker
# Add GitLab’s official repository
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
# install the latest version of GitLab Runner
sudo yum install gitlab-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 了:
在服务器上找一个文件夹挂载到 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
配置签名文件别名密码等参数
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-code
stages:
- 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 虚拟机 传文件