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

<$>[警告] 警告:这个版本的无人机已经过时。 对于安装最新版本的无人机的帮助,请访问我们的Ubuntu 20.04无人机安装教程。

介绍

它与许多流行的版本控制存储服务(如GitHub,GitLab和Bitbucket)集成,以监控代码变更,并自动构建和测试变更。

在本指南中,我们将展示如何为您的基础设施设置完整的无人机连续集成环境。我们将安装无人机并配置它以与您的源代码存储库集成。沿途,我们将配置由Let's Encrypt保护的Nginx作为无人机的前端。这将加密请求到无人机的Web接口并允许CI服务器安全地与源代码服务器集成。

前提条件

要开始,你应该有一个 Ubuntu 16.04 服务器配置了非根 `sudo' 用户管理任务. 服务器也应该有一个防火墙来过滤接入连接. 您可以学习如何根据 Ubuntu 16.04 初始服务器设置指南来配置这些项目。

您将不得不完成一些额外的步骤,以满足我们安装的其他要求. 由于无人机主要分发为Docker图像,我们将使用Docker Compose来管理CI服务器容器. 为了安全和性能,我们将通过Let's Encrypt保护的Nginx实例代理请求到Drope。

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

当您完成上述指南后,您的无人机服务器应该有:

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

继续下方,当你准备好开始。

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

为了监控代码的变化,触发构建和测试阶段,无人机将需要访问您的源代码存储库。无人机可以集成到 GitHub, GitLab, Gogs, Bitbucket CloudBitbucket Server

在本指南中,我们将专注于与GitHub存储库的集成,但对于其他系统来说,该过程应该是相似的。

开始访问您的 GitHub帐户,点击右上角的用户图标,从下载菜单中选择 Settings:

Drone GitHub settings

接下来,在屏幕左侧的开发者设置部分找到OAuth应用程序项:

Drone OAuth applications

在下面的页面上,点击 注册新申请:

Drone new app

接下来,您将看到OAuth申请注册表格:

Drone register a new app

您需要填写以下字段(这些字段在GitHub上存在,其他存储提供商可能有不同的提示):

  • 应用程序名称:您选择的名称来识别整合,无人机是一个很好的选择,如果你没有特殊需求
  • ** 主页 URL**: 您的无人机服务器的域名。 使用https://在这里,因为我们正在使用一个安全的域名
  • ** 应用程序描述**: 简单的描述无人机和它的目的
  • ** 授权回调 URL**: 此必须是https://计划指标,其次是您的无人机服务器的域名,其次是/autorize 。 如果我们的域名是example.com,这个文件将是https://example.com/authorize.

当你准备好时,点击 **注册申请 **。

在下面的页面上,你会看到你的新应用程序的详细信息. 我们需要的两个项目是 客户 ID客户秘密:

Drone client info

我们将需要这些值来连接 Drone 到我们的 GitHub 帐户。

拉出无人机Docker图像并准备配置

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

无人机作为Docker容器分布,因此如果我们在Docker Compose文件中使用它,它将自动下载。

1docker pull drone/drone:0.7

无人机Docker图像是一个统一的容器,可以以几种不同的方式运行。我们将运行一个作为无人机服务器的容器,该容器协调仓库访问,托管Web UI,并服务API。使用相同的图像与不同的设置,我们将运行另一个容器作为无人机代理,负责从配置仓库构建和测试软件。

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

1sudo mkdir /etc/drone

接下来,我们将创建一些内部文件来配置我们的服务。

创建一个Docker构成文件为无人机

首先,在配置目录中创建 Docker Compose 文件:

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

内部,我们将标记 Docker Compose 文件格式为版本3。之后,我们将为上述两种服务定义服务。

无人机服务器服务将启动主无人机服务器容器在端口8000上收听。我们将安装主机的/var/lib/drone目录在容器内部,以便无人机能够保持其数据。

无人机代理服务使用相同的图像,从代理命令开始。它从主无人机服务器实例接收指示,因此虽然不需要一般网络访问,但它确实需要在无人机服务后启动。它还需要访问Docker的接口文件来旋转容器以运行实际的构建和测试步骤。

使用以下 Docker Compose 文件来配置这两个服务. 密切关注文件的 YAML 格式化,因为插入或格式化中的错误可能会导致错误:

 1[label /etc/drone/docker-compose.yml]
 2version: '3'
 3
 4services:
 5  drone-server:
 6    image: drone/drone:0.7
 7    ports:
 8      - 127.0.0.1:8000:8000
 9    volumes:
10      - /var/lib/drone:/var/lib/drone
11    restart: always
12    env_file:
13      - /etc/drone/server.env
14
15  drone-agent:
16    image: drone/drone:0.7
17    command: agent
18    depends_on:
19      - drone-server
20    volumes:
21      - /var/run/docker.sock:/var/run/docker.sock
22    restart: always
23    env_file:
24      - /etc/drone/agent.env

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

配置无人机服务器的环境变量文件

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

在我们打开文件之前,我们应该生成一个强有力的密钥来验证代理和服务器组件. 虽然我们的设置将有这两个组件在同一个服务器上,因为你的测试基础设施扩展,一个强有力的密钥是必不可少的。

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

此命令暂时将壳中的语言设置为有限的字符范围,然后从 `/dev/urandom’ 采取随机字节的流,并进一步过滤任何非字母数字字符。

