一:前言
1.1 CI/CD概念介绍
持续集成(Continuous integration,缩写CI)是一种软件工程流程,是将所有软件工程师对于软件的工作副本持续集成到共享主线(mainline)的一种举措,即自动且频繁地将代码更改集成到共享源代码存储库中的做法,简单来说就是当开发人员提交了新代码到之后,能够快速的合并到主干,对整个应用进行构建与自动化测试,及时发现开发人员引入的问题,并能快速解决,使用主干处于可用状态,让产品保持快速且高质量的迭代。
持续交付(Continuous delivery)是持续集成的延续,频繁地将软件的新版本,交付给质量团队或者用户进行测试与验收。如果代码没有问题通过,就进入生产阶段。
持续部署(continuous deployment)是持续交付的下一步,指的是代码通过测试与评审以后,自动部署到生产环境,以供客户使用。
1.2 CI/CD 工具的主要作用
- 自动完成代码合并、编译与运行单元测试,有助于问题的较早发现与修复。
- 自动化的部署流程,可以将经过测试的代码自动部署到生产环境,确保快速、可靠的发布。
- 提高开发效率:开发人员可以快速获取构建失败的反馈,减少调试时间、自动化流程减少了人工干预,提高工作效率。
1.3 Drone主要特点
- 基于go语言开发的开源的CI/CD系统、安装配置简单,轻量级,启动快资源占用少
- 天然支持Docker,支持多种执行环境,包括 Docker 和 Kubernetes,特别适合微服务架构和云原生应用的开发
- 执行流程.drone.yml编写简单,Pipline 比 Jenkins 语法简单,可快速上手
- Drone 通过插件机制,支持多种扩展和集成,可以灵活定制构建过程
二:Drone简介
2.1 Drone 概述
Drone 是一个现代化的开源持续集成(CI)和持续交付(CD)平台。它通过简单易用的方式帮助开发团队自动化构建、测试和部署应用程序,提升软件开发效率和质量。Drone 由 Brad Rydzewski 在 2012 年创建并开源。最初的设计目标是提供一个易于使用的 CI/CD 工具,简化构建和部署流程。
2.2 Drone 持续集成架构
2.3 Drone 工作流程
2.4 Drone的核心功能
2.4.1 使用 .drone.yml
文件来定义构建和部署流程
kind: pipeline
type: docker
name: default
steps:
- name: build
image: golang:latest
commands:
- go build
- go test
- name: publish
image: plugins/docker
settings:
repo: mydockerhub/repo
tags: latest
username:
from_secret: docker_username
password:
from_secret: docker_password
when:
event: push
branch: master
上述部署流程含义是:当收到master分支出现push事件时, 使用golang:latest
镜像来编译和测试 Go 代码,另个从环境变量中获取用户名与密码,使用 plugins/docker
这个 Docker 插件镜像来执行构建(默认路径下Dockerfile)和推送 Docker 镜像的任务。
2.4.2 支持多源码托管平台
- Drone 支持 GitHub, GitLab, Bitbucket, Gitea 等多种版本控制系统,可以轻松与这些平台集成。
- Webhook 事件:通过 Webhook 事件触发构建,确保代码变更后自动执行构建流程
2.4.3 支持并行构建
kind: pipeline
type: docker
name: default
steps:
# 第一个并行执行的步骤
- name: test-1
image: golang:latest
commands:
- go version
- go test ./...
# 第二个并行执行的步骤
- name: test-2
image: node:latest
commands:
- node --version
- npm install
- npm test
# 定义并行化的逻辑
# group 是用来定义并行执行的步骤组
group:
- test-1
- test-2
Drone 会启动2个独立的容器并行执行这三个步骤,分别运行 Go 测试、Node.js 测试 。上面2个步骤结束之后,才会执行新的step
2.4.4 基于条件执行
pipeline:
slack:
image: plugins/slack
channel: dev
+ when:
+ branch: master
只有在master 分支的时候才使用slack 插件、对于特性分支可以使用*来进行匹配
branch: feature/*
2.4.5 配置缓存机制来加速构建过程
kind: pipeline
type: docker
name: xxname
clone:
disable: true
steps:
- name: clone
image: alpine/git:v2.34.2
commands:
- git clone xx.git .
- git checkout $DRONE_BRANCH
- name: restore-cache
image: drillster/drone-volume-cache
pull: if-not-exists
volumes:
- name: node-cache
path: /cache
settings:
restore: true
mount:
- ./node_modules
- name: build
image: node:14.17.1-slim
commands:
- npm install
- npm run build
- name: rebuild-cache
image: drillster/drone-volume-cache
pull: if-not-exists
volumes:
- name: node-cache
path: /cache
settings:
rebuild: true
mount:
- ./node_modules
## 省略中间的publish
volumes:
- name: node-cache
host:
path: /data/cache/node_modules
缓存流程流程如下
restore-cache
步骤: 使用drillster/drone-volume-cache
镜像恢复之前缓存的依赖- build步骤:编译代码
rebuild-cache
步骤:使用drillster/drone-volume-cache
镜像保存新的依赖到缓存
其中缓存卷 路径为/data/cache/node_modules
2.4.6 多种 Runner 类型
Drone 采用Server 和 Runner 分离的微服务的架构。Server管理构建任务,提供 Web 界面,处理用户请求,调用实际的Runner来进行处理任务。Drone 有多种 Runner 类型:
- Docker Runner:使用 Docker 容器执行构建任务。
- Kubernetes Runner:使用 Kubernetes Pod 执行构建任务。
- SSH Runner:通过 SSH 连接到远程服务器执行构建任务
2.4.7 丰富的插件生态
Drone官方和社区都 提供了一系列插件,支持常见的构建、测试和部署工具,比如前面的 plugins/docker、plugins/slack 。开发者可以灵活定义并发布自己的插件
三. 安装与配置
接下来以gitee 平台为例,通过安装drone来构建自动化部署流水线。
3.1 gitee平台设置创建第三应用
3.2 生成Server(服务器)
与 Runner(执行器)
之间通讯的密钥
openssl rand -hex 16
3.3 基于docker-compose 安装drone 和runner
创建docker-compose.yml文件 ,替换下面的xx为真实的配置数据
version: '3'
services:
server:
image: drone/drone
ports:
- 80:80
- 443:443
volumes:
- /opt/drone/data:/data:rw
networks:
- drone
restart: always
environment:
# drone服务器域名或ip
- DRONE_SERVER_HOST=ipxx:portxx
# 使用的协议http或者https
- DRONE_SERVER_PROTO=http
# runner通信密钥,后面runner也要配置相同的值
- DRONE_RPC_SECRET=rpc密钥xx
# gitee第三方应用client id
- DRONE_GITEE_CLIENT_ID=client_id_xxx
# gitee第三方应用client secret
- DRONE_GITEE_CLIENT_SECRET=client_secret_xx
# 默认创建账户,设置你的gitee用户名,这样你登录后是作为管理员
- DRONE_USER_CREATE=username:user_name_xxx,admin:true
# drone各日志功能
- DRONE_LOGS_DEBUG=true
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_COLOR=true
- DRONE_LOGS_PRETTY=true
- DRONE_LOGS_TEXT=true
runner:
image: drone/drone-runner-docker
restart: always
ports:
- 3000:3000
networks:
- drone
depends_on:
- server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
# 与drone server通信的协议http/https
- DRONE_RPC_PROTO=http
# drone server服务器
- DRONE_RPC_HOST=ipxx:portxx
# drone server rpc密钥
- DRONE_RPC_SECRET=rpc密钥xx
# runner name,标识runner
- DRONE_RUNNER_NAME=runner
# runner最多同时执行任务数
- DRONE_RUNNER_CAPACITY=2
# runner使用协议http/https
- DRONE_HTTP_PROTO=http
# runner的host
- DRONE_HTTP_HOST=runner
# 是否开启runner ui
- DRONE_UI_DISABLE=true
# 访问runner ui时的登录用户名
- DRONE_UI_USERNAME=username_xx
# 访问runner ui时的登录密码
- DRONE_UI_PASSWORD=password_xx
networks:
drone:
执行
docker-compose up -d
3.4 访问drone 地址跳转到Gitee授权
点击同意授权,即可进入到Drone dashBoard页面
四 :创建第一个 Drone pipeline
4.1 创建一个简单的springBoot工程
使用IDE创建一个简单的 drone test工程,使用dev分支 并推送到 Gitee平台
4.2 Drone Web界面拉取仓库并激活
4.2.1 先同步拉取仓库
4.2.2 激活并配置受信任
4.3 编写流水线文件.drone.yml
替换其中的xx为真实的配置数据
kind: pipeline
type: docker
name: test_drone
clone:
disable: true
steps:
- name: clone
image: alpine/git:v2.34.2
commands:
- git clone xxx/test_drone .
- git checkout $DRONE_BRANCH
- name: build
image: maven:3.8.5-openjdk-8-slim
volumes:
- name: maven-cache
path: /root/.m2
commands:
- mvn clean install -DskipTests
- name: publish
image: plugins/docker:20.10.9
settings:
username:
from_secret: harbor_username
password:
from_secret: harbor_password
repo: xxRepo/${DRONE_BRANCH}/test_drone
registry: xxRepo
dockerfile: ./Dockerfile
insecure: true
cache_from:
- xxRepo/library/basic:0.0.1
tags:
- 0.0.1
- name: deploy_dev
when:
branch:
- dev
image: appleboy/drone-ssh:1.6.3
settings:
host: xxhost
username:
from_secret: user_name
password:
from_secret: password
port: 22
script:
- sudo docker rm -f test_drone
- sudo docker rmi -f xxRepo/${DRONE_BRANCH}/test_drone:0.0.1
- sudo docker pull xxRepo/${DRONE_BRANCH}/test_drone:0.0.1
- sudo docker run -d --name test_drone --restart=always -v /data/program/logs/test_drone:/data/program/app/logs xxRepo/${DRONE_BRANCH}/test_drone:0.0.1
trigger:
branch:
- master
- feature
- dev
volumes:
- name: maven-cache
host:
path: /root/.m2
流水线中的username 和 password 均采用drone中 具体某一个Repositories里面的secret配置
4.4 其它主要配置
- 打镜像需要的Dockerfile文件
- 运行应用程序的entrypoint.sh
4.5 部署成功截图
4.5.1查看流水线部署日志
4.5.2 查看应用部署
4.6 部署过程中的问题
- docker-compose.yml文件中的 DRONE_SERVER_HOST 写IP :端口号,不要添加http。
- 从harbor拉不到镜像 ,编辑 Docker 的配置文件(/etc/docker/daemon.json ,没有则新创建),以允许从不安全的 HTTP 注册表拉取镜像。
{ "insecure-registries": ["harborIP:harborPort"] }
五:总结
5.1 drone 主要优势
- 轻量级:天然支持Docker容器,环境部署简单;使用Docker 容器来运行构建任务,保证各项目构建环境的隔离性。
- 容易使用:Drone的管道配置是基于YAML的,所有的功能、步骤、工具、命令都可以一个yaml配置文件中解决,容易理解与编写;且支持多种 SCM 平台如 GitHub, GitLab ,gitee,gogs等
- 兼容性好且具备灵活的插件系统:Drone可以支持多种编程语言和框架,并且与Docker等工具的集成也很好,同时也具有良好的可扩展性和可定制性;提供丰富的插件,用户可以根据需求定制构建流程
- 用户体验不错:Drone还提供了现代化的界面和用户体验,易于使用和管理。
5.2 drone 使用缺点
- 社区支持有限:相比一些成熟的 CI/CD 工具(如 Jenkins),社区支持和文档相对较少,解决问题较慢
- 缺乏企业级功能:开源版本的 Drone 缺乏高级的权限管理与审计相关日志。
总体来讲,Drone 是一个比较适用Docker技术栈的小型团队的 CI/CD 工具,它的易安装、灵活配置化以及基于容器的构建特点可以让开发者快速上手并适应各类需求。对于大型企业特别是某些场景有特殊需求的团队,有一定的局限性。
六:参考资料
- docs.drone.io/
- drone.cool/