如何在 Ubuntu 20.04 上安装和配置 Drone

作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠

介绍

Drone是一个用Go编写的开源容器原生 CI/CD 平台它适用于用 YAML、JSON、JSONNetStarlark编写的配置文件,这些文件定义了由多个步骤组成的多个构建管道。

Drone 与多个源代码管理器集成。目前支持三种不同的 SCM:GitHub(云/企业)、BitBucket(云/服务器)和Gitea一般来说,每个提供商都支持所有 Drone 功能。

Drone 还支持不同的 runner 来执行作业这些运行器不可互换(除了最简单的管道),因为它们的配置格式、功能和执行环境不同。以下是您的选择的简要摘要:

  • 首先,有两个基于容器的运行程序:

  • 其次,有两个运行器可以直接运行命令,而不会在构建或存储库之间进行隔离:

    • Exec runner直接在主机上执行命令。此运行程序不提供构建之间的隔离,并且应仅用于不适合在 Docker 中运行的受信任存储库(请注意,在使用此选项之前,您可能需要考虑使用特权 Docker 容器)。
    • SSH运行器类似于 Exec,但它在与运行运行器的主机不同的主机上通过 SSH 运行命令。
  • 第三,有两个运行器在基于云的虚拟机中执行构建步骤。这些适用于需要直接在主机上运行但仍彼此隔离的工作负载:

    • DigitalOcean runner为每个构建创建一个新的 Droplet 并在其中运行命令。请注意,如果您只需要缩放功能,您仍然可以使用 Docker 运行器,但启用了自动缩放器(稍后会详细介绍)。
    • MacStadium runner允许您在云中的 macOS 机器上执行构建。此选项仅对专门的工作负载有用。

在本教程中,您将为GitHub 上的源代码设置一个 Drone CI/CD 服务器,添加一个 Docker 运行器,使用Let’s Encrypt来保护您的实例,然后创建一个 YAML 管道。您还将遇到使用 Drone Autoscaler 扩展您的跑步者并将您的日志存储在 S3 兼容服务器(例如 DigitalOcean Spaces)上的选项。

先决条件

在开始本教程之前,您需要:

注意:本教程将选择性地配置 Drone 以将其Autoscaler 功能与 DigitalOcean一起使用,这将根据需要自动扩展您的 Droplet 数量。如果您选择此路线,请确保您的帐户保持在您的限额内。在 DigitalOcean 上,大多数用户的默认限制是 5 个 Droplets,但您可以联系支持人员并请求增加。为此,请访问您帐户的 Cloud Dashboard 并在左侧菜单中找到ACCOUNT将出现一个子菜单;单击设置将打开一个页面,显示您的帐户用户名和Member since日期。在此日期下方,您将看到一条类似. 单击“增加”以提交对更多 Droplet 的请求。Droplet Limit:5 Increase

此外,本教程中描述的 Autoscaler 路径将需要来自 DigitalOcean 的个人访问令牌。如果您选择安装 Autoscaler,您可以按照本教程从 DigitalOcean 控制面板检索令牌离开页面前复制这个键;一旦您离开或刷新页面,它就会消失,您需要在步骤 6 中输入它。

最后,如果您选择不安装 Drone 的 Autoscaler 功能,您至少需要另外 2GB 的 RAM 和 10GB 的可用磁盘空间,以确保您可以运行管道。

  • 具有可用 A 记录的域(或子域)指向您服务器的 IP。如果您在 DigitalOcean 上管理您的 DNS,那么您可以按照本指南将您的 IP 与您的域相关联本教程将使用drone.your_domain.
  • 在您的服务器上设置 Docker。有关说明,您可以按照本教程了解如何在 Ubuntu 20.04 上安装和使用 Docker
  • 您将遇到将日志存储在 DigitalOcean Spaces 上的选项。要执行此步骤,您需要将 DigitalOcean Space 添加到您的帐户,并且您还需要生成Spaces Access Key将您的访问密钥和秘密复制到安全的地方。一旦您离开或刷新此页面,您的 Secret 就会消失,您需要在看到的任何位置输入your_s3_access_keyyour_s3_secret_key或者,您可以使用不同的 S3 兼容服务,或完全跳过此步骤(第 3 步)。请注意,仅当您正在试用 Drone 或者您知道您的构建量将非常低时,才建议跳过此步骤。
  • 一个GitHub帐户。