输出将看起来类似于此(** 不要复制下面的值! 生成自己的值!**):

1[secondary_label Output]
2ERmA7xubDvTa8i0wYBlljc9yjT1NJPG7xOlZBwAdMAmBYL4RZE4QngxWcCLowk9KN

复制生成的密钥,用于服务器环境文件。

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

1sudo nano /etc/drone/server.env

内部,我们将定义无人机使用的环境变量来连接连接开始服务,连接到存储提供商,并设置帐户授权策略。

首先,设置DRONE_HOSTDRONE_SECRET值。 将DRONE_SECRET设置为您在命令行上生成的密钥。 DRONE_HOST设置告知无人机其公开可访问的地址。 这应该是您的 Let's Encrypt 受保护的域名,前面是https:// 方案指标:

1[label /etc/drone/server.env]
2# Service settings
3DRONE_SECRET=secret_generated_on_command_line
4DRONE_HOST=https://example.com

接下来,我们将配置与我们的 VCS 提供商的集成,这在我们的情况下是 GitHub. 适合您的项目的设置可能因您的需求和您的 GitHub 资产的组织而有所不同。

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

<$>[注] **注:如果您作为GitHub组织与合作者合作,最好将DRONE_OPEN设置为true,并将DRONE_ADMIN替换为DRONE_ORGS

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

接下来,将DRONE_GITHUB_CLIENTDRONE_GITHUB_SECRET设置为我们在注册我们的 Drone 应用程序时从 GitHub OAuth 应用程序页面复制的密钥:

 1[label /etc/drone/server.env]
 2# Service settings
 3DRONE_SECRET=secret_generated_on_command_line
 4DRONE_HOST=https://example.com
 5
 6# Registration settings
 7DRONE_OPEN=false
 8DRONE_ADMIN=sammytheshark
 9
10# GitHub Settings
11DRONE_GITHUB=true
12DRONE_GITHUB_CLIENT=Client_ID_from_GitHub
13DRONE_GITHUB_SECRET=Client_Secret_from_GitHub

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

配置无人机代理的环境变量文件

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

打开新文件以设置代理环境变量:

1sudo nano /etc/drone/agent.env

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

DRONE_SERVER设置将配置代理应该如何连接到 Drone 服务器组件. 它将从一个 wss:// 协议前缀开始,表示连接将使用加密的 Web 接口,然后是 Drone 服务器的域名,并附有/ws/broker URI:

1[label /etc/drone/agent.env]
2DRONE_SECRET=secret_generated_on_command_line
3DRONE_SERVER=wss://example.com/ws/broker

保存并关闭文件,当你完成。

配置 Drone Systemd 单元文件

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

/etc/systemd/system 目录中打开一个新的 .service 文件来配置该服务:

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

内部包装下列内容:

 1[label /etc/systemd/system/drone.service]
 2[Unit]
 3Description=Drone server
 4After=docker.service nginx.service
 5
 6[Service]
 7Restart=always
 8ExecStart=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
 9ExecStop=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml stop
10
11[Install]
12WantedBy=multi-user.target

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

保存并关闭文件,当你完成。

在我们启动无人机服务之前,我们必须配置 Nginx. 无人机代理必须能够连接到无人机服务器,连接取决于 Nginx 代理在位。

配置 Nginx 到向无人机发送代理请求

接下来,我们需要修改 Nginx 的配置,以便向我们的无人机服务器发送代理请求。

首先,找到处理 Let's Encrypt 受保护的域名的服务器块配置,在所有启用的服务器块中搜索 server_name 属性,键入:

1grep -R server_name /etc/nginx/sites-enabled
1[secondary_label Output]
2/etc/nginx/sites-enabled/default:   server_name example.com;
3/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
4/etc/nginx/sites-enabled/default:   server_name example.com;
5/etc/nginx/sites-enabled/default:#  server_name example.com;

在上述输出中,域名(‘example.com’ 在本例中)正在被定义为 /etc/nginx/sites-enabled/default 文件中。

也许你也看到了这样的东西:

