没事逛 Github 的时候,首页老是推荐些使用脚本签到的项目,无聊之下点开后翻了翻源码,确定没有风险以及 ref code 之后,尝试了下自动签到还挺不错。
无聊过后又去签到的网站 v2ex 上翻到一篇帖子,关于 Github Actions 云云,有人回复道可以使用 Github + Drone 来执行任务,因吹斯汀~
所谓 CI/CD
作为一名非专业人士,虽然使用过但仍不知所谓,当然少不了的 Google:
- Continuous Integration 持续集成。额,好像是一种软件工程的流程。。。
- Continuous D-
- Delivery 持续交付。一种软件工程手法?
- Deployment 持续部署。以自动化方式,将软件部署到生产环境。
OK,投降!把一堆我懂的字组合成了一些看不懂的专业名词 🙄
传统的主流 CI/CD 平台,也是绝大部分公司(待过的)至今都在使用的,当属开源的 Jenkins 了。相较于手动发布,它可以:
- 自动化构建
- 部署
- 用户权限
- 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 可以直接登录使用,但还是自己动手在本地捣鼓了下。
准备工作
首先打开官方文档,发现需要安装两个东西:server
和 runner
。
创建 OAuth 应用与密文
Drone 深度集成了多个 SCM 网站,在文档中可以看到它所支持的 Providers 列表,以最常用的 Github 为例。
转到 Settings -> Developer settings -> OAuth Apps,新建并填写网站地址、授权回调 url。重点保存其 Client ID 和 Client 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
结果体验以及碰到的问题
折腾许久之后的结果:
项目激活失败
本地安装的时候,总是提示: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…