因原有的CI/CD工具近期频繁出现问题,于是用之前就看过的 Drone 来作为替代。

Drone CI – Automate Software Testing and Delivery

Drone 是一个以轻量级、现代化的持续集成和持续交付平台,Drone 可以与 Docker 和 Kubernetes 无缝衔接,也可以与主流的 Git 平台进行联动,从而实现自动化的构建、测试和部署工作流程。具体的安装步骤可参阅官方文档,以下是一些配置记录:

Drone Server

在 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 Runner

将 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镜像作为执行环境,并给出了一系列命令或设置。其中: