如果项目有持续集成的需求,对于开源项目直接上 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 的持续集成案例。