一、介绍
Drone是一个用GO语言编写的基于Docker的持续集成、持续交付平台,所有的编译、测试的流程都在Docker容器中执行。Drone使用简单的YAML配置文件来定义和执行Docker容器中的Pipelines,开发人员只需要在项目中包含.drone.yml文件,将代码推送到Git版本控制仓库中,Drone就能够自动化的进行编译、测试和发布。
Drone可以无缝集成多个源码管理的平台,包括Github、GitLab、Bitbucket、Gitea、Gogs等,如果企业是基于上面几个搭建的源码管理平台,可以和Drone无缝集成。Drone原生就是跨平台的,支持多种操作系统和架构,包括Linux x64、ARM、ARM64和Windows x64。Drone是在Docker容器里执行流水线,所以Drone支持任意编程语言、数据库和服务。
二、特性
1、配置文件即代码
Drone中定义Pipeline(流水线)都是通过命名为.drone.yml的配置文件来定义的。这个配置文件是以简单、易读的YAML格式编写,如下图所示。这个.drone.yml文件需要和代码一起提交到Git版本控制仓库中,纳入版本管理,方便变更记录的跟踪和回溯。每条流水线的执行都是在一个独立的Docker容器中执行,在执行时自动下载需要的组件。
2、插件体系
Drone是通过插件体系兼容多方平台和提供强大的功能。Drone在执行时,使用容器将预先配置好的步骤加入到Pipeline中,然后从现有的插件体系中选择需要的插件,或者可以创建自己的插件。这里需要提到的是已经和钉钉、微信等通信工具集成。
在Drone里使用插件不会像Jenkins里那样,Jenkins是在自己的平台里管理自己的插件,插件和流水线构建是集成在一起的,每次进去都会看到升级的提示。但在Drone里,插件管理和流水线是分开的,在Pipeline里声明一下,只要有网络连接能访问到就可以,究竟插件是如何管理,如何升级的都可以不用管。
3、独立的构建环境
因为每次构建都运行在独立的Docker容器里,不用担心由于构建环境共用导致的问题。同时,也解决了企业内部多种开发语言,构建工具版本的不同的问题,准备一个镜像就可以解决。基于Docker的构建环境的创建同样也能够加入到Git版本控制仓库,也能对构建环境的版本进行管理和追溯。
4、构建环境的自动扩缩容
首先,基于Docker容器的构建环境本身就具有自动扩缩容的能力。每次都是通过构建一下新的容器环境来执行流水线任务,只要资源足够,可以支持无限制的构建任务。
Drone提供了一个Autoscaler的组件,是一个独立运行的后台进程,需要安装在宿主机上,而且不同的云平台安装方式也不一样。这个组件能够根据构建任务的数量自动创建和终止服务器的实例,从而实现构建环境的自动扩缩容的目标。
三、安装
Drone的安装包含Server端和一个或多个Runners。一个runner是一个安装在远端服务器上的独立的后台进程,它通过轮询服务器上的负载决定是否执行,将runner安装在许多个服务器上来创建分布式的网络。
1、Server端
上面提到,Drone可以无缝集成多种源码管理平台,在进行Server端安装时,需要与源码管理平台进行集成,这里以GitHub为例进行说明:
第一步:准备工作
创建一个OAuth应用程序,在Github设置里创建一个OAuth应用程序,Key和Secret用于授权访问Github上的资源。
创建一个共享的Secret,这个Secret用于Server和Runner之间的通信,可以使用openssl生成一个共享的Secret。
$ openssl rand -hex 16 bea26a2221fd8090ea38720fc445eca6
第二步,下载Drone镜像
Drone是以一个轻量级的Docker镜像分发的,这个镜像是自包含的,不需要任何其他的外部依赖。
$ docker pull drone/drone:1
第三步,配置Server
Drone Server采用环境变量的方式进行配置。这里需要设置的变量有:
DRONE_GITHUB_CLIENT_ID:github oauth Client ID
DRONE_GITHUB_CLIENT_SECRET:github oauth Client Secret
DRONE_GIT_ALWAYS_AUTH:clone时是否每次都需要授权,只在Github Enterprise私有模式下生效
DRONE_RPC_SECRET:通过RPC连接到server的授权Secret
DRONE_SERVER_HOST:提供外部主机名或IP地址
DRONE_SERVER_PROTO:http或https协议,当使用ssl或acme配置时默认是https。
第四步,启动服务器
通过如下的命令启动服务端容器,配置需要的参数通过环境变量,这是使用docker run方式启动。
docker run
--volume=/var/lib/drone:/data
--env=DRONE_AGENTS_ENABLED=true
--env=DRONE_GITHUB_SERVER=https://github.com
--env=DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
--env=DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
--env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
--env=DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
--env=DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}
--publish=80:80
--publish=443:443
--restart=always
--detach=true
--name=drone
drone/drone:1
基于Github的Server就启动了,其他的源码控制管理平台的安装也是一样。
2、Runner安装
一旦Server端安装完毕后,就需要安装Runner来执行Pipelines。Drone支持多种形式的Runner,下面单独介绍:
Docker Runner:当在Docker容器里执行构建流水线时安装此Runner。
Kubernetes Runner:当Drone运行在Kubernetes上时,该Runner在Pods里执行构建流水线。
Exec Runner:当直接在宿主机上执行构建流水线时安装此Runner,通常都是采用shell脚本。
SSH Runner:当需要在远程服务器上执行构建流水线时,通过SSH协议直接调用执行。
Digital Ocean Runner:这个Runner使用SSH协议在一台专用的Droplet上执行,这个Droplet在每个流水线执行时创建,完成后销毁。
四、配置
一个项目以配置即代码的方式存储配置文件,在项目的根目录下添加一个.drone.yml文件,这个文件和代码库一起加入版本控制,并遵循相同的分支结构。每次推送代码、创建或更新一个Pull Request、或者推送一个Tag时,系统将获取这个yaml配置文件并执行这个Pipeline。主要配置以下几个资源:
1、Pipeline
一个Pipeline为这个项目定义了一个持续集成和持续交付的过程,可以认为是一个工作流,定义了如何构建、测试和部署等步骤。pipeline配置样例:
---
kind: pipeline
type: docker
name: default
steps:
- name: build
image: golang
commands:
- go build
- go test
....
Drone支持不同类型的执行环境,每种类型的环境都有自定义的yaml规范。kind和type属性定义了pipeline的类型和目标执行环境。根据上面Runner类型的不同,这里的yaml文件的配置也是不一样的,通过type这个字段进行区分,每种类型的Runner支持的Yaml文件的规范也是不一样的,特殊类型要特殊对待。
2、Secrets
Secret用户存储和管理敏感信息,有下面几种级别的设置。
代码库级别:
代码库的Secrets用于存储和管理敏感信息,如密码、令牌和ssh密钥。将此信息存储在Secrets中比纯文本的配置文件更加安全。
组织级别:
组织级别的Secrets可以用于这个组织下的任意代码库。
加密Secrets:
加密Secrets用于存储敏感信息,如密码、令牌和ssh密钥,将此信息作为加密的字符串存储在配置文件中。可以使用命令行工具加密Secrets,每个代码库都单独加密,这个Key从不离开服务器环境。
External
外部的Secrets用于从外部的Secrets存储里获取敏感信息,如密码、令牌和ssh密钥。
3、Signature签名
可以选择对配置文件进行签名,以验证其真实性并防止篡改。这个签名在代码库是公共的,并且需要防止对配置进行未经授权的更改时会很有用。如果用户修改配置并且签名验证失败,流水线将被阻止,需等待对代码库具有写权限或管理权限的用户手动批准。
4、Cron定时调度
可以使用Cron jobs来执行基于时间的调度,可以在代码库的Settings界面上创建和管理cron job或使用命令行工具。
表达式
cron表达式代表了任务执行的时间集合,包含6个字段,各字段说明如下:
Drone内部已经定义了一些调度的cron表达式,如@yearly、@monthly、@weekly、@daily、@hourly。
五、试用
在Drone Cloud平台上,可以与Github集成,构建Github上的代码仓库,这里我选择了一个SpringBootTest的代码库,使用Github的页面编辑新增.drone.yml文件,如下:
提交之后就会触发Drone流水线构建
点击进入到流水线详情页面。第一步是clone代码库阶段,clone不需要在yml文件内声明。
第二步是test阶段,这一步是.drone.yml文件中声明的,通过日志可以看出,该步骤是先拉取了gradle:jdk8的镜像,然后在该容器内部执行的流水线步骤。
六、总结
如今,越来越多的企业开始重视软件研发的效率和质量,也有越来越多的企业开始采用DevOps理念来提升效率和质量。在整个软件研发全生命周期中,CICD是非常重要并且提升效率最为明显的阶段。通过实现自动化,能够大幅缩短从开发到测试到部署的时间。
随着Docker、Kubernetes等容器技术的成熟,特别是一线互联网公司已经将自己的业务部署在云端。在不远的未来,云计算必将成为软件系统运行的基础设施环境,就像如今的水和电一样想用就用。云计算的普遍使用,也催生了云原生技术的发展,同时也催生了云原生下的CICD平台的崛起,Drone就是其中一员。
Jenkins在一段时期内是CICD的代名词,界面化的操作和配置根本无法谈增效,Jenkins 2.0后,通过配置即代码的最佳实践,将流水线的构建过程配置到jenkinsfile里,提交到代码仓库下也纳入到了版本控制下,但真正用起来的并不多见。Jenkins X是下一代基于云原生的CICD框架,以Docker和Kubernetes容器生态为基础组件,通过命令行的方式实现CICD的所有功能。
JenkinsX和Drone都属于云原生下的CICD框架,都能充分利用容器的天然优势,提高CICD的灵活性和效率,JenkinsX目前仍在开发中,Drone目前来看已经在多个案例使用。如果打算构建容器环境的CICD平台,Drone可以是个不错的选择。