基于Drone Gogs流水线-全面认识轻量级云原生CI引擎Drone
1. 介绍
Drone by Harness™ 是一个基于Docker容器技术的可扩充套件的持续整合引擎,用于自动化测试、构建、释出。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。开发者只需在专案中包含 .drone.yml档案,将程式码推送到 git 仓库,Drone就能够自动化的进行编译、测试、释出。可以与Docker完美整合。
特点
- Drone引入了Pipelnes的概念,管道可帮助我们自动化软体交付过程中的步骤,例如启动程式码构建,执行自动化测试以及部署到暂存或生产环境。
- 通过将.drone.yml档案放在git资讯库的根目录中来配置管道。 yaml语法旨在易于阅读和表达,以便检视储存库的任何人都可以理解工作流程。
- Drone通过多个step来完成一系列的指令。
为什幺选择Drone?
-
和 Jenkins 相比, Drone 就轻量的多了,从应用本身的安装部署到流水线的构建都简洁的多。由于是和原始码管理系统相整合,所以 Drone 天生就省去了各种账户许可权的配置,直接与 gitlab 、 github 、 Bitbucket 这样的原始码管理系统操作原始码的许可权一致
-
Drone 与流行的原始码管理提供商无缝整合,支援github、gitlab、gogs、gitea、gitee、bitbucket server/cloud, 这是使用Drone的第一印象,可以实行快速打造GitOps场景
-
流水线外挂是执行预定义任务的 Docker 容器,通过将它们配置为Pipeline中的步骤。外挂可用于部署程式码、释出工件、传送通知等。
2. 部署Gogs-极易搭建的自助 Git 服务
安装MySQL
docker run --name gogs-mysql --restart=always -v /opt/mysql/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.19
建立Gogs及drone资料库
mysql -uroot -p123456 -h 127.0.0.1
CREATE DATABASE IF NOT EXISTS gogs CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
create database drone;
Pull image from Docker Hub.
$ docker pull gogs/gogs
Create local directory for volume.
$ mkdir -p /var/gogs
执行Gogs
docker run --name=gogs --restart=always --link gogs-mysql:db -p 10022:22 -p 10080:3000 -v /var/gogs:/data gogs/gogs
账号:admin
密码:123456
开启页面继续配置Gogs
3. 部署Drone-Server
docker run \ --volume=/var/lib/drone:/data \ --env=DRONE_AGENTS_ENABLED=true \ --env=DRONE_GOGS_SERVER=http://192.168.31.112:10080 \ --env=DRONE_RPC_SECRET=123456 \ --env=DRONE_SERVER_HOST=192.168.31.112 \ --env=DRONE_SERVER_PROTO=http \ --env=DRONE_LOGS_TRACE=true \ --publish=801:80 \ --publish=4431:443 \ --restart=always \ --detach=true \ --name=drone \ drone/drone:2.0.2
- DRONE_GOGS_SERVER:这里使用的是gogs作为git仓储,当然drone也支援github,gitlab等一些主流的原始码管理平台,不同的平台需要设定不同的环境变数
- DRONE_RPC_SECRET:与agent之间通讯的金钥,一定要配置
- DRONE_SERVER_HOST:设定drone server使用的host名称,可以是ip地址加埠号
- DRONE_SERVER_PROTO:使用的协议http/https
- DRONE_USER_CREATE:设定初始的管理员,这个是超级管理员
- DRONE_LOGS_TRACE:启动日誌,预设是关闭的
- DRONE_OPEN 开启注册,此配置允许任何人自注册和登入系统
4. 启用仓库配置Webhook
- 1 登入drone启用仓库
- 2 在仓库建立.drone.yml档案
- 3 检查仓库的webhooks配置是否正常
启用之后,自动就会在gogs仓库的Web设定中建立钩子
当不存在.drone.yml档案或者仓库没有在drone启用,测试返回的报文可能是dial tcp连线失败。
5. 部署Drone-Runner
Drone CI提供了多种runtime,可以利用docker方式执行,也可以通过传统ssh方式执行,也可以採用k8s作为runtime;Drone CI实现了一个可扩充的runner架构,方便实现各种runner。Drone Runner是独立的守护程式,用于轮询伺服器以执行挂起的Pipeline。有不同型别的Runner针对不同的用例和执行时环境进行了优化。成功安装Drone Server后,必须安装一个或多个执行器。
使用ssh-runner
用 SSH 协议在静态远端伺服器上执行管道命令。管道命令直接在远端伺服器上执行,没有隔离,使用预设 shell。出于安全原因,此执行器不适合不受信任的工作负荷。
docker run -d \ -e DRONE_RPC_PROTO=http \ -e DRONE_RPC_HOST=192.168.31.112:801 \ -e DRONE_RPC_SECRET=123456 \ -p 4001:3000 \ --restart always \ --name runner-ssh \ drone/drone-runner-ssh
使用 docker runner
针对可以在无状态容器中执行测试和编译程式码的专案进行了优化; 不太适合无法在容器内执行测试或编译程式码的专案,包括面向 Docker 不支援的作业系统或体系结构(如 macOS)的专案。Docker 执行器也不太适合需要在管道执行之间在主机上储存档案或资料夹的有状态管道
docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ -e DRONE_RPC_PROTO=http \ -e DRONE_RPC_HOST=192.168.31.112:801 \ -e DRONE_RPC_SECRET=123456 \ -e DRONE_RUNNER_CAPACITY=10 \ -e DRONE_RUNNER_NAME=${HOSTNAME} \ -p 4002:3000 \ --restart always \ --name runner-docker \ drone/drone-runner-docker:1
- DRONE_RPC_HOST:上面启动server时配置的host
- DRONE_RPC_SECRET:跟server配置的要保持一致
- DRONE_RUNNER_CAPACITY:可以同时执行的任务数
- DRONE_RUNNER_NAME:一般设定为主机名
6. 配置.drone.yml执行Pipeline
要使用 Drone 只需在专案根建立一个 .drone.yml 档案即可,这个是 Drone 构建指令码的配置档案,它随专案一块进行版本管理,开发者不需要额外再去维护一个配置指令码。其实现代 CI 程式都是这幺做了, 包括 gitlab-ci, jenkinsfile, tekton等。
7 . Drone的场景使用
1) 启动新build
支援选择git 分支, 以及设定启动引数, 这个功能在大部分构建平台都有体现
2) 同步-SYNC
点选 SYNC 按钮,就会和程式码仓库进行同步,如果有仓库删除或者增加,就会同步进行更新
3) 定时触发器-Cron jobs
几乎所有的构建平台都会提供类似的触发器,比如 git web hook, 时间定时器等
4) 加密引数 - Secrets
流水线执行过程中会涉及很多和服务互动,所以需要提供各种凭证,比如密码,token 等,所以Secrets也是流水线中的一个重要元素。
5) 版本部署/回滚 -Promote/Rollback
仅仅完成製品的构建是远远不够的,Drone也考虑到了部署和回滚的问题,所以提供了promote/rollbakc事件, 针对 某个成功版本进行部署或者回滚,和条件判断when一起使用。
6)步骤间顺序依赖- 有向无环图
Drone 通过 **kind:pipeline **对步骤进行组织,支援并行流水线,同时通过 **depends_on **对流水线的先后顺序进行限制, 如图所示。
7 )上下游流水线间呼叫
参考
- drone pipeline - https://docs.drone.io/pipeline/overview/
- drone 流水线配置 - https://docs.drone.io/pipeline/docker/syntax/
- drone yaml元素 - https://docs.drone.io/yaml/docker/
总结
- Drone与程式码管理平台(e.g. gitlab, gogs)是强繫结关係,如果程式码管理平台不能访问,Drone就无法登入,这个在Drone-Server的启动命令就可以看出来。
- Drone 学习成本低,语法简洁,如果你接触过其他构建平台,特别是云原生的,基于YAML进行编排的CI引擎,都是类似的。
- Drone是GitOps实践额典型工具,通过和程式码仓库进行深度融合,做到了随时提交,随时构建,很多能力都是通过容器外挂实现,这也是有别于传统构建系统的重要特点
- 从能力上,Drone本身就是轻量级的, 所以相对比较单一,可能无法满足複杂的业务场景。目前Drone已经被收购,成为harness**平台的重要一部分, **在该平台上也可以看到Drone的身影。
Harness CDaaS平台为应用程式交付提供了一种更加无缝的方法,该方法可以自动检测GitHub,Bamboo,Jenkins,Artifactory或Nexus储存库或任何Git储存库中的新版本。一旦DevOps团队收到警报,他们可以使用图形工具不仅使用YAML档案自动化构建管道的过程,还可以利用机器学习演算法评估部署的质量,然后在必要时通过从工具访问资料自动回滚例如AppDynamics,New Relic,Splunk,Elastic Search和Sumologic,并新增了Habib。