第 1 步 – 创建 GitHub 应用程序

要访问代码、验证用户身份并添加 webhook 以接收事件,Drone 需要一个适用于 GitHub 的 OAuth 应用程序。对于其他提供商,您可以在此处阅读 Drone 的官方文档

要为 GitHub 设置 OAuth 应用程序,请登录到您的 GitHub 帐户,然后单击右上角的用户菜单。单击Settings,然后在左侧菜单中找到Developer Settings类别,然后单击OAuth Applications或者,您可以直接导航到Github 的开发人员设置页面

接下来,创建一个新应用程序。单击右上角的“新建 OAuth 应用程序”按钮,将出现一个空白表单。

示例表格

使用Drone你的应用程序名称。替换drone.your_domain为您自己的域,添加对您的应用的简要说明,然后drone.your_domain/login为您的授权回调 URL添加

单击注册应用程序,您将看到一个仪表板,其中包含有关您的应用程序的信息。此处包括您的应用程序的Client IDClient Secret将这两个值复制到安全的地方;无论您在哪里看到your_github_client_id和 ,您都需要在以下步骤中使用它们your_github_client_secret

现在您的应用程序已在 GitHub 上注册,您已准备好配置 Drone。

第 2 步 – 创建无人机配置

现在开始准备您的 Docker 配置,这将构建您的 Drone 服务器。首先,生成一个共享密钥以使用主 Drone 实例对跑步者进行身份验证。使用以下openssl命令创建一个

  • openssl rand -hex 16

openssl将生成一个随机的 16 位十六进制数。它将产生如下输出:

Output
918...46c74b143a1719594d010ad24

将您自己的输出复制到剪贴板。您将把它添加到下一个命令中,它将替换your_rpc_secret.

现在创建您的 Drone 配置文件。我们将利用该tee命令,而不是不断打开和关闭此配置文件,该命令会将您的命令输出拆分到您的控制台,同时还将其附加到 Drone 的配置文件中。本教程中的每个命令块后面都会有说明,但您可以在他们的官方文档中找到所有可用 Drone 选项的详细说明

现在开始构建您的 Drone 服务器的配置。将以下命令复制到您的终端。请务必替换drone.your_domain为您的域。用您的 GitHub OAuth 凭据替换your_github_client_idyour_github_client_secret,然后用your_rpc_secret您的openssl命令的输出替换最后,替换sammy_the_shark为您的 GitHub 用户名。这将授予您管理权限

  • cat << 'EOF' | sudo tee /etc/drone
  • DRONE_SERVER_HOST=drone.your_domain
  • DRONE_SERVER_PROTO=https
  • DRONE_GITHUB_CLIENT_ID=your_github_client_id
  • DRONE_GITHUB_CLIENT_SECRET=your_github_client_secret
  • DRONE_RPC_SECRET=your_rpc_secret
  • DRONE_USER_CREATE=username:sammy_the_shark,admin:true
  • EOF

这个命令使用了一个heredocHeredoc 使用<<重定向操作符后跟任意单词,EOF通常用于表示文件结束。它允许用户编写多行输入,以EOF用户选择的单词或任何单词结尾文件结尾周围的引号影响文本在变量替换方面的解析方式,类似于它们如何处理文字。这是一个非常有用的工具,在这种情况下,您将使用它来创建一个文件,然后向其中添加行。在这里,您将添加第一个 Drone 配置并以EOF. 然后将此输入重定向到cat命令,然后命令的输出通过cat管道传输到tee命令|管道操作员。Heredocs 是一种快速创建文本或将文本附加到文件的好方法。

