流水线工具调研

  • Drone CI

  • Jenkins

  • Travis CI

  • Circle CI

Drone

官网:https://www.drone.io/

这里以 Github + docker 为例

1. 准备工作

在 Github 创建一个OAuth应用程序: Settings - OAuth Apps - New OAuth App,Homepage URL 和 Authorization callback URL 填你自己的 Drone 服务器的地址,这是一个 Webhook,当代码提交等事件触发时就会向该服务器发送事先定义好的请求。前者为服务器主页,后者为认证的地址,若第一次访问主页则会跳转到认证的URL。

image-20201224191511820

创建一个共享密钥,以验证 runner 与中央 Drone 服务器之间的通信。按照官网的示例使用 openssl 生成共享密钥:

openssl rand -hex 16

2. 下载

下载 drone 的 docker 镜像

# 中央服务,调度任务
docker pull drone/drone:1
# Runner,每条流水线由一个执行机执行
docker pull drone/drone-runner-docker:1

3. 配置

drone 的服务使用环境变量来配置

DRONE_GITHUB_CLIENT_ID=3e0c94638b876903d131
DRONE_GITHUB_CLIENT_SECRET=e70a6a4be8a10decdeef8959c1d9e4f04a0a55e3
DRONE_RPC_SECRET=abd2ea5baed1800ee8ac64003956ed77
DRONE_SERVER_HOST=117.78.10.6:80
DRONE_SERVER_PROTO=http

4. 运行

需要注意端口 80 不能修改,但可以映射为其他端口

Server

docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITHUB_CLIENT_ID=3e0c94638b876903d131 \
  --env=DRONE_GITHUB_CLIENT_SECRET=7a12782c15451036727ed0922e9fe6c6737af02d \
  --env=DRONE_RPC_SECRET=210ce548dd2a84193706fc618e94d944 \
  --env=DRONE_SERVER_HOST=118.195.157.53:80 \
  --env=DRONE_SERVER_PROTO=http \
  --publish=9000:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:2

Runner

docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=http \
  -e DRONE_RPC_HOST=117.78.10.6:9000 \
  -e DRONE_RPC_SECRET=210ce548dd2a84193706fc618e94d944 \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=${HOSTNAME} \
  -p 9001:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:1

Drone原理

运行流程

  1. webhook 触发 drone server
  2. 找到 repo下的 .drone.yml ,将定义的流水线解析成 docker steps,调用docker 服务,获取镜像,启动容器,执行命令,将 log 展示在 web ui 上

问题

流水线经常报错:HTTP/2 stream 1 was not closed cleanly before end of the underlying stream

TravisCI

TravisCI官方网站,用Github账号登入