使用 Drone 为家庭实验室或办公室设置简单、自托管且快速的 CI/CD 解决方案
过去几年,持续集成和持续交付一直是 DevOps 领域非常热门的话题。随着越来越多的组织努力改进其测试和发布流程,我们观察到这个生态系统中出现了许多新工具。所有主流云提供商都在提供各自的自动化系统(有些非常不成功),因此选择适合您用例的正确系统变得非常困难。
有相当多的服务(Travis、CircleCI、Google Cloud Builder)和自托管解决方案可用于构建、测试和部署您的代码,但实际上,其中一些是免费的、开源的和自托管的。
最知名的 CI/CD 工具是 Jenkins 和 GitLab CI(我最近在dev.to 上发帖问过这个问题)。然而,Jenkins 占用大量内存,因为它运行在 Tomcat(Java)上,并且工作流是在 Jenkins 内部定义的,而不是在用于运行这些测试/构建作业的仓库中定义的。
至于 GitLab CI,它很棒,但需要你运行自己的 GitLab(规模庞大)或登录 gitlab.com(虽然现在你可以将 Github 仓库镜像到 GitLab 以自动启动构建,但这会增加复杂性)。不过,你可以独立运行自己的运行器,它们似乎相当可靠。我正在协助进行后端开发的一家组织正在使用 Gitlab CI,并取得了巨大的成功,但正如我之前提到的,商业定价和服务器运行成本可能相当高昂。
免责声明:几年前我尝试过使用 Drone,但并不满意。不确定是产品本身的问题还是文档的问题,但我没能实现我想要的效果。这次的情况似乎大不相同。产品稳定,文档完善,一些非常好的示例文件就放在它们自己的
.drone.yml
文件中:https://github.com/drone/drone/blob/master/.drone.yml。构建速度快,可靠性高。
无人机
我研究过很多替代方案,最终决定至少对我来说,目前最好的 CI/CD 解决方案是Drone。它是一个用 Go 编写的开源、轻量级应用程序,可以作为 SaaS 或自托管服务器使用。Drone 由两部分组成:
- 服务器负责身份验证、存储库配置、用户、机密和接受 webhook。
- 代理正在接收构建作业并实际运行您的工作流程。
服务器和代理都是极轻量级的服务,仅占用约 10-15MB 的内存。这意味着你甚至感觉不到它在笔记本电脑、台式机甚至树莓派上运行。
我的设置
我在 Raspberry PI 上运行 Drone 服务器,而代理则在我的桌面本地运行,我的桌面拥有大量 RAM 和 16 个 CPU 核心。这意味着构建速度比任何免费的公共服务都要快得多。更重要的是,由于代理是通过 Webhook Relay 隧道连接到服务器的,我可以将它们部署在 Kubernetes、备用笔记本电脑或其他任何运行的机器上:
如此配置的好处:
- 无需配置 NAT,无人机服务器几乎不使用任何资源,因此它可以在廉价的硬件上运行(因此 Raspberry Pi 具有许多其他服务)。
- 代理程序彼此解耦,可在您的家庭/办公室计算机上运行。通过隧道连接,无论代理程序部署在何处(外部云提供商或内部办公室),其配置均保持不变。
未来的计划包括将无人机服务器从 Raspberry Pi 过渡到 Intel NUC(或其他低功耗替代品),并在同一服务器上运行一些额外的无人机代理。
准备配置
初始配置非常简单。首先,我们在 Webhook Relay 上创建一个隧道来获取我们的公共子域名。然后,我们使用该子域名创建一个 Github OAuth 应用。
一旦服务器和隧道守护进程运行,您就可以轻松连接/断开无人机代理。
为 Github 和远程访问设置隧道
我喜欢内部测试,因此我们在整个堆栈(CI/CD、监控仪表盘以及其他各种自动化功能)中使用自己的隧道。在这种情况下,Webhook 中继隧道提供了两个最重要的功能:
- 无论无人机服务器位于何处(在您的笔记本电脑、台式机或某些 Raspberry Pi 上),都可以访问它,无需配置防火墙或路由器即可获得远程访问。
- Github 的 Webhooks 将触发工作流程。
前往你的隧道页面并创建一个新的隧道。如果你使用的是免费套餐,则会生成一个子域名,没问题。
这里:
- 隧道名称可以随意设置,但必须与 docker-compose.yaml 中 webhookrelayd 容器的设置一致。它的作用类似于过滤器。
- subdomain是您在 下的公共子域名
*.webrelay.io
。如果您使用的是免费套餐,它将自动生成。 - destination是 drone-server 容器的地址。由于 docker-compose 配置了虚拟网络,因此它必须与 docker-compose.yaml 中的服务名称匹配。
- 所有付费方案均支持加密类型,主要支持 HTTP/TLS。我建议订阅以获取加密!否则,请给我发消息,我可以设置免费试用。
配置 Github OAuth 应用程序
在本指南中,我们将使用 Github 设置 Drone。您可以参考官方文档。简而言之:
创建一个 GitHub OAuth 应用程序。Consumer Key 和 Consumer Secret 用于授权访问 Github 资源。授权回调 URL 必须符合以下格式和路径,并且必须使用与您指定的服务器方案和主机名完全相同的地址。因此,如果您的 Webhook Relay 隧道地址为 ,my-drone-subdomain.webrelay.io
则授权回调 URL 应为https://my-drone-subdomain.webrelay.io/login
。
部署无人机服务器和代理
我最初开始使用 Drone,服务器和代理都运行在桌面上,因为这只是我个人使用,效果还不错。后来,我把服务器拆下来,搬到了树莓派上。
一体化配置如下所示:
version: '3'
services:
drone-server:
container_name: drone-server
image: drone/drone:1.0.1
volumes:
- db-data:/var/lib/drone/
restart: always
environment:
# - DRONE_OPEN=false
- DRONE_SERVER_HOST=my-drone-subdomain.webrelay.io # tunnel hostname
- DRONE_GITHUB_SERVER=https://github.com
- DRONE_ADMIN=<your username>
- DRONE_GITHUB_CLIENT_ID=<github-client-id>
- DRONE_GITHUB_CLIENT_SECRET=<github-client-secret>
- DRONE_SERVER_PROTO=http # tunnel adds https on top
- DRONE_RPC_SECRET=<shared secret>
- DRONE_USER_CREATE=username:<your github username>,admin:true
- DRONE_AGENTS_ENABLED=true
drone-agent:
container_name: drone-agent
image: drone/agent:1.0.1
command: agent
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_SERVER=https://my-drone-subdomain.webrelay.io
- DRONE_RPC_SECRET=<shared secret>
- DRONE_RUNNER_CAPACITY=8
- DRONE_RUNNER_NAME="local"
webhookrelay:
container_name: drone-webhookrelay
image: webhookrelay/webhookrelayd:latest
command:
- --mode
- tunnel
- -t
- drone
restart: always
depends_on:
- drone-server
environment:
- KEY=<whr-key>
- SECRET=<whr-secret>
volumes:
db-data:
如果您需要在不同的机器上使用另一个代理,则仅代理配置:
version: '3'
services:
drone-agent:
container_name: drone-agent
image: drone/agent:1.0.0-rc.5
command: agent
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_SERVER=https://my-drone-subdomain.webrelay.io
- DRONE_RPC_SECRET=<shared secret>
- DRONE_RUNNER_CAPACITY=8
- DRONE_RUNNER_NAME="local"
完成配置后:
docker-compose up
它会要求您使用 Github 凭证进行身份验证。
使用无人机管道
Drone 最棒的地方之一就是它的流水线配置。似乎在 Drone 引领潮流之后,业界也纷纷效仿,现在大多数 CI/CD 服务都通过 Docker 容器来实现流水线。这意味着你的构建和测试与物理主机解耦,并且清理工作也由设计决定。以下是一个流水线示例:
- 构建
- 单元测试
- 使用 Postgres 数据库运行端到端测试
- 向 Slack 发送 webhook
- 构建镜像并将其推送到 DockerHub
看起来像这样:
kind: pipeline
name: default
workspace:
base: /go
path: src/github.com/webhookrelay/app
steps:
- name: build
image: golang:1.11.4
commands:
- cd cmd/app && go build
- name: unit-test
image: golang:1.11.4
commands:
- go test -v `go list ./... `
- name: end-to-end
image: golang:1.11.4
environment:
POSTGRES_HOST: database
POSTGRES_USER: pguser
POSTGRES_PASSWORD: pgpass
POSTGRES_DB: pgdb
commands:
- make install-transponder
- make e2e
- name: slack
image: plugins/slack
settings:
webhook:
from_secret: slack_url
channel: general
username: drone
icon_url: https://i.pinimg.com/originals/51/29/a4/5129a48ddad9e8408d2757dd10eb836f.jpg
- name: docker
image: plugins/docker
settings:
repo: namespace/repo
auto_tag: true
username:
from_secret: docker_username
password:
from_secret: docker_password
services:
- name: database
image: postgres
environment:
POSTGRES_USER: pguser
POSTGRES_PASSWORD: pgpass
POSTGRES_DB: pgdb
通过始终使用容器运行管道,您将使构建和测试真正具有可移植性。每当您推送到 Github 时,Webhook 都会触发 Drone 并启动构建:
技巧和窍门
我还想分享一些非常有用的命令。要安装drone
CLI,请按照官方文档进行操作。
直接执行管道
您还可以使用 Drone CLI 直接运行管道:
drone exec --secret-file drone_secrets.yaml .drone.yml
无人机机密模板:
通过 CLI 添加机密
您可以通过 Web UI 添加机密,也可以drone
直接从终端使用:
drone secret add -repository username/repository-name --name foo --data bar --allow-pull-request
总结
我广泛使用过 Jenkins、Gitlab Runner、CircleCI 和 Google Cloud Builder。我想我仍然很喜欢 Cloud Builder 的 GKE 相关功能,因为它可以快速构建镜像,并且无需任何额外工作即可向 GCR 注册表进行身份验证。然而,你会被它们的流水线配置文件困住,无法迁移到其他供应商。至于 Jenkins,很难想象在小型服务器上高效运行它。至少对我来说,Drone 是一个理想的现代服务范例,它专注于效率并做好一件事。
因此,总结一下无人机的主要优点:
- 设置非常简单
- 它开箱即用地使用 SQLite 作为数据库,但您也可以使用 Postgres 或 Mysql。
- 可以在任何地方运行的轻量级代理
- 可作为自托管解决方案或 SaaS 使用
- 管道定义为代码
- 仅使用 drone CLI 在本地运行管道
- 与 Github、Gitlab、Bitbucket 集成
最初发表于Webhook Relay 博客
文章来源:https://dev.to/webhookrelay/setting-up-simple-self-hosted--fast-cicd-solution-with-drone-for-homelab-or-office-1fnd