接下来,为了防止任意用户登录您的 Drone 服务器并访问您的跑步者,请将注册限制为指定的用户名或组织。如果此时需要添加用户,请运行以下命令,替换users为逗号分隔的 GitHub 用户名或组织名称列表:

  • echo 'DRONE_USER_FILTER=users' | sudo tee -a /etc/drone

如果您没有使用外部负载均衡器或 SSL 代理,您还需要为 HTTPS 启用 Let’s Encrypt:

  • echo 'DRONE_TLS_AUTOCERT=true' | sudo tee -a /etc/drone

您会注意到您的tee命令现在包含-a开关,该开关指示tee将此输出附加而不是覆盖到您的 Drone 配置文件中。现在让我们设置您的日志存储系统。

第 3 步 – 在外部存储构建日志(可选)

对于频繁使用的安装,构建日志的数量会迅速增加到数 GB。默认情况下,这些日志存储在服务器的数据库中,但为了性能、可扩展性和稳定性,请考虑为构建日志设置外部存储。在这一步中,您将使用 DigitalOcean Spaces 来做到这一点。欢迎您修改这些步骤并使用另一个与 S3 兼容的存储服务,如果您仍在对 CI/CD 工作流程进行原型设计,或者如果您知道您的构建量将非常低,则完全不使用。在这些情况下,您现在可以继续执行步骤 4。

要将您的日志存储在 DigitalOcean Spaces 上,请确保您已完成必要的先决条件并已设置 Spaces 存储桶并生成匹配的Spaces Access Key 和 Secret将该密钥复制到剪贴板,然后使用以下命令更新配置文件:

  • cat << 'EOF' | sudo tee -a /etc/drone
  • DRONE_S3_ENDPOINT=your_s3_endpoint
  • DRONE_S3_BUCKET=your_s3_bucket_name
  • AWS_ACCESS_KEY_ID=your_s3_access_key
  • AWS_SECRET_ACCESS_KEY=your_s3_secret_key
  • EOF

请记住your_s3_endpoint用您的空间的 URL、您your_s3_bucket_name创建的空间的名称、your_s3_access_key您的访问密钥和your_s3_secret_key您的秘密替换。您可以通过单击“管理”菜单按钮,然后单击“空间”,然后选择您的新空间在“控制面板”中找到前两个值您可以通过单击“帐户”菜单按钮,然后单击API按钮,然后向下滚动直到找到“空间”部分来检索您的空间访问密钥如果您放错了密钥,则需要生成新的访问密钥/密钥对。

您的 Drone 配置文件现已完成。运行cat命令查看:

  • cat /etc/drone

您的配置文件将类似于以下内容,具体取决于您选择的选项:

Output
DRONE_SERVER_HOST=drone.your_domain DRONE_SERVER_PROTO=https DRONE_GITHUB_CLIENT_ID=your_github_client_id DRONE_GITHUB_CLIENT_SECRET=your_github_client_secret DRONE_RPC_SECRET=your_rpc_secret DRONE_USER_CREATE=username:sammy_the_shark,admin:true DRONE_USER_FILTER=the_shark_org DRONE_TLS_AUTOCERT=true DRONE_S3_ENDPOINT=your_s3_endpoint DRONE_S3_BUCKET=your_s3_bucket AWS_ACCESS_KEY_ID=your_s3_access_key AWS_SECRET_ACCESS_KEY=your_s3_secret_key

一旦您确认您的配置文件已完成,您就可以启动您的 Drone 服务器。

第 4 步 — 安装和启动无人机

正确配置到位后,下一步是安装和启动 Drone。

首先,拉取 Drone Server Docker 镜像:

  • docker pull drone/drone:1

接下来,创建一个卷来存储SQLite数据库:

  • docker volume create drone-data

最后,启动服务器,将其设置为重新启动开机,并转发端口80,并443给它:

  • docker run --name=drone --detach --restart=always --env-file=/etc/drone --volume=drone-data --publish=80:80 --publish=443:443 drone/drone:1

