<$>[警告] 警告:这个版本的无人机已经过时。 对于安装最新版本的无人机的帮助,请访问我们的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。
在开始之前,请使用以下文章来设置这些额外的要求:
- 如何在Ubuntu 16.04上安装和使用Docker
- 如何在Ubuntu 16.04上安装Docker Compose:按照本指南的先决条件和第一步安装Docker和Docker Compose。
- 如何在Ubuntu 16.04上安装Nginx:在服务器上安装Nginx。
当您完成上述指南后,您的无人机服务器应该有:
- 配置为管理任务的
sudo
用户 - 启用了 UFW 防火墙. 它应该阻止所有连接,除了 SSH、HTTP 和 HTTPS 请求,分别在端口 22, 80 和 443。
- Docker 和 Docker Compose 安装。
- 由 Let's Encrypt 提供的 SSL 证书配置的 Nginx 服务器
继续下方,当你准备好开始。
将应用程序添加到您的源代码存储库
为了监控代码的变化,触发构建和测试阶段,无人机将需要访问您的源代码存储库。无人机可以集成到 GitHub, GitLab, Gogs, Bitbucket Cloud和 Bitbucket Server。
在本指南中,我们将专注于与GitHub存储库的集成,但对于其他系统来说,该过程应该是相似的。
开始访问您的 GitHub帐户,点击右上角的用户图标,从下载菜单中选择 Settings:
接下来,在屏幕左侧的开发者设置
部分找到OAuth应用程序
项:
在下面的页面上,点击 注册新申请:
接下来,您将看到OAuth申请注册表格:
您需要填写以下字段(这些字段在GitHub上存在,其他存储提供商可能有不同的提示):
- 应用程序名称:您选择的名称来识别整合,
无人机
是一个很好的选择,如果你没有特殊需求 - ** 主页 URL**: 您的无人机服务器的域名。 使用
https://
在这里,因为我们正在使用一个安全的域名 - ** 应用程序描述**: 简单的描述无人机和它的目的
- ** 授权回调 URL**: 此必须是
https://
计划指标,其次是您的无人机服务器的域名,其次是/autorize
。 如果我们的域名是example.com
,这个文件将是https://example.com/authorize
.
当你准备好时,点击 **注册申请 **。
在下面的页面上,你会看到你的新应用程序的详细信息. 我们需要的两个项目是 客户 ID和 客户秘密:
我们将需要这些值来连接 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_HOST
和DRONE_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_CLIENT
和DRONE_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
在第一次访问时,您将被要求登录:
点击 login 以使用 OAuth 身份验证您的 GitHub 帐户,如果您目前未登录 GitHub,您将被指示先登录 GitHub。
之后,您将被要求允许 Drone 访问您的 GitHub 帐户:
在审查所请求的权限并进行任何调整后,点击允许用户名
按钮授权 Drone。
您将被重定向回您的 Drone 服务器:
从这里,您可以激活和配置您的存储库以自动测试您的代码。
结论
在本指南中,我们将 Drone 设置为我们的 GitHub 项目的连续集成和交付服务器,我们将 Drone 服务器配置为中央枢纽,以便委托工作,处理身份验证,并听取我们的存储库的更改。
当您准备好设置无人机以自动对您的仓库运行测试时,请参阅 无人机文档以了解如何根据测试程序定义.drone.yml 文件。