作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠。
介绍
Drone是一个用Go编写的开源容器原生 CI/CD 平台。它适用于用 YAML、JSON、JSONNet或Starlark编写的配置文件,这些文件定义了由多个步骤组成的多个构建管道。
Drone 与多个源代码管理器集成。目前支持三种不同的 SCM:GitHub(云/企业)、BitBucket(云/服务器)和Gitea。一般来说,每个提供商都支持所有 Drone 功能。
Drone 还支持不同的 runner 来执行作业。这些运行器不可互换(除了最简单的管道),因为它们的配置格式、功能和执行环境不同。以下是您的选择的简要摘要:
- 首先,有两个基于容器的运行程序:
- Docker Runner是最稳定和最常用的 runner。它在新容器中执行每个构建步骤。
- Kubernetes runner是一个更新的(但仍然是实验性的)选项。它的语法与 Docker runner 相似,并且可以与DigitalOcean Kubernetes集成。
- 其次,有两个运行器可以直接运行命令,而不会在构建或存储库之间进行隔离:
- 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)上的选项。
先决条件
在开始本教程之前,您需要:
- 一台 Ubuntu 20.04 服务器,至少有 1GB 的 RAM、2GB 的可用磁盘空间和一个具有
sudo
特权的非 root 用户。您可以按照我们的初始服务器设置来配置您的机器。
注意:本教程将选择性地配置 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_key
和your_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 ID和Client Secret。将这两个值复制到安全的地方;无论您在哪里看到your_github_client_id
和 ,您都需要在以下步骤中使用它们your_github_client_secret
。
现在您的应用程序已在 GitHub 上注册,您已准备好配置 Drone。
第 2 步 – 创建无人机配置
现在开始准备您的 Docker 配置,这将构建您的 Drone 服务器。首先,生成一个共享密钥以使用主 Drone 实例对跑步者进行身份验证。使用以下openssl
命令创建一个:
- openssl rand -hex 16
openssl
将生成一个随机的 16 位十六进制数。它将产生如下输出:
Output918...46c74b143a1719594d010ad24
将您自己的输出复制到剪贴板。您将把它添加到下一个命令中,它将替换your_rpc_secret
.
现在创建您的 Drone 配置文件。我们将利用该tee
命令,而不是不断打开和关闭此配置文件,该命令会将您的命令输出拆分到您的控制台,同时还将其附加到 Drone 的配置文件中。本教程中的每个命令块后面都会有说明,但您可以在他们的官方文档中找到所有可用 Drone 选项的详细说明。
现在开始构建您的 Drone 服务器的配置。将以下命令复制到您的终端。请务必替换drone.your_domain
为您的域。还用您的 GitHub OAuth 凭据替换your_github_client_id
和your_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
这个命令使用了一个heredoc。Heredoc 使用<<
重定向操作符后跟任意单词,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
您的配置文件将类似于以下内容,具体取决于您选择的选项:
OutputDRONE_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
你会看到这样的输出:
OutputStatus: 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_domain
和your_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
你会看到这样的输出:
Outputtime="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
Outpute5cd27400...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
,并添加以下内容:
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 的基础知识。