如果您遵循了 DigitalOcean 初始服务器设置指南,那么您将启用ufw并且仅允许OpenSSH通过您的防火墙。您现在需要打开端口 80 和 443:

  • sudo ufw allow 80
  • sudo ufw allow 443

现在重新加载ufw并检查您的规则是否已更新:

  • sudo ufw reload
  • sudo ufw status

你会看到这样的输出:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)

此时,您将能够访问您的服务器、登录并管理您的存储库。转到,输入您的 GitHub 凭据,并在出现提示时授权您的新应用程序。https://drone.your_domain

截屏

您的 Drone 服务器现已上线,几乎可以使用了。剩下的就是配置你的 Drone runner 和/或 DigitalOcean Autoscaler。

步骤 5 — 选项 1:安装 Docker Runner

在您的服务器可以执行作业之前,您需要设置一个运行器。

如果您想使用 DigitalOcean Droplets 自动缩放跑步者,请跳至选项 2:为 DigitalOcean 安装 Drone Autoscaler如果你想使用另一个运行器,你可以设置它并跳到第 7 步。否则,按照选项 1安装 Docker 运行器。

选项 1:安装 Docker Runner

首先,为运行程序拉取 Docker 镜像:

  • docker pull drone/drone-runner-docker:1

接下来,启动跑步者。用你的个人价值观代替drone.your_domainyour_rpc_secret您可以更改DRONE_RUNNER_CAPACITY以增加将一次执行的管道数量,但请注意您的可用系统资源:

  • docker run --name drone-runner --detach --restart=always --volume=/var/run/docker.sock:/var/run/docker.sock -e DRONE_RPC_PROTO=https -e DRONE_RPC_HOST=drone.your_domain -e DRONE_RPC_SECRET=your_rpc_secret -e DRONE_RUNNER_CAPACITY=1 -e DRONE_RUNNER_NAME=${HOSTNAME} drone/drone-runner-docker:1

最后,确保 runner 成功启动:

  • docker logs drone-runner

你会看到这样的输出:

Output
time="2020-06-13T17:58:33-04:00" level=info msg="starting the server" addr=":3000" time="2020-06-13T17:58:33-04:00" level=info msg="successfully pinged the remote server" time="2020-06-13T17:58:33-04:00" level=info msg="polling the remote server" arch=amd64 capacity=1 endpoint="https://drone.your_domain" kind=pipeline os=linux type=docker

如果您需要更改运行器配置或机密,请使用 删除容器docker rm drone-runner,然后重复此步骤。您现在可以继续执行步骤 7 并创建一个基本管道。

选项 2:为 DigitalOcean 安装 Drone Autoscaler

用于 DigitalOcean 的 Drone Autoscaler 可以根据需要使用 Docker 运行器自动创建和销毁 Droplet。

首先,转到您的 Drone 服务器,登录,然后单击用户菜单中的用户设置查找并复制您的个人令牌这是your_drone_personal_token

用户设置

接下来,使用以下命令生成一个新字符串:

  • openssl rand -hex 16
Output
e5cd27400...92b684526c622

复制您在第 2 步中所做的输出。这个新输出是您的drone_user_token.

现在使用这些新凭据添加一个新机器用户:

  • docker run --rm -it -e DRONE_SERVER=https://drone.your_domain -e DRONE_TOKEN=your_drone_personal_token --rm drone/cli:1 user add autoscaler --machine --admin --token=drone_user_token

现在,如果您还没有,您需要创建一个具有读/写权限DigitalOcean API 令牌我们将其称为your_do_token. 如果您没有在先决条件部分完成此步骤,那么您现在可以使用本指南创建一个保持这个令牌非常安全;它授予对您帐户上所有资源的完全访问权限。

