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

没事逛 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.项目地址:https://github.com/drone/drone 其实有现成的 cloud.drone.io 可以直接登录使用,但还是自己动手在本地捣鼓了下。 提前剧透下,本地安装下来没问题,使用起来脑 kuo 儿疼 😂 准备工作 首先打开官方文档,发现需要安装两个东西: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 平台其核心功能有了,生态尚需完善。 参考链接 CI/CD 维基Drone Docs


JavaScript全屏阅读

下一篇:打酱油

上一篇:钢铁是怎样炼成的

Ctrl + Enter