超简单配置Android持续集成自动化打包流程 - GitHub+GitLab-CI+蒲公英+钉钉
GitLab-CI的相关语法:https://fennay.github.io/gitlab-ci-cn/gitlab-ci-yaml.html
场景
为了优化工作流程,解放开发人员双手,不整天被【帮我打一个新的测试包】这种琐碎的事儿打乱工作的节奏,这两天就研究了下有关于Android持续集成的东西,特此记录。我们项目是存放在GitHub的私有仓库,现在有三个持续集成自动化打包的方案:
- Travis CI:Github亲儿子,它对于开源库是免费使用,但是针对GitHub私有库的持续集成是收费的。
- Jenkins:功能强大,使用灵活,但是Jenkins配置的复杂度和部署成本都相对比较高,有学习成本,但是一个不错的方案。
- GitLab CI:非常简单,完全免费,且完全不需要配置额外服务器资源的方案,支持私有仓库,学习成本低。
本着薅资本主义羊毛的原则,我们来介绍下这个方案。
工具集
- GitHub:世界最大代码托管平台,世界最大程序员交友平台。
- GitLab:很多功能都比GitHub好,但是可惜用的人没有GitHub多,但是很多公司都把他私有化部署。
- GitLab-CI:配合GitLab平台的持续继承平台。
- 蒲公英:国内知名APP内测分发平台。
- 钉钉:阿里出品办公软件,我们主要使用机器人功能进行相关人员通知。
总体流程
简单地了解了工具,接下来我们就开始持续集成之旅。
同步代码到GitLab
首先要将GitHub上的代码转移一份到GitLab上,并且保持同步。万幸的是,这最关键的一部,贴心的GitLab已经搞定了。
【登录Gitlab】【New project】 【CI/CD for external repo】【GitHub】,只要经过授权,GitLab就可以获取到你GitHub帐号下所有的仓库。选择【Connect】后即可同步你的GitHub项目到GitLab。
配置GitLab-CI
配置GitLab-CI其实十分简单,我们只要将GitLab-CI的持续集成脚本文件.gitlab-ci.yml
加入到我们工程的根目录即可,如果你是想即拿即用,那么你只需要复制粘帖以下代码,替换相关Key值与SDK,JDK版本即可。
image: openjdk:8-jdk
variables:
ANDROID_COMPILE_SDK: "28"
ANDROID_BUILD_TOOLS: "28.0.2"
ANDROID_SDK_TOOLS: "4333796"
before_script:
- apt-get --quiet update --yes
- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
- unzip -d android-sdk-linux android-sdk.zip
- echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
- echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
- export ANDROID_HOME=$PWD/android-sdk-linux
- export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
- chmod +x ./gradlew
# temporarily disable checking for EPIPE error and use yes to accept all licenses
- set +o pipefail
- yes | android-sdk-linux/tools/bin/sdkmanager --licenses
- set -o pipefail
stages:
- build
assembleDebug:
stage: build
only:
- master
script:
- ./gradlew assembleDebug
- curl -F "file=@app/build/outputs/apk/debug/app-debug.apk" -F "uKey=蒲公英uKey" -F "_api_key=蒲公英api_key" https://qiniu-storage.pgyer.com/apiv1/app/upload
- curl "钉钉WebHook地址" -XPOST -H 'content-type:application/json' -d '{"msgtype":"text","text":{"content":"@135xxxxxxx@135xxxxxxx@135xxxxxxx【xxxx】打包完成,下载地址:https://www.pgyer.com/xxxx"},"at":{"atMobiles":["135xxxxxxx","135xxxxxxx","135xxxxxxx"],"isAtAll":false}}'
artifacts:
paths:
- app/build/outputs/apk/debug/app-debug.apk
配置脚本
这边地解释下常用的几处配置项的含义,毕竟我们的要求是快速简单配置,过多的就不赘述了。
1.配置JDK版本,SDK版本
根据项目实际SDK版本情况修改。
image: openjdk:8-jdk
variables:
ANDROID_COMPILE_SDK: "28"
ANDROID_BUILD_TOOLS: "28.0.2"
ANDROID_SDK_TOOLS: "4333796"
2.打包指令
此处根据需要更改打包命令,示例中打的是Debug包。
./gradlew assembleDebug
3.上传蒲公英
第一个参数为你打包后文件的路径,“@”符号不能丢。第二个第三个参数可以在蒲公英官网查询。
curl -F "file=@app/build/outputs/apk/debug/app-debug.apk" -F "uKey=蒲公英uKey"
-F "_api_key=蒲公英api_key" https://qiniu-storage.pgyer.com/apiv1/app/upload
当然你也可以配置其他参数来满足你的需求。
参数 | 类型 | 说明 |
---|---|---|
uKey | String | (必填) 用户Key |
_api_key | String | (必填) API Key |
file | File | (必填) 需要上传的ipa或者apk文件 |
installType | Integer | (选填)应用安装方式,值为(1,2,3)。1:公开,2:密码安装,3:邀请安装。默认为1公开 |
password | String | (选填) 设置App安装密码,如果不想设置密码,请传空字符串,或不传。 |
updateDescription | String | (选填) 版本更新描述,请传空字符串,或不传。 |
4.通知钉钉
curl "钉钉WebHook地址" -XPOST -H 'content-type:application/json' -d '钉钉消息json'
钉钉WebHook地址可以在【群聊】【添加机器人】【自定义】中获取。
钉钉消息中的Json可以参考以下格式
{
"msgtype": "text",
"text": {
"content": "@135xxxxxxx@135xxxxxxx@135xxxxxxx【xxxx】打包完成,下载地址:https://www.pgyer.com/xxxx"
},
"at": {
"atMobiles": [
"135xxxxxxx",
"135xxxxxxx",
"135xxxxxxx"
],
"isAtAll": false
}
}
参数 | 参数类型 | 必须 | 说明 |
---|---|---|---|
msgtype | String | 是 | 消息类型,此时固定为:text |
content | String | 是 | 消息内容 |
atMobiles | Array | 否 | 被@人的手机号(在content里添加@人的手机号) |
isAtAll | bool | 否 | @所有人时:true,否则为:false |
@后面为你所需要通知的同事的钉钉绑定的手机号码,更多用法可以参考钉钉机器人文档。
当然你也可以在蒲公英后台中设置webhook直接设置通知钉钉:
蒲公英应用下载地址,可以在后台查看。
5.指定分支
我们并不需要每次提交都触发持续集成。所以我们需要指定触发持续集成的分支。
only:
- master
参数 | 说明 |
---|---|
only | 定义一列git分支,进行集成 |
except | 定义一列git分支,不进行集成 |
6.上传artifacts文件路径
- app/build/outputs/apk/debug/app-debug.apk
可以在Gitlab中下载打出来的包。
注意事项
到此流程全部结束,只要你提交代码到Github,Gitlab-CI就会帮你自动打包,你可以在【GitLab】【对应工程】【CI/CD】中查看打包的进程。
打包成功后就会发送通知到你的钉钉,并同步至蒲公英,当然你也可以到GitLab中从附件中下载安装包,如果你的微信绑定了蒲公英,在你的微信里也会有相应的提示。
但是有一点要注意。由于在GitlLab上打包,它并不会缓存仓库,所以每次都需要重新下载工程中所有被依赖的库。从图中也可以看到,一个中型工程的集成时间在25-30分钟左右。打包速度异常缓慢,但已经足够满足日常的一些需求。当然如果能利用Jenkins把环境部署在本地将是一个更好的选择。