drone 是什么?

drone 是一个使用Go语言开发的轻量型自动化持续集成工具。 其官网地址 https://drone.io 当前版本是2。

安装 drone

安装 drone 最简便的方法就是 docker + compose 的方式。 Drone 支持的版本管理工具系统都在其文档中罗列出来了 https://docs.drone.io 并且其中的安装步骤较为详细。

docker-compose.yml如下:

services:
  drone-server:
    image: "drone/drone:2"
    container_name: "ci-server"
    restart: always
    environment:
        TZ: "Asia/Shanghai"
        DRONE_GITLAB: true
        DRONE_GITLAB_SKIP_VERIFY: true
        DRONE_GITLAB_SERVER: "${DRONE_GITLAB_SERVER}"
        DRONE_GITLAB_CLIENT_ID: "${DRONE_GITLAB_CLIENT_ID}"
        DRONE_GITLAB_CLIENT_SECRET: "${DRONE_GITLAB_CLIENT_SECRET}"
        DRONE_GITLAB_GIT_USERNAME: "${GIT_USERNAME}"
        DRONE_GITLAB_GIT_PASSWORD: "${GIT_PASSWORD}"
        DRONE_RPC_SECRET: "${DRONE_RPC_SECRET}"
        DRONE_SERVER_HOST: "${DRONE_SERVER_HOST}"
        DRONE_SERVER_PROTO: "${DRONE_SERVER_PROTO}"
        DRONE_USER_CREATE: username:${GIT_USERNAME},admin:true
    ports:
      - 8090:80
      - 4433:433
    volumes:
      - /etc/hosts:/etc/hosts
      - /etc/localtime:/etc/localtime
      - /var/lib/drone:/data
      - /home/resin/.m2:/root/.m2
  drone-runner:
    image: "drone/drone-runner-docker:1"
    container_name: "ci-runner"
    restart: always
    network_mode: "host"
    depends_on:
      - drone-server
    environment:
      TZ: "Asia/Shanghai"
      DRONE_RPC_PROTO: "${DRONE_SERVER_PROTO}"
      DRONE_RPC_HOST: "${DRONE_SERVER_HOST}"
      DRONE_RPC_SECRET: "${DRONE_RPC_SECRET}"
      DRONE_RUNNER_CAPACITY: 2
      DRONE_RUNNER_NAME: ci-runner
    # ports:
    #   - 3000:3000
    volumes:
      - /etc/hosts:/etc/hosts
      - /etc/localtime:/etc/localtime
      - /var/run/docker.sock:/var/run/docker.sock

启动 docker compose up -d 即可。

此时drone 默认是用sqlite数据库,位于 var/lib/drone内。

链接到 GitLab

你首先需要在 GitLab 的 应用 模块内添加一个应用,回调地址填写格式类似 https://drone.yourdomain.com/login 并授权 api和read_user,保存后将 CLIENT_ID和CLIENT_SECRET 添加到 .evn文件内。 变量都设置好后,使用 docker compose up -d 启动 compose。

由于我们使用的GitLab是通过 https 协议访问的,因此建议 drone 也都使用https协议。

然后浏览器访问 https://drone.yourdomain.com/ 点击继续,会到 GitLab站点进行认证,认证通过后会回调到 https://drone.yourdomain.com/login 并进入了 drone 的控制面板,此时表明搭建完成。

激活仓库

当你是以 管理员 用户身份登录到drone系统后,你可以在仓库的详情页将仓库增加到激活列表,并在 设置Trusted 勾选上。

编写CI的自动执行脚本 .drone.yml

按照约定将编写好的 .drone.yml 放置在项目的根目录,如下:

---
kind: pipeline
type: docker
name: builder

clone:
  depth: 1
# 构建步骤
steps:
- name: verify
  image: maven:3.9.6-amazoncorretto-8
  volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: maven-cache
        path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
  commands:
    - mvn -T 8 clean verify -Dmaven.test.skip=false -B -V || exit 1
  settings:
    log_level: info
volumes:
  - name: maven-cache
    host:
      path: /home/resin/.m2  # 指定宿主机的目录

之后,当开发者在项目内使用 git push 推送代码或合并分支后,就会自动执行构建操作。

后记

由于团队目前使用的Jenkins进行构建,而我为了对比Jenkins和Drone的构建速度,额外搭建了Drone环境。 经过多次同条件的构建过程,发现 Drone 通常都比 Jenkins 快 30%左右,项目越复杂越明显。

参考文章