如何在Ubuntu20.04上安装和配置无人机
作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。
介绍
Drone 是用 Go 编写的开源容器原生 CI/CD 平台。 它适用于以 YAML、JSON、JSONNet 或 Starlark 编写的配置文件,这些文件定义了由多个步骤组成的多个构建管道。
Drone 与多个源代码管理器集成。 目前支持三种不同的单片机:GitHub(云/企业)、BitBucket(云/服务器)和Gitea。 通常,每个提供商都支持所有 Drone 功能。
Drone 还支持 不同的运行器来执行作业。 这些运行器不可互换(除了最简单的管道),因为它们的配置格式、特性和执行环境不同。 以下是您的选项的简要摘要:
- 首先,有两个基于容器的运行器: Docker Runner 是最稳定和最常用的运行器。 它在新容器中执行每个构建步骤。 Kubernetes runner 是一个较新(但仍处于试验阶段)的选项。 它具有与 Docker 运行器类似的语法,并且可以与 DigitalOcean Kubernetes 集成。
- 其次,有两个运行程序可以直接运行命令,而无需在构建或存储库之间进行隔离: Exec 运行程序直接在主机上执行命令。 此运行程序不提供构建之间的隔离,并且只能与不适合在 Docker 中运行的受信任存储库一起使用(请注意,在使用此选项之前,您可能需要考虑使用特权 Docker 容器)。 SSH 运行程序类似于 Exec,但它通过 SSH 在与运行运行程序的主机不同的主机上运行命令。
- 第三,有两个运行器在基于云的虚拟机中执行构建步骤。 这些适用于需要直接在主机上运行但仍相互隔离的工作负载: DigitalOcean 运行器为每个构建创建一个新的 Droplet 并在其中运行命令。 请注意,如果您只需要缩放功能,您仍然可以使用 Docker 运行器,但启用自动缩放器(稍后会详细介绍)。 MacStadium 运行器允许您在云中的 macOS 机器上执行构建。 此选项仅对专门的工作负载有用。
在本教程中,您将在 GitHub 上为源代码设置 Drone CI/CD 服务器,添加 Docker 运行器,使用 Let's Encrypt 保护您的实例,然后创建 YAML管道。 您还将遇到使用 Drone Autoscaler 扩展跑步者的选项,并将您的日志存储在 S3 兼容的服务器上,例如 DigitalOcean Spaces。
先决条件
在开始本教程之前,您需要:
- 一台 Ubuntu 20.04 服务器,至少有 1GB 内存、2GB 可用磁盘空间,以及一个具有
sudo
特权的非 root 用户。 您可以按照我们的初始服务器设置来配置您的机器。
注意:本教程将选择性地配置 Drone 以使用其 Autoscaler 功能 与 DigitalOcean,它将根据需要自动缩放您的 Droplet 数量。 如果您选择此路线,请确保您的帐户将保持在您的限制范围内。 在 DigitalOcean 上,大多数用户的默认限制是 5 个 Droplet,但您可以联系支持并请求增加。 为此,请访问您帐户的云仪表板并在左侧菜单中找到 ACCOUNT。 将出现一个子菜单; 单击设置。 将打开一个页面,其中显示您的帐户用户名和您的 Member since
日期。 在此日期下方,您将看到类似 Droplet Limit:5 Increase
的行。 单击增加以提交更多Droplet的请求。
此外,本教程中描述的 Autoscaler 路径将需要来自 DigitalOcean 的个人访问令牌。 如果您选择安装 Autoscaler,您可以按照 本教程从您的 DigitalOcean 控制面板 中检索令牌。 离开页面前复制此键; 一旦您离开或刷新页面,它就会消失,您需要在第 6 步中输入它。
最后,如果您选择不安装 Drone 的 Autoscaler 功能,您将需要至少另外 2GB 的 RAM 和 10GB 的可用磁盘空间,以确保您可以运行管道。
- 具有指向您服务器 IP 的可用 A 记录的域(或子域)。 如果您在 DigitalOcean 上管理您的 DNS,那么您可以按照 本指南将您的 IP 与您的域 相关联。 本教程将使用
drone.your_domain
。 - Docker 在您的服务器上设置。 有关说明,您可以按照 如何在 Ubuntu 20.04 上安装和使用 Docker 的教程进行操作。
- 您将遇到将日志存储在 DigitalOcean Spaces 上的选项。 要执行此步骤,您需要 将 DigitalOcean Space 添加到您的帐户,并且您还需要生成 Spaces 访问密钥。 将您的访问密钥和秘密复制到安全的地方。 离开或刷新此页面后,您的 Secret 将消失,您需要在看到
your_s3_access_key
和your_s3_secret_key
的任何位置输入这两个值。 或者,您可以使用其他与 S3 兼容的服务,或完全跳过此步骤(第 3 步)。 请注意,仅当您正在尝试 Drone 或者您知道您的构建量将非常低时,才建议跳过此步骤。 - 一个 GitHub 帐户。
第 1 步 - 创建 GitHub 应用程序
要访问代码、验证用户身份并添加 webhook 以接收事件,Drone 需要 GitHub 的 OAuth 应用程序。 对于其他供应商,您可以在此处阅读Drone的官方文档。
要为 GitHub 设置 OAuth 应用程序,请登录到您的 GitHub 帐户,然后单击右上角的用户菜单。 点击【X6X】设置【X18X】,然后在左侧菜单中找到【X39X】开发者设置【X61X】类别,然后点击【X116X】OAuth Applications【X138X】。 或者,您可以直接导航到 Github 的开发者设置页面 。
接下来,创建一个新的应用程序。 点击右上角的【X13X】New OAuth App【X30X】按钮,会出现一个空白表格。
使用 Drone
作为您的应用程序名称。 将 drone.your_domain
替换为您自己的域,添加您的应用的简要说明,然后为您的授权回调 URL 添加 drone.your_domain/login
。
单击注册应用程序,您将看到一个仪表板,其中包含有关您的应用程序的信息。 此处包括您应用的 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.your_domain
替换为您的域。 还将 your_github_client_id
和 your_github_client_secret
替换为您的 GitHub OAuth 凭据,然后将 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
或用户选择的任何单词结尾。 文件末尾的引号会影响文本在变量替换方面的解析方式,其方式类似于它们围绕文字的工作方式。 这是一个非常有用的工具,在这种情况下,您将使用它来创建文件,然后向其中添加行。 在这里,您将添加您的第一个无人机配置并以 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
将此输出附加到您的无人机配置文件中,而不是覆盖。 现在让我们设置您的日志存储系统。
第 3 步 — 在外部存储构建日志(可选)
对于频繁使用的安装,构建日志的量可以很快增加到数 GB。 默认情况下,这些日志存储在服务器的数据库中,但为了性能、可伸缩性和稳定性,请考虑为构建日志设置外部存储。 在此步骤中,您将使用 DigitalOcean Spaces 来执行此操作。 欢迎您修改这些步骤并使用其他与 S3 兼容的存储服务,或者如果您仍在为 CI/CD 工作流进行原型设计,或者如果您知道您的构建量将非常低,则根本不使用。 在这些情况下,您现在可以继续执行第 4 步。
要将您的日志存储在 DigitalOcean Spaces 上,请确保您已完成必要的先决条件并已设置 Spaces 存储桶并生成匹配的 Spaces 访问密钥和机密 。 将该密钥复制到剪贴板,然后使用以下命令更新配置文件:
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
替换为你的秘密。 您可以在控制面板中找到前两个值,方法是单击 Manage 菜单按钮,然后单击 Spaces,然后选择新空间。 您可以通过单击 Account 菜单按钮,然后单击 API 按钮,然后向下滚动直到找到 Spaces 部分来检索您的 Spaces 访问密钥。 如果您放错了您的密钥,那么您将需要生成一个新的访问密钥/密钥对。
您的 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)
此时,您将能够访问您的服务器、登录并管理您的存储库。 转到 https://drone.your_domain
,输入您的 GitHub 凭据,并在出现提示时授权您的新应用程序。
您的 Drone 服务器现已上线,几乎可以使用了。 剩下的就是配置您的 Drone 跑步者和/或 DigitalOcean Autoscaler。
第 5 步 — 选项 1:安装 Docker Runner
在您的服务器可以执行作业之前,您需要设置一个运行器。
如果您想使用 DigitalOcean Droplets 自动缩放跑步者,请跳至 选项 2:为 DigitalOcean 安装 Drone Autoscaler。 如果你想使用另一个跑步者,你可以设置它,然后跳到第 7 步。 否则,请按照 选项 1 并安装 Docker 运行器。
选项 1:安装 Docker Runner
首先,为 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。
首先,进入您的无人机服务器,登录,然后在用户菜单中点击用户设置。 找到并复制您的 个人令牌 。 这是 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,并且在创建后,Droplet 将至少运行 1 小时,然后在不活动时自动销毁。
之后,验证自动缩放器是否正确启动:
docker logs drone-autoscaler
如果您决定不再使用自动缩放器,请使用 docker rm drone-autoscaler
删除容器,从您的帐户中删除剩余的 Droplets(如果有),并撤销 DigitalOcean API 令牌。 您现在已准备好测试新的 CI/CD 工作流程。
第 6 步 - 创建 YAML 管道
为了测试您的新 Drone 安装,让我们创建一个 YAML 管道。
首先,在 GitHub 上创建一个新的存储库。 在您的 GitHub 个人资料页面中,单击 Repositories 菜单,然后单击右上角的绿色 New 按钮。 在下一页上为您的存储库命名,然后单击绿色的 创建存储库 按钮。 现在导航到您的 Drone 服务器,按 SYNC,刷新页面,您新创建的存储库应该会出现。 按旁边的 ACTIVATE 按钮。
然后,在您的存储库中创建一个名为 .drone.yml
的新文件。 您可以使用 GitHub 的 UI 或使用 git
从命令行执行此操作。 在 GitHub UI 中,单击 Repositories 菜单,然后单击您的新存储库,然后单击 Add 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
查看 runner 的日志,使用 docker logs drone-autoscaler
查看 autoscaler 的日志。
如果您使用自动缩放器,初始构建可能需要一分钟才能开始(在此期间的最后一条日志消息将是 starting the server
)。
构建完成后,您将在 drone-test
管道的 test
阶段的日志中看到文本 It worked!
。 如果日志加载失败,请确保您的 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 的基础知识。