因原有的CI/CD工具近期频繁出现问题,于是用之前就看过的 Drone 来作为替代。
Drone CI – Automate Software Testing and Delivery
Drone 是一个以轻量级、现代化的持续集成和持续交付平台,Drone 可以与 Docker 和 Kubernetes 无缝衔接,也可以与主流的 Git 平台进行联动,从而实现自动化的构建、测试和部署工作流程。具体的安装步骤可参阅官方文档,以下是一些配置记录:
在 Gitlab 上创建一个应用,获取 Client ID 和 Client Secret,并授权 Drone 访问你的仓库。可以参考这个教程来创建应用。其中在 Redirect URI 中填写 https://drone.example.com:8080/login
(根据实际的Server域名修改),在 Scopes 中勾选 api 和 read_user。
如下为 Server 的 docker-compose.yml 配置
version: "3"
services:
drone-server:
image: "drone/drone:2"
container_name: "drone-server"
restart: "always"
volumes:
- "/etc/localtime:/etc/localtime"
- "drone-data:/data"
ports:
- "8080:80"
environment:
- "DRONE_AGENTS_ENABLED=true"
- "DRONE_GITLAB_SERVER=https://gitlab.example.com"
- "DRONE_GITLAB_CLIENT_ID=<此处为Gitlab中注册应用对应的Client_ID>"
- "DRONE_GITLAB_CLIENT_SECRET=<此处为Gitlab中注册应用对应的Client_Secret>"
- "DRONE_RPC_SECRET=<远程调用随机字符串>"
- "DRONE_SERVER_HOST=drone.example.com:8080"
- "DRONE_SERVER_PROTO=http"
- "DRONE_USER_CREATE=username:demo,machine:false,admin:true"
volumes:
drone-data:
将 DRONE_RPC_HOST 改为你的 Drone Server 的域名,将 DRONE_RPC_SECRET 改为与 Drone Server 相同的字符串,将 DRONE_RUNNER_CAPACITY 改为你想要同时运行的容器数量,将 DRONE_RUNNER_NAME 改为一个标识你的 Runner 的名称。
version: "3"
services:
runner-docker:
image: "drone/drone-runner-docker:1"
container_name: "drone-runner"
restart: "always"
volumes:
- "/etc/localtime:/etc/localtime"
- "/var/run/docker.sock:/var/run/docker.sock"
- "/home/user/.docker/config.json:/root/.docker/config.json"
ports:
- "8081:3000"
environment:
- "DRONE_RPC_PROTO=http"
- "DRONE_RPC_HOST=drone.example.com:8080"
- "DRONE_RPC_SECRET=<与Server中配置保持一致>"
- "DRONE_RUNNER_CAPACITY=2"
- "DRONE_RUNNER_NAME=drone-agent-1"
- "DRONE_RUNNER_CLONE_IMAGE=drone/git:1"
- "DRONE_DOCKER_CONFIG=/root/.docker/config.json"
其中 config.json
文件是一个JSON格式的配置文件,其中包含了 Docker 认证信息和其他相关配置项。可通过在宿主机上执行 docker login 命令登录私有镜像仓库得到。
docker login
命令用于登录到一个Docker Registry,以便能够推送和拉取镜像。在执行该命令时,会提示用户输入用户名和密码,然后将认证凭证保存在配置文件中,以便后续的Docker操作可以自动使用这些凭证进行认证。
其内容格式应该如下:
{
"auths": {
"harbor.example.com": {
"auth": "Y3Jjc29**************************"
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.11 (linux)"
}
}
在搭建好了 Drone Server 与 Runner 后,就可以对项目进行相应的调整,在项目根目录下新建一个
.drone.yml
文件。通过此文件来定义 Drone 的工作流程。以下为 Spring Boot 项目的一个文件示例
kind: pipeline
name: default
type: docker
steps:
- name: maven-build-package
image: maven:3.6.3-openjdk-8-slim
volumes:
- name: maven-cache
path: /root/.m2
commands:
- mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -U -B -V
- cp target/*.jar src/main/docker/
- name: build-docker-image
image: plugins/docker:1
settings:
registry: harbor.example.com
mirror: <https://harbor.example.com>
insecure: true
username:
from_secret: DOCKER_USERNAME
password:
from_secret: DOCKER_PASSWORD
dockerfile: src/main/docker/Dockerfile
context: src/main/docker/
repo: harbor.example.com/soft/${DRONE_REPO_NAME}
tags:
- latest
- name: push-image
image: plugins/docker:1
settings:
registry: harbor.example.com
username:
from_secret: DOCKER_USERNAME
password:
from_secret: DOCKER_PASSWORD
repo: harbor.example.com/soft/${DRONE_REPO_NAME}
tags:
- latest
volumes:
- name: maven-cache
host:
path: /home/user/drone/maven-cache
在上述配置文件中,定义了三个步骤,每个步骤都指定了一个Docker镜像作为执行环境,并给出了一系列命令或设置。其中: