自从有自己的服务器之后,啥都想挂上去、自动化啥的。Drone CI 是一个开源的自托管自动测试交付平台,依托Docker。
安装
官网都是有文档的,我这里用的自托管的Gitea,如果使用Github或者其他平台请自行查看文档参数,另外Docker的安装我这里就不赘述了。
首先是服务端(Server),用来提供前端页面并控制运行端:
docker run -v=/var/lib/drone:/data\ # 映射数据目录到本地
-e=DRONE_GITEA_SERVER={Gitea的主页地址}\
-e=DRONE_GITEA_CLIENT_ID={从Gitea生成的OAuth2 ID}\
-e=DRONE_GITEA_CLIENT_SECRET={从Gitea生成的OAuth2 secret}\
-e=DRONE_SERVER_HOST={Drone前端的主机名,不加协议}\
-e=DRONE_SERVER_PROTO=https\ # 协议
-e=DRONE_RPC_SECRET={用于和Runner沟通的secret,必须与Runner端相同}\
-p=443:443\ # 映射端口,可以映射到其他端口,然后用nginx反代
--restart=always\ # 自动重启
--detach=true\ # run在后台
--name=drone drone/drone:1
然后你就可以访问地址看看了,正常的话会跳转的你设定的托管站进行OAuth登录认证,然后你就可以看到你的仓库列表了。
当然,我们还没安装完,刚刚是服务端,现在我们需要安装运行端(Runner)才能运行我们的命令。Runner有不同类型,详情见文档,我这里使用的是Docker Runner。
docker run -v /var/run/docker.sock:/var/run/docker.sock\
-e DRONE_RPC_PROTO=https\ # 服务端协议
-e DRONE_RPC_HOST={服务端主机名}\
-e DRONE_RPC_SECRET={用于和Runner沟通的secret,必须与Server端相同}\
-e DRONE_RUNNER_CAPACITY=2\ # Runner的并发pipeline数量,默认为2,可以根据情况酌情更改,太高会炸
-e DRONE_RUNNER_NAME=local\ # 当前Runner的名称,给Server端用的
--restart always \
--detach=true\ # run在后台
--name runner drone/drone-runner-docker:1
现在我们就安装完了,可以使用了
SDK
打开一个Android项目,我们先处理下SDK的问题,因为我没有找到合适的自带SDK的镜像,所以就用Gradle现下好了。但是有个问题,现下的SDK需要你同意协议,不然不让你用,所以我们需要手动存一个License。
首先在项目目录下创建一个sdk的目录作为之后编译的 ANDROID_HOME
,然后将你本地SDK目录下的licenses复制进来即可。
配置
Drone的配置文件是YAML格式的,置于项目根目录。文件名默认为 .drone.yml
,可以在Server端更改。
kind: pipeline
type: docker
name: default
platform:
os: linux
arch: amd64
steps:
- name: build
image: gradle #使用Gradle镜像
environment:
ANDROID_HOME: /drone/src/sdk
# /drone/src 就是项目根目录。这里把SDK的环境变量设定一下,确保license生效
commands:
- chmod +x gradlew
# 赋予Gradle执行权限
- ./gradlew assembleRelease --stacktrace
# 编译apk,"assemble编译类型",--stacktrance 打印栈
when:
event:
- tag
# 仅在打标签时编译,不然每次commit都要编译一次
# 我这里将编译的apk发到Gitea的release里去
- name: release
image: plugins/gitea-release
settings:
api_key:
from_secret: API_KEY
# 这里时用server端的secret加密了的
base_url: https://…… #Gitea的主页地址
files:
- app/build/outputs/apk/release/app-release.apk
prerelease: true
when:
event:
- tag
trigger:
event:
- tag
# 确保整个pipeline只在tag时触发
提交编译
闲置我们可以尝试提交编译了,但是因为我设置了trigger
,所以需要打标签才能触发。建议使用Git flow保持健康的流程管理。
提交后不需要刷新服务端网页,它会自动获取状态,可以点开查看详细的编译过程。
Drone的还有一些专有的镜像插件来简化部署流程,官方插件列表。