如何在Ubuntu16.04上安装和配置Drone

来自菜鸟教程
跳转至:导航、​搜索

警告:此版本的 Drone 已弃用。 如需帮助安装最新版本的无人机,请访问我们的 Ubuntu 20.04 无人机安装教程


介绍

Drone 是一个流行的持续集成和交付平台,内置在 Go 中。 它与许多流行的版本控制存储库服务(如 GitHub、GitLab 和 Bitbucket)集成,以监视代码更改并在提交更改时自动构建和测试更改。

在本指南中,我们将演示如何为您的基础架构设置完整的 Drone 持续集成环境。 我们将安装 Drone 并将其配置为与您的源代码存储库集成。 在此过程中,我们将配置受 Let's Encrypt 保护的 Nginx 作为 Drone 的前端。 这将加密对 Drone Web 界面的请求,并允许 CI 服务器安全地与源代码服务器集成。

先决条件

为了开始,您应该有一个 Ubuntu 16.04 服务器,配置了非 root sudo 用户来执行管理任务。 服务器还应该有一个防火墙来过滤传入的连接。 您可以按照Ubuntu 16.04初始服务器设置指南了解如何配置这些项目。

您必须完成一些额外的步骤才能满足我们设置的其他要求。 因为 Drone 主要作为 Docker 镜像分发,所以我们将使用 Docker Compose 来管理 CI 服务器容器。 出于安全和性能目的,我们将通过受 Let's Encrypt 保护的 Nginx 实例代理对 Drone 的请求。 您需要一个附加到 CI 服务器的域名才能正确设置。

在开始之前,请使用以下文章来设置这些附加要求:

完成上述指南后,您的 Drone 服务器应该具有:

  • 为管理任务配置的 sudo 用户
  • 启用了 UFW 防火墙。 它应该阻止除了端口 22、80 和 443 上的 SSH、HTTP 和 HTTPS 请求之外的所有连接。
  • 安装了 Docker 和 Docker Compose。
  • 使用 Let's Encrypt 提供的 SSL 证书配置的 Nginx 服务器

当您准备好开始时,请继续往下看。

将应用程序添加到您的源代码存储库

为了监控代码更改以触发构建和测试阶段,Drone 需要访问您的源代码存储库。 Drone 可以与 GitHubGitLabGogsBitbucket CloudBitbucket Server 集成。

在本指南中,我们将重点介绍与 GitHub 存储库的集成,但其他系统的过程应该类似。 如果您使用不同的源代码存储库,请按照上面的相应链接了解您需要的软件特定配置。

首先访问您的 GitHub 帐户。 单击右上角的用户图标,然后从下拉菜单中选择 Settings

接下来,在屏幕左侧的 Developer settings 部分中找到 OAuth applications 项:

在接下来的页面,点击【X32X】注册新应用【X62X】:

接下来,您将看到 OAuth 应用程序注册表单:

您将需要填写以下字段(这些字段位于 GitHub 上。 其他存储库提供者可能有不同的提示):

  • 应用程序名称:您选择的用于标识集成的名称。 如果您没有特殊需求,“无人机”是一个不错的选择。
  • 主页网址:您的无人机服务器的域名。 因为我们使用的是安全域,所以在这里使用 https://
  • 应用说明:对Drone及其用途的简单描述。
  • 授权回调URL:这必须是https://模式说明符,后跟您的无人机服务器的域名,然后是/authorize。 如果我们的域名是example.com,这个文件就是https://example.com/authorize

准备好后,单击注册应用程序

在下一页上,您将看到新应用程序的详细信息。 我们需要的两项是 Client IDClient Secret

复制这两个值以备后用。 我们将需要这些将 Drone 连接到我们的 GitHub 帐户。

拉取 Drone Docker 镜像并准备配置

现在您已经在存储库提供商处注册了 Drone 服务器,您可以在服务器上安装和配置 Drone。

Drone 作为 Docker 容器分发,因此如果我们在 Docker Compose 文件中使用它,它将自动下载。 不过,为了稍微加快这个过程,我们可以提前拉下图像:

docker pull drone/drone:0.7

Drone Docker 镜像是一个统一的容器,可以以几种不同的方式运行。 我们将运行一个作为 Drone 服务器运行的容器,它协调存储库访问、托管 Web UI 并提供 API。 使用具有不同设置的相同映像,我们将运行另一个容器作为 Drone 代理,该代理负责从配置的存储库构建和测试软件。

