参考资料:

Drone 是一个基于 Docker 的持续部署系统,用 Go 语言编写。Drone 本身和所有插件都是镜像,易于使用。

安装

通过 docker-compose 配合 YAML 配置文件,可以方便的安装 Drone。

Drone 的 YAML 配置文件主要有两部分组成:

  • drone-server:Drone 服务器端,用来处理任务分发。可以通过 environment 指定环境变量来使用不同的版本控制系统。
  • drone-agent:Drone 代理客户端,用来执行自动化构建任务。从 0.8 开始,agent 与 server 使用 不同的镜像,官网的示例有误!!!通过增加 agent 容器实例,可以方便的横向扩展 Drone。

最新版本(0.8)的 Drone 配置文件有多处不兼容的地方,参考这里

下面是使用 GitHub 的 Drone 配置文件,对于 ${DRONE_HOST} 之类的参数请替换成你的:

version: '2'

services:
  drone-server:
    image: drone/drone:0.8

    ports:
      - 9080:8000
    volumes:
      - /var/lib/drone:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_HOST=${DRONE_HOST}
      - DRONE_GITHUB=true
      - DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
      - DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
      - DRONE_SECRET=${DRONE_SECRET}

  drone-agent:
    image: drone/agent:0.8

    command: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=drone-server:9000
      - DRONE_SECRET=${DRONE_SECRET}

配置 Drone 和 GitLab

配置 GitLab

GitLab 跟 GitHub 一样,都是通过 OAuth2 认证第三方应用。

对于 GitLab,需要在用户设置(User Settings)页面中,为 Drone 注册 Applications。其中 Redirect URI 填写 Drone 对应的 <scheme>://<host>/authorize,例如 https://drone.kikakika.com/authorize。Drone 所需的权限比较多,所以在指定 Scopes 时,选择“api”。申请应用成功后,需要记下得到的 client id 和 client secret。

编写 Drone 的 docker-compose.yml 文件

Drone 通过 environment 指定的环境变量来配置版本控制系统。

version: '2'

services:
  drone-server:
    image: drone/drone:0.8

    ports:
      - 9080:8000   # 将主机的 9080 端口映射到 Drone 服务器的 8000 端口,可以直接通过主机的 9080 来访问 Drone
    volumes:
      - /var/lib/drone:/var/lib/drone/
    restart: always
    environment:
      # true 表示允许注册,false 表示关闭注册功能,此时只有 DRONE_ADMIN 中指定的账户才能登录
      - DRONE_OPEN=true
      # Drone 外网地址
      - DRONE_HOST=https://drone.kikakika.com
      # 使用 GitLab
      - DRONE_GITLAB=true
      # GitLab 的 Client ID
      - DRONE_GITLAB_CLIENT=95c0282573633eb25e82
      # GitLab 的 Secret
      - DRONE_GITLAB_SECRET=30f5064039e6b359e075
      # GitLab 的 URL
      - DRONE_GITLAB_URL=https://gitlab.kikakika.com
      # Drone Server 和 Agent 的通信密钥,一个随机的长字符串
      - DRONE_SECRET=${DRONE_SECRET}

  drone-agent:
    image: drone/drone:0.8

    command: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=ws://drone-server:8000/ws/broker
      - DRONE_SECRET=${DRONE_SECRET}

GitLab 的所有相关参数解释如下:

DRONE_GITLAB=true                   # true 则表示使用 GitLab
DRONE_GITLAB_URL=https://xx.com     # GitLab 服务器地址
DRONE_GITLAB_CLIENT                 # GitLab oauth2 Client ID
DRONE_GITLAB_SECRET                 # GitLab oauth2 Client Secret
DRONE_GITLAB_GIT_USERNAME           # 可选,使用单一用户来克隆所有仓库,这个用户的用户名
DRONE_GITLAB_GIT_PASSWORD           # 可选,使用单一用户来克隆所有仓库,这个用户的密码
DRONE_GITLAB_SKIP_VERIFY=false      # true 则表示取消 SSL 检查
DRONE_GITLAB_PRIVATE_MODE=false     # 如果 GitLab 以 private 私有模式运行,应设置为 true

配置 Nginx 反向代理

我的网站通过 Lets Encrypt 的通配符域名证书实现了全站 HTTPS,Nginx 中的 Drone 相关的配置如下:

upstream drone {
    server localhost:9080 fail_timeout=0;
}
server {
    listen 443 ssl;
    server_name drone.kikakika.com;

    ssl on;
    ssl_certificate /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/kikakika.key;
    ssl_session_timeout 5m;

    location / {
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_redirect off;

        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Frame-Options   SAMEORIGIN;

        proxy_pass http://drone;
    }
}
server {
    listen 80;
    server_name drone.kikakika.com;

    return 301 https://$host$request_uri;
}

访问网页

访问 Drone 网页时,首先会跳转到 GitLab 的授权页面,点击授权后,跳转回 Drone 网页,列表显示所有的仓库。我这里不知道为什么,仓库始终是空的,但是将 Drone 连接到我的 GitHub 账号是可以读取所有仓库的。可能是 GitLab 没有配置好的问题。

  • 授权页面:
    GitLab 授权页面

  • GitHub 的仓库列表页面:
    GitHub 仓库列表

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