使用 drone 替代 gitlab action 搭建自动化集成环境
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%左右,项目越复杂越明显。