1[secondary_label Output]
2/etc/nginx/sites-enabled/default:   server_name _;
3/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
4/etc/nginx/sites-enabled/default:   server_name _;
5/etc/nginx/sites-enabled/default:#  server_name example.com;

在上述输出中,server_name _; 行代表服务器块,其目的是作为倒退机制。

在配置中,这些指令与倾听指令配对,这些指令设置了默认_服务器选项,以便当所请求的主机不匹配任何其他定义的服务器块时,该区块作为默认行为。

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

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

在内部,我们将通过在现有服务器块之外添加两个部分开始:

 1[label /etc/nginx/sites-enabled/default]
 2upstream drone {
 3    server 127.0.0.1:8000;
 4}
 5
 6map $http_upgrade $connection_upgrade {
 7    default upgrade;
 8    ''      close;
 9}
10
11server {
12    . . .

第一块配置了一个名为无人机的上游位置,在那里我们可以通过代理请求,服务器指令定义了如何连接到我们的无人机服务,该服务将运行在端口 8000。

第二个区块设置了一个用户定义的变量,名为$connection_upgrade,基于$http_upgrade变量的值,而 Nginx 则在收到Upgrade HTTP 标题时设置它。如果收到Upgrade标题, Nginx 会将$connection_upgrade变量设置为upgrade。否则,它会将其设置为 close。这些变量允许我们在代理 WebSocket 请求时设置正确的标题。

接下来,找到服务器块,里面有倾听443指令. 用以下指令取代位置/块的内容. 请确保评论或从该块中删除任何现有配置以避免冲突:

 1[label /etc/nginx/sites-enabled/default]
 2. . .
 3server {
 4    listen 443 ssl;
 5    . . .
 6    location / {
 7        # try_files $uri $uri/ =404;
 8        proxy_pass http://drone;
 9
10        include proxy_params;
11        proxy_set_header Upgrade $http_upgrade;
12        proxy_set_header Connection $connection_upgrade;
13
14        proxy_redirect off;
15        proxy_http_version 1.1;
16        proxy_buffering off;
17        chunked_transfer_encoding off;
18        proxy_read_timeout 86400;
19    }
20    . . .
21}

proxy_pass 行告诉 Nginx 将从这个块中提供的所有流量传送到我们之前定义的上游。接下来,我们将从proxy_params 文件中包含一些代理标题定义,并根据我们之前的地图设置添加其他标题。

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

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

测试和重新启动 Nginx 和无人机

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

要开始,请检查 Nginx 配置,查找语法错误:

1sudo nginx -t
1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful

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

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

1sudo systemctl restart nginx

现在 Nginx 可在代理人和服务器之间进行代理请求,我们可以启动 Drone:

1sudo systemctl start drone

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

1sudo systemctl status drone
 1[secondary_label Output]
 2 drone.service - Drone server
 3   Loaded: loaded (/etc/systemd/system/drone.service; disabled; vendor preset: enabled)
 4   Active: active (running) since Fri 2017-06-09 21:56:33 UTC; 2min 58s ago
 5 Main PID: 15225 (docker-compose)
 6    Tasks: 5
 7   Memory: 37.7M
 8      CPU: 1.544s
 9   CGroup: /system.slice/drone.service
10           ├─15225 /usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
11           └─15228 /usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
12
13. . .
14Jun 09 21:56:35 drone docker-compose[15225]: drone-agent_1   | pipeline: request next execution

如果该服务被标记为活跃(运行),并且日志中没有错误,则无人机已启动并运行。

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

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

您可以通过键入检查 Drone 日志:

1sudo journalctl -u drone

如果一切正常运行,请通过键入启动时启动 Drone:

1sudo systemctl enable drone

无人机服务将在Docker和Nginx服务可用后启动。

登录无人机以授权访问您的存储库

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

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

1https://example.com

在第一次访问时,您将被要求登录:

Drone initial visit

点击 login 以使用 OAuth 身份验证您的 GitHub 帐户,如果您目前未登录 GitHub,您将被指示先登录 GitHub。

之后,您将被要求允许 Drone 访问您的 GitHub 帐户:

Drone allow access through GitHub

在审查所请求的权限并进行任何调整后,点击允许用户名按钮授权 Drone。

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

Drone logged in

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

结论

在本指南中,我们将 Drone 设置为我们的 GitHub 项目的连续集成和交付服务器,我们将 Drone 服务器配置为中央枢纽,以便委托工作,处理身份验证,并听取我们的存储库的更改。

当您准备好设置无人机以自动对您的仓库运行测试时,请参阅 无人机文档以了解如何根据测试程序定义.drone.yml 文件。

Published At
Categories with 技术
comments powered by Disqus