Jenkins是否还要继续用?一款基于容器的CICD平台Drone

一、介绍

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。

$ opensslrand-hex16bea26a2221fd8090ea38720fc445eca6

第二步,下载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方式启动。

dockerrun \  --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:pipelinetype:dockername:defaultsteps:-name: buildimage:golangcommands:-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可以是个不错的选择。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容