最后,您可以启动 Drone Autoscaler。确保使用您自己的匹配凭据替换所有突出显示的变量:

  • docker volume create drone-autoscaler-data
  • docker run --name=drone-autoscaler --detach --restart=always --volume=drone-autoscaler-data -e DRONE_SERVER_PROTO=https -e DRONE_SERVER_HOST=drone.your_domain -e DRONE_SERVER_TOKEN=drone_user_token -e DRONE_AGENT_TOKEN=your_rpc_secret -e DRONE_POOL_MIN=0 -e DRONE_POOL_MAX=2 -e DRONE_DIGITALOCEAN_TOKEN=your_do_token -e DRONE_DIGITALOCEAN_REGION=nyc1 -e DRONE_DIGITALOCEAN_SIZE=s-2vcpu-4gb -e DRONE_DIGITALOCEAN_TAGS=drone-autoscaler,drone-agent drone/autoscaler

您还可以配置要创建的 Droplet 的最小/最大数量以及 Droplet 的类型/区域。要加快构建开始时间,请将最小值设置为 1 或更多。另外,请注意,默认情况下,自动缩放器将每分钟确定是否需要创建或销毁新的 Droplet,并且 Droplets 在创建后将运行至少 1 小时,然后在不活动时自动销毁。

然后,验证自动缩放器是否正确启动:

  • docker logs drone-autoscaler

如果您决定不再使用自动缩放器,请使用 删除容器docker rm drone-autoscaler,从您的帐户中删除剩余的 Droplet(如果有),并撤销 DigitalOcean API 令牌。您现在已准备好测试新的 CI/CD 工作流程。

第 6 步 – 创建 YAML 管道

为了测试您的新 Drone 安装,让我们创建一个 YAML 管道。

首先,在 GitHub 上创建一个新存储库。从您的 GitHub 个人资料页面单击存储库菜单,然后单击右上角的绿色新建按钮。在下一页上为您的存储库命名,然后单击绿色的创建存储库按钮。现在导航到您的 Drone 服务器,按SYNC,刷新页面,您新创建的存储库应该会出现。旁边激活按钮。

截屏

之后,在您的存储库中创建一个名为.drone.yml. 您可以使用 GitHub 的 UI 或从命令行使用git. 在 GitHub UI 中,单击存储库菜单,然后单击您的新存储库,然后单击添加文件下拉菜单。选择Create new file,命名文件.drone.yaml,并添加以下内容:

.drone.yml
name: drone-test
kind: pipeline
type: docker

steps:
- name: test
  image: alpine
  commands:
  - echo "It worked!"

如果您使用的是 GitHub UI,请按页面底部的绿色Commit new file按钮。如果您使用命令行,则提交并推送您的更改。无论哪种情况,现在都可以在浏览器中打开并观看您的 Drone 仪表板。

如果构建仍然挂起且未启动,请确保您的运行器设置正确(如果使用自动缩放器,则创建了一个 Droplet)。您可以使用 来查看运行器的日志docker logs drone-runner和自动缩放器的日志docker logs drone-autoscaler

如果您使用的是自动缩放程序,则初始构建可能需要长达一分钟的时间才能开始(在此期间的最后一条日志消息为starting the server)。

构建完成后,您将It worked!在日志test中看到drone-test管道阶段的文本如果日志加载失败,请确保您的 S3 凭证和存储桶名称正确。您可以使用docker logs drone来查看 Drone 的日志以获取更多信息。

截屏

您现在已经设置并安装了一个 Drone 服务器来处理您的 CI/CD 工作流。

结论

在本教程中,您将设置 Drone CI/CD 服务器以用于您的 GitHub 项目,并可选择为构建日志设置外部存储。您还可以设置一个本地运行器或服务以使用 DigitalOcean Droplets 自动扩展它们。

您可以使用步骤 2 中概述的过程继续向 Drone 添加队友和其他授权用户。 如果您想阻止任何新用户注册,请运行以下命令:

  • echo 'DRONE_REGISTRATION_CLOSED=true' | sudo tee -a /etc/drone
  • docker restart drone

无人机是一个非常有能力的工具。从这里开始,您可能会考虑更多地了解他们的管道语法和 Drone 的其他功能,或者查看 Docker 的基础知识

觉得文章有用?

点个广告表达一下你的爱意吧 !😁