Drone_开源的容器CI/CD服务平台

1,760 阅读5分钟

没事逛 Github 的时候,首页老是推荐些使用脚本签到的项目,无聊之下点开后翻了翻源码,确定没有风险以及 ref code 之后,尝试了下自动签到还挺不错。

无聊过后又去签到的网站 v2ex 上翻到一篇帖子,关于 Github Actions 云云,有人回复道可以使用 Github + Drone 来执行任务,因吹斯汀~

所谓 CI/CD

作为一名非专业人士,虽然使用过但仍不知所谓,当然少不了的 Google:

  • Continuous Integration 持续集成。额,好像是一种软件工程的流程。。。
  • Continuous D-
    • Delivery 持续交付。一种软件工程手法?
    • Deployment 持续部署。以自动化方式,将软件部署到生产环境。

OK,投降!把一堆我懂的字组合成了一些看不懂的专业名词 🙄

传统的主流 CI/CD 平台,也是绝大部分公司(待过的)至今都在使用的,当属开源的 Jenkins 了。相较于手动发布,它可以:

  1. 自动化构建
  2. 部署
  3. 用户权限
  4. etc...一些额外的脚本功能

一个题外话

当时公司的前端发布执行完构建流程就没有了,但是更上一级的 leader 看到某个平台带有版本回退的功能,于是要求前端发布思考一个降级方案,抓手回退,与版本形成闭环,为业务赋能。。。纯属虚构,不过闻着这味儿有种一套组合拳打过去的冲动。

大致的场景就是前端发布实现一个版本回退功能,没经验的我一脸懵逼,这不是运维干的事吗?

Anyway,不知道他们后端怎么做的,前端 leader 还是和运维讨论出了一个解决方案:保存上一次发布时的构建产物。

当时自己的提议是,直接切回到那次发布时的 commit,再构建一次就完事了。再者每次发布时都会打 tag,利用 tag 发布也可以,好像还可以发布时让 Jenkins 自动给仓库打上 tag,啧啧啧~每次大家发布忘记打 tag 了之后总少不了几个哈皮来刚。

然并卵,前端 leader 考虑到依赖版本的缘故,以及更上一级 leader 怕再次构建出来的产物不一致。。。

刚刚想到 Jenkins 可能会有类似的插件,找了会儿没找到,记录下替代方案:还是保存历史构建产物,但是存储到一个特定的位置,并且压缩成 .tar 包,以日期与版本号命名。

容器原生的 Drone

随着容器化 docker 的普及,部署也快捷了很多,大都只要一个 Dockerfile 就可以完成部署,省得搭建各种各样的依赖环境。

官方介绍:Drone is a Container-Native, Continuous Delivery Platform.
项目地址:github.com/drone/drone

其实有现成的 cloud.drone.io 可以直接登录使用,但还是自己动手在本地捣鼓了下。

提前剧透下,本地安装下来没问题,使用起来脑 kuo 儿疼 😂

准备工作

首先打开官方文档,发现需要安装两个东西:serverrunner

创建 OAuth 应用与密文

Drone 深度集成了多个 SCM 网站,在文档中可以看到它所支持的 Providers 列表,以最常用的 Github 为例。

转到 Settings -> Developer settings -> OAuth Apps,新建并填写网站地址、授权回调 url。重点保存其 Client IDClient secrets,用以配置 drone 运行时需要的环境变量。

然后新建一个密文,用以 server 和 runner 之间的通信凭证:

$ openssl rand -hex 16
bea26a2221fd8090ea38720fc445eca6

安装与配置 server

$ docker pull drone/drone:1
$ docker volume create drone-data # 数据存储
$ docker run \
    -d \
    -v drone-data:/data \
    -e DRONE_GITHUB_CLIENT_ID={{之前获取的 Client ID}} \
    -e DRONE_GITHUB_CLIENT_SECRET={{之前获取的 Client secrets}} \
    -e DRONE_RPC_SECRET={{之前获取的密文}} \
    -e DRONE_SERVER_HOST=localhost:9005 \
    -e DRONE_SERVER_PROTO=http \
    -p 9005:80 \
    -p 443:443 \ # 不需要 https 直接省略
    --name=drone \
    drone/drone:1

启动完 server 后还需要 runner 去执行构建计划 pipelines。

安装与配置 runner

可以选择 docker 环境或者本地机器环境等等。当然首选 docker。

使用 windows 电脑安装时,只支持 1809/1903 两个版本,其它不支持。下面是 linux 环境下的范例:

$ docker pull drone/drone-runner-docker:1
$ docker run \
    -d \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -e DRONE_RPC_PROTO=http \
    -e DRONE_RPC_HOST=drone \ # 注意这里不要端口号,使用之前的 server 容器名
    -e DRONE_RPC_SECRET={{之前获取的密文}} \
    -e DRONE_RUNNER_CAPACITY=2 \
    -e DRONE_RUNNER_NAME=${HOSTNAME} \
    -p 3000:3000 \
    --name drone-runner \
    drone/drone-runner-docker:1

Windows 下版本不支持的话,可以安装 Exec Runner。下载一个 drone-runner-exec 文件,重命名成 .exe,写入配置后安装成服务即可。

创建 network 连通容器之间的网络:

$ docker network create drone
$ docker network connect drone drone
$ docker network connect drone drone-runner
$ # 验证是否成功
$ docker logs drone-runner

INFO[0000] starting the server
INFO[0000] successfully pinged the remote server

构建计划文件

类似于 Github Actions 的工作流程,需要在项目根目录下创建一个 .drone.yml 文件,填写依赖环境与命令,之后每次 commit/pr 就会触发构建任务。

一个基于 node 的示例:

kind: pipeline
name: default

steps:
- name: test
  image: node
  commands:
  - yarn
  - yarn test

结果体验以及碰到的问题

折腾许久之后的结果:

Drone运行效果图

项目激活失败

本地安装的时候,总是提示:There was a problem enabling your repository. Validation Failed.

问题在于 drone 创建 webhooks 时失败,Github 不允许创建本地 localhost 类型的 webhooks,因为这样执行时是在本地,没办法定位到具体的用户主机。可以使用 ngrok 这样的工具把本地服务绑定到公网。

最快的解决办法是找台 vps 部署。

缺少用户管理界面

一访问 drone 时,直接就跳转了第三方登录授权界面,完全木有注册/登录的过程。。。

找了半天文档才有个管理员配置,还是 docker 环境变量:

DRONE_USER_CREATE=username:octocat,admin:true

创建、管理用户得通过命令行。。。不死心的我去翻了翻 drone-ui 界面源码,用 vue 写的,有几个月没更新了,issues 还有在扯皮的。。。

果然 routers 里没有用户管理相关的页面。倒是有个登录表单,可根本没有注册,文档里说好的注册默认开启呢?插件生态也没有,卒 😦

总的来说作为 CI/CD 平台其核心功能有了,生态尚需完善。

参考链接

原文链接(博客小站引流):www.ningtaostudy.cn/articles/bp…