使

使用 Drone 为家庭实验室或办公室设置简单、自托管且快速的 CI/CD 解决方案

2025-05-28

使用 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、备用笔记本电脑或其他任何运行的机器上:

RPI 上的无人机服务器

如此配置的好处:

  • 无需配置 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:


Enter fullscreen mode Exit fullscreen mode

如果您需要在不同的机器上使用另一个代理,则仅代理配置:



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"


Enter fullscreen mode Exit fullscreen mode

完成配置后:



docker-compose up


Enter fullscreen mode Exit fullscreen mode

它会要求您使用 Github 凭证进行身份验证。

使用无人机管道

Drone 最棒的地方之一就是它的流水线配置。似乎在 Drone 引领潮流之后,业界也纷纷效仿,现在大多数 CI/CD 服务都通过 Docker 容器来实现流水线。这意味着你的构建和测试与物理主机解耦,并且清理工作也由设计决定。以下是一个流水线示例:

  1. 构建
  2. 单元测试
  3. 使用 Postgres 数据库运行端到端测试
  4. 向 Slack 发送 webhook
  5. 构建镜像并将其推送到 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


Enter fullscreen mode Exit fullscreen mode

通过始终使用容器运行管道,您将使构建和测试真正具有可移植性。每当您推送到 Github 时,Webhook 都会触发 Drone 并启动构建:

无人机管道

技巧和窍门

我还想分享一些非常有用的命令。要安装droneCLI,请按照官方文档进行操作。

直接执行管道

您还可以使用 Drone CLI 直接运行管道:



drone exec --secret-file drone_secrets.yaml .drone.yml


Enter fullscreen mode Exit fullscreen mode

无人机机密模板:



slack_url: https://hooks.slack.com/services/xxxxxxxxxxxx

Enter fullscreen mode Exit fullscreen mode




通过 CLI 添加机密

您可以通过 Web UI 添加机密,也可以drone直接从终端使用:



drone secret add -repository username/repository-name --name foo --data bar --allow-pull-request

Enter fullscreen mode Exit fullscreen mode




总结

我广泛使用过 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
PREV
图标库 20 个最佳/最大的图标库。名词项目
NEXT
35 个 CSS 菜单(+ 动画)🚀 2 真正的汉堡菜单