Drone 搭建记录
status
Published
type
Post
slug
drone-ci-cd
date
Feb 1, 2021
tags
Docker
DevOps
summary
Drone 是一个轻量级、现代化的持续集成和持续交付平台。通过与 Docker 和 Kubernetes 集成,以及与主流的 Git 平台联动,Drone 可以实现自动化的构建、测试和部署工作流程。在搭建过程中,需要在 Git 平台上创建一个应用,并获取 Client ID 和 Client Secret,然后将这些信息配置到 Drone Server 和 Runner 中。Drone Server 负责接收和处理 CI/CD 任务,而 Drone Runner 负责在 Docker 容器中执行这些任务。在项目中,可以通过配置一个.drone.yml 文件来定义 Drone 的工作流程,包括构建、打包和部署等步骤。最后,通过 Drone Web 界面可以手动触发 Pipeline 或配置自动触发,监控任务的运行情况。通过这种方式,可以实现高效的 CI/CD 流程,提高开发效率。
因原有的CI/CD工具近期频繁出现问题,于是用之前就看过的 Drone 来作为替代。
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镜像作为执行环境,并给出了一系列命令或设置。其中:
maven-build-package
步骤使用maven镜像来执行mvn clean package命令,将Java项目打包为jar文件。
build-docker-image
和push-image
步骤使用plugins/docker镜像来分别执行docker build和docker push命令,将jar文件打包为Docker镜像,并推送到私有镜像仓库上。私有镜像仓库的用户名和密码可在Drone Web界面中的Secrets菜单中设置。
并且其中还将 maven 配置等映射到本地文件实现了对缓存的利用。
将此文件提交并推送到代码仓库后,可在Drone Web界面中去手动执行Pipeline并观察其运行情况。当然也可以配置按分支或其他形式的自动触发。如果顺利,那么目标镜像就可以出现在私有镜像仓库中。
pipeline 中的配置项还有很多,还可以将测试、部署的步骤也加入其中,此处待后续完善。
参考资源:
- Drone官方文档:https://docs.drone.io
- Drone插件列表:https://plugins.drone.io
- Drone社区论坛:https://discourse.drone.io