如果项目有持续集成的需求,对于开源项目直接上 Travis 就好了,还能显示个 build pass。国内的话可能会用 Jenkins,好处是免费、可定制化。最近也有很多公司从 Jenkins 转到 Buildkite,有兴趣的可以上网查查。
有没有一种部署简单、支持私有仓库,且基于容器的持续集成工具呢?Drone.io 可能是最好的选择。
先附上官网和github:
安装
这里安装就不细说了,官网有教程。[安装]
可以注意到 Drone 分为两个部分,一个 Drone Server和一个(或多个)runner(s)。
Drone server 是一个基于容器的,且提供可视化界面的集成管理服务,可以从官网提供的例子查看效果:
[Drone Server]
值得一提的是 Drone 不仅支持很多流行的代码托管服务商(如,Github、Gitlab、Bitbucket),还支持如 Gitea 等自建服务。
Runner 是安装在远程服务器上的独立守护进程,用于执行工作任务。
配置
安装教程里有配置参数,这里不赘述了。
网上有很多基于 docker-compose 运行 Drone 的例子,但是绝大部分例子中使用的都是 drone:0.8,而官网例子中使用的是 drone:1。
下面用较新的 drone 版本,并基于 Github 跑一个 Drone 服务。
version: '2'
services:
drone-server:
image: drone/drone:1.6 # drone 服务采用 1.6 版本
ports:
- 8080:80 # 这里意为将容器的 80 端口映射到本机的 8080 端口
volumes:
- /var/lib/drone:/data
restart: always
environment:
- DRONE_AGENTS_ENABLED=true
- DRONE_GITHUB_SERVER=https://github.com # 基于 GIthub
- DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID} # 这个是教程中申请好的 id
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET} # 这个是教程中申请好的 secret
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET} # 这个是自己生成的 secret,教程中也有案例。
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST} # 这个是你创建 Github OAuth 的时候输入的地址。
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} # 这里输入 http 或 https
- DRONE_LOGS_TRACE=true
drone-agent:
image: drone/agent:1.6
command: agent
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=${DRONE_SERVER_PROTO}
- DRONE_RPC_HOST=${DRONE_SERVER_HOST}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET} # 此处要与上面的 rpc secret 一致
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=${HOSTNAME}
- DRONE_LOGS_TRACE=true
如果需要初始化管理员可以添加这一行:
- DRONE_USER_CREATE=username:octocat,admin:true
后台运行:
$ docker-compose up -d
访问你的集成服务地址,同步并且选择激活你的项目(激活的同时,你激活的项目会添加一个 webhook,可以去你的 Github 查看)。所以每当你推送新的代码的时候,Github 会向你的集成服务器发起推送,服务器在接到推送后会根据项目中 .drone.yaml
文件开始执行各种任务。
下面是一个简单的测试案例:
---
kind: pipeline
type: docker
name: default
steps:
- name: greeting
image: golang:1.13
commands:
- go build
- go test
...
其他
最近上线的 Github Actions 也提供了非常强大的 CI 功能,后续更近基于 Github Actions 的持续集成案例。