我们将使用 Docker Compose 在 Drone 主机上运行这两个容器。 首先创建一个配置目录来存储我们需要的文件:

sudo mkdir /etc/drone

接下来,我们将在其中创建一些文件来配置我们的服务。

为 Drone 创建 Docker Compose 文件

首先,在配置目录下创建一个 Docker Compose 文件:

sudo nano /etc/drone/docker-compose.yml

在里面,我们将 Docker Compose 文件格式标记为版本“3”。 之后,我们将为上述两个服务定义服务。

drone-server 服务将启动主 Drone 服务器容器在端口 8000 上侦听。 我们将在容器内挂载主机的 /var/lib/drone 目录,以便 Drone 可以持久保存其数据。 我们会将服务配置为自动重启,并以环境变量的形式阅读更详细的配置说明,该环境变量定义在我们将在 /etc/drone/server.env 处创建的文件中。

drone-agent 服务使用相同的图像,以 agent 命令启动。 它接收来自 Drone 主服务器实例的指令,因此虽然它不需要一般的网络访问,但它确实需要在 Drone 服务之后启动。 它还需要访问 Docker 的套接字文件来启动容器以运行实际的构建和测试步骤。 与drone-server服务一样,该服务也会自动重启并读取/etc/drone/agent.env处的环境文件进行额外配置。

使用以下 Docker Compose 文件来配置这两个服务。 密切注意文件的 YAML 格式,因为缩进或格式错误会导致错误:

/etc/drone/docker-compose.yml

version: '3'

services:
  drone-server:
    image: drone/drone:0.7
    ports:
      - 127.0.0.1:8000:8000
    volumes:
      - /var/lib/drone:/var/lib/drone
    restart: always
    env_file:
      - /etc/drone/server.env

  drone-agent:
    image: drone/drone:0.7
    command: agent
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    env_file:
      - /etc/drone/agent.env

完成后,保存并关闭 Docker Compose 文件。

配置 Drone 服务器的环境变量文件

接下来,我们需要创建我们在上面的 Docker Compose 文件中引用的 Drone 服务器的环境变量文件。

在我们打开文件之前,我们应该生成一个强密钥来验证代理和服务器组件。 尽管我们的设置将这两个组件放在同一台服务器上,但随着您的测试基础设施横向扩展,强大的密钥是必不可少的。 在命令行上,通过键入以下内容生成密钥:

LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo

此命令临时将 shell 中的语言设置为有限范围的字符。 然后它从 /dev/urandom 中获取随机字节流,并进一步过滤掉任何非字母数字字符。 我们将前 65 个字符作为我们的键。

输出将与此类似( 不要复制下面的值! 生成你自己的! ):

OutputERmA7xubDvTa8i0wYBlljc9yjT1NJPG7xOlZBwAdMAmBYL4RZE4QngxWcCLowk9KN

复制生成的密钥以在服务器环境文件中使用。

/etc/drone/server.env 创建一个新文件并在文本编辑器中打开它:

sudo nano /etc/drone/server.env

在内部,我们将定义 Drone 用于连接的环境变量,用于绑定启动服务、连接到存储库提供程序并设置帐户授权策略。 您将需要之前从存储库提供程序复制的值来正确填写这些值。

首先,设置 DRONE_HOSTDRONE_SECRET 值。 将 DRONE_SECRET 设置为您在命令行上生成的密钥。 DRONE_HOST 设置通知 Drone 其可公开访问的地址。 这应该是您的 Let's Encrypt 受保护域,前面是 https:// 模式说明符:

/etc/drone/server.env

# Service settings
DRONE_SECRET=secret_generated_on_command_line
DRONE_HOST=https://example.com

接下来,我们将配置与我们的 VCS 提供者的集成,在我们的例子中是 GitHub。 适合您项目的设置可能会根据您的需求和 GitHub 资产的组织方式而有所不同。

我们将通过将 DRONE_OPEN 设置为 false 来锁定我们的无人机安装并禁用开放注册。 这意味着只有在 DRONE_ADMIN 中指定的 GitHub 帐户名才能登录。

注意:如果你与合作者作为GitHub组织合作,最好将DRONE_OPEN设置为true并将DRONE_ADMIN替换为[X146X ]。 DRONE_ORGS 设置允许您指定一个或多个应允许其成员注册的 GitHub 组织。 Drone 将注册限制为属于这些组的用户。


确保 DRONE_ADMIN 包含您的 GitHub 帐户名称。

然后,通过将 DRONE_GITHUB 设置为 true 来激活 GitHub 集成插件。 然后,我们将 DRONE_GITHUB_CLIENTDRONE_GITHUB_SECRET 设置为我们在注册 Drone 应用程序时从 GitHub OAuth 应用程序页面复制的密钥:

/etc/drone/server.env

# Service settings
DRONE_SECRET=secret_generated_on_command_line
DRONE_HOST=https://example.com

# Registration settings
DRONE_OPEN=false
DRONE_ADMIN=sammytheshark

# GitHub Settings
DRONE_GITHUB=true
DRONE_GITHUB_CLIENT=Client_ID_from_GitHub
DRONE_GITHUB_SECRET=Client_Secret_from_GitHub

我们已经完成了服务器组件的配置。 离开之前,从文件中复制 DRONE_SECRET 值。 当我们配置代理时,我们将需要在下一节中设置相同的密钥。 完成后保存并关闭文件。

配置 Drone Agent 的环境变量文件

接下来,我们将为 Drone 代理组件创建一个环境文件。

打开一个新文件来设置代理环境变量:

sudo nano /etc/drone/agent.env

在里面,我们只需要定义两个值。 DRONE_SECRET 将匹配 sever.env 文件中的配置。

DRONE_SERVER 设置将配置代理应如何连接到 Drone 服务器组件。 它将以 wss:// 协议前缀开头,表示连接将使用加密的 Web 套接字,后跟 Drone 服务器的域名,并在末尾附加 /ws/broker URI:

/etc/drone/agent.env

DRONE_SECRET=secret_generated_on_command_line
DRONE_SERVER=wss://example.com/ws/broker

完成后保存并关闭文件。

配置 Drone Systemd 单元文件

现在我们的配置文件已经到位,我们可以定义一个 systemd 单元文件来管理 Drone 服务。

/etc/systemd/system目录下新建一个.service文件配置服务:

sudo nano /etc/systemd/system/drone.service

在里面粘贴以下内容:

/etc/systemd/system/drone.service

[Unit]
Description=Drone server
After=docker.service nginx.service

[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml stop

[Install]
WantedBy=multi-user.target

第一部分告诉 systemd 在 Docker 和 Nginx 可用后启动该服务。 第二部分告诉 init 系统在出现故障时自动重启服务。 然后,它使用 Docker Compose 和我们之前创建的配置文件定义了启动和停止 Drone 服务的命令。 最后,最后一节定义了如何使服务在启动时启动。

完成后保存并关闭文件。

在我们启动 Drone 服务之前,我们必须配置 Nginx。 Drone 代理需要能够连接到 Drone 服务器,并且连接依赖于 Nginx 代理。

配置 Nginx 以代理对 Drone 的请求

接下来,我们需要修改 Nginx 的配置,将请求代理到我们的 Drone 服务器。

首先找到处理您的 Let's Encrypt 保护域的服务器块配置。 通过键入以下内容在所有启用的服务器块中搜索 server_name 属性:

grep -R server_name /etc/nginx/sites-enabled
Output/etc/nginx/sites-enabled/default:   server_name example.com;
/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default:   server_name example.com;
/etc/nginx/sites-enabled/default:#  server_name example.com;

在上面的输出中,域名(在本例中为 example.com)是在 /etc/nginx/sites-enabled/default 文件中定义的。 您将要编辑与您的域名关联的文件(第一列)。

您可能还会看到如下内容:

Output/etc/nginx/sites-enabled/default:   server_name _;
/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default:   server_name _;
/etc/nginx/sites-enabled/default:#  server_name example.com;

在上面的输出中,server_name _; 行代表服务器块,用作回退机制。 “_”主机说明符是无效主机,因此它永远不会单独匹配。

在配置中,它们与设置 default_server 选项的 listen 指令配对,以便在请求的主机与任何其他定义的服务器块不匹配时,该块充当默认值。 如果您找不到与您的域名匹配的 server_name 定义,则应改用定义这些后备块的文件。

在文本编辑器中打开与您的域最相关的文件:

sudo nano /etc/nginx/sites-enabled/default 

在内部,我们将首先在现有 server 块之外添加两个部分:

/etc/nginx/sites-enabled/default

upstream drone {
    server 127.0.0.1:8000;
}

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    . . .

第一个块配置一个名为 drone 的上游位置,我们可以在其中代理请求。 server 指令定义了如何连接到我们的 Drone 服务,该服务将在端口 8000 上运行。

第二个块根据 $http_upgrade 变量的值设置一个名为 $connection_upgrade 的用户定义变量,Nginx 在收到“升级”HTTP 标头时设置该变量。 如果收到 Upgrade 标头,Nginx 会将 $connection_upgrade 变量设置为 upgrade。 如果不是,它将设置为 close。 这些变量允许我们在代理 WebSocket 请求时设置正确的标头。

接下来,找到内部带有 listen 443 指令的 server 块。 用以下指令替换 location / 块的内容。 确保从该块中注释掉或删除任何现有配置以避免冲突:

/etc/nginx/sites-enabled/default

. . .
server {
    listen 443 ssl;
    . . .
    location / {
        # try_files $uri $uri/ =404;
        proxy_pass http://drone;

        include proxy_params;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_buffering off;
        chunked_transfer_encoding off;
        proxy_read_timeout 86400;
    }
    . . .
}

proxy_pass 行告诉 Nginx 将从该块提供的所有流量传递到我们之前定义的 upstream。 接下来,我们从 proxy_params 文件中包含一些代理头定义,并根据我们之前的 map 设置添加额外的头。

然后,我们调整一些其他特定于代理的设置,以确保 WebSocket 代理正常工作并确保我们的组件可以有效地通信。

完成后保存并关闭文件。

测试并重启 Nginx 和 Drone

我们的配置现在完成了。 我们只需要启动或重启我们的服务来实现配置。

首先,检查 Nginx 配置是否有语法错误:

sudo nginx -t
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果输出表明存在配置问题,请返回并再次检查 Nginx 配置。

当您准备好继续时,重新启动 Nginx:

sudo systemctl restart nginx

现在 Nginx 可用于代理和服务器之间的代理请求,我们可以启动 Drone:

sudo systemctl start drone

检查以确保服务能够成功启动:

sudo systemctl status drone
Output● drone.service - Drone server
   Loaded: loaded (/etc/systemd/system/drone.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-06-09 21:56:33 UTC; 2min 58s ago
 Main PID: 15225 (docker-compose)
    Tasks: 5
   Memory: 37.7M
      CPU: 1.544s
   CGroup: /system.slice/drone.service
           ├─15225 /usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
           └─15228 /usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up

. . .
Jun 09 21:56:35 drone docker-compose[15225]: drone-agent_1   | pipeline: request next execution

如果服务被标记为 active (running) 并且日志中没有错误,则 Drone 已启动并正在运行。

如果遇到问题,可以通过键入以下内容检查 Nginx 日志:

sudo less /var/log/nginx/error.log

您可以通过键入以下内容检查无人机日志:

sudo journalctl -u drone

如果一切运行正常,请通过键入以下命令启用 Drone 在启动时启动:

sudo systemctl enable drone

Drone 服务将在 Docker 和 Nginx 服务可用后启动。

登录 Drone 以授权访问您的存储库

现在 Drone 已经启动并运行了,我们可以登录 Web 界面并授权应用程序使用我们的 GitHub 帐户。

在 Web 浏览器中访问您服务器的域名以查看 Drone Web 界面:

https://example.com

首次访问时,系统会提示您登录:

单击 登录 以使用 OAuth 使用您的 GitHub 帐户对 Drone 进行身份验证。 如果您当前未登录 GitHub,您将被引导先登录 GitHub。

之后,系统会提示您允许 Drone 访问您的 GitHub 帐户:

在查看请求的权限并进行任何调整后,单击 Authorize username 按钮以授权 Drone。

您将被重定向回您的 Drone 服务器:

从这里,您可以激活和配置您的存储库以自动测试您的代码。

结论

在本指南中,我们将 Drone 设置为 GitHub 项目的持续集成和交付服务器。 我们将 Drone 服务器配置为中央集线器,用于委派工作、处理身份验证并侦听来自我们存储库的更改。 我们还配置了一个可以运行测试和管理容器的 Drone 代理。 在这一切之前,我们将 Nginx 配置为安全的反向代理。

当您准备好设置 Drone 以自动针对您的存储库运行测试时,请查看 Drone 文档 以了解如何使用您的测试程序定义 .drone.yml 文件。