欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由小铁匠米兰的v 发表于云+社区专栏

介绍

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

在本教程中,我们将演示如何为您的设置完整的Drone持续集成环境。我们将配置受腾讯云SSL保护的Nginx作为Drone的前端。加密对Drone Web界面的请求,并允许CI服务器与源代码服务器安全地集成。

准备

要完成本教程,您需要一台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器

为了加密传输的内容,您还需要SSL证书,如何设置此证书**取决于你是否拥有可解析该服务器的域名。

同时,您还需要提前安装好Docker、学会使用Docker Compose,并在你的服务器上安装好Nginx,学会配置SSL证书,具体教程如下:

完成上述教程后,您的Drone服务器应具有:

  • sudo为管理任务配置的用户
  • 启用了UFW防火墙,阻止除端口22,80和443上的SSH,HTTP和HTTPS请求之外的所有连接。
  • 已安装Docker和Docker Compose。
  • Nginx服务器配置了由腾讯云提供的SSL证书

接下来我们继续安装教程。

将程序添加到源码存储库

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

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

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

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

在随后的页面上,单击“ 注册新应用程序”

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

填写以下字段(这些字段存在于GitHub上。其他存储库提供程序可能有不同的提示):

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

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

在下一页中,您将看到新应用程序的详细信息。我们需要的两个项目是客户端ID客户端密钥

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

拉取Drone Docker镜像并准备配置

可以在服务器上安装和配置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服务将启动侦听8000端口的主Drone服务器容器。我们将主机的/var/lib/drone目录安装在容器内,以便Drone可以保留其数据。我们将服务配置其自动重启,并以我们将在/etc/drone/server.env创建的文件中定义的环境变量的形式读取更详细的配置说明。

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

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

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个字符作为关键字。

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

ERmA7xubDvTa8i0wYBlljc9yjT1NJPG7xOlZBwAdMAmBYL4RZE4QngxWcCLowk9KN

复制生成的密钥以在服务器环境文件中使用。创建一个新文件/etc/drone/server.env并在文本编辑器中打开它:

sudo nano /etc/drone/server.env

文件内,我们定义Drone用于连接的环境变量以启动服务,连接到存储库提供程序以及设置帐户授权策略。您需要先从存储库提供程序复制的值才能正确填写值。

首先,设置DRONE_HOSTDRONE_SECRET值。将DRONE_SECRET设置为您在命令行上生成的密钥。DRONE_HOST设置通知Drone其可公开访问的地址。 这应该是您的受腾讯云保护的域名,前面是https://

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

接下来,我们将配置与VCS提供程序的集成,在我们的示例中为GitHub。适合您项目的设置可能会有所不同,具体取决于您的需求以及GitHub资产的组织方式。

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

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

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

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

# 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

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

完成后保存并关闭文件。

配置DRONE系统单元文件

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

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

sudo nano /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可用后启动此服务。第二部分告诉系统在发生故障时自动重启服务。 然后,它使用Docker Compose和我们之前创建的配置文件定义启动和停止Drone服务的命令。最后,最后一节定义了如何使服务在引导时启动。

完成后保存并关闭文件。

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

配置Nginx到代理请求到Drone

接下来,我们需要修改Nginx的配置以代理对Drone服务器的请求。首先找到处理腾讯云SSL的Nginx配置。通过输入以下内容在所有已启用的服务器块中搜索server_name属性:

grep -R server_name /etc/nginx/sites-enabled
/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文件中定义。 您需要编辑与您的域名关联的文件。

您可能也会看到类似这样的内容:

/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 _; 表示用作后备机制的服务器块。“_”主机说明符是无效的主机,因此它永远不会匹配。

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

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

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

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

upstream drone {
server 127.0.0.1:8000;
} map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
} server {
. . .

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

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

接下来,找到包含listen 443指令的服务器块。 使用以下指令替换内容。确保注释掉或删除该块中的任何现有配置以避免冲突:

. . .
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将此块之外的所有流量传递给我们之前定义的上游。接下来,我们在proxy_params文件中包含一些代理头定义,并根据之前的地图设置添加其他头。然后,我们调整一些其他特定于代理的设置,以确保WebSocket代理正常工作,并确保我们的组件可以有效地进行通信。

完成保存并关闭文件后。

测试并重新启动Nginx和Drone

我们的配置现已完成。我们只需启动或重启我们的服务即可实现配置。

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

sudo nginx -t
nginx: 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
● 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

您可以通过输入以下内容来检查Drone日志:

sudo journalctl -u drone

如果一切正常运行,请通过输入以下内容启用Drone:

sudo systemctl enable drone

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

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

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

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

https://example.com

在您第一次访问时,系统将提示您登录:

单击登录使用您的GitHub帐户向Drone进行身份验证。如果您当前未登录GitHub,将首先指示您登录GitHub。

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

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

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

现在,您可以激活和配置存储库以自动测试代码。

结论

在本教程中,我们将Drone设置为GitHub项目的持续集成和交付服务器。我们将Drone设为处理身份验证并侦听来自我们的存储库的更改。我们还配置了一个可以运行测试和管理容器的Drone代理。我们还将Nginx配置为安全的反向代理。如果觉得自建太麻烦,不要着急,腾讯云CCI持续集成服务即将开放,云持续集成(Cloud Continuous Integration,CCI)为开发者提供支持多语言,多终端的持续集成服务,包含定时/手动启动构建、查看构建结果及日志、支持快速分发交付、可扩展的自动化测试等功能,为项目的持续集成体系提供上游基础服务,提升项目研发效率。 更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Install and Configure Drone on Ubuntu 16.04》

问答

Angular2如何处理http响应?

相关阅读

HTTP/2之服务器推送(Server Push)最佳实践

如何备份你的MySQL数据库

MySQL 8.0 版本功能变更介绍

云学院 · 课程推荐 | 腾讯高级工程师,带你快速入门机器学习

此文已由作者授权腾讯云+社区发布,原文链接:https://cloud.tencent.com/developer/article/1180481?fromSource=waitui

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

入门系列之在Ubuntu上安装Drone持续集成环境的更多相关文章

  1. 入门系列之在Ubuntu上使用MySQL设置远程数据库优化站点性能

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由苏子晨 发表于云+社区专栏 介绍 随着您的应用程序或网站的增长,您可能已经超出了当前的服务器设置.如果您在同一台计算机上托管Web服务 ...

  2. 入门系列之在Ubuntu上使用Netdata设置实时性能监控

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由小翼 发表于云+社区专栏 介绍 Netdata通过可扩展的Web仪表板提供准确的性能监控,可以显示Linux系统上的流程和服务.它监控 ...

  3. 在Debian系列Linux系统Ubuntu上安装配置yum的试验

    用习惯了Red Hat系统的都知道我们习惯于三种安装方式:一种是rpm包的方式安装,一种就是tar包的方式来安装,还有一种方式就是yum源的安装. 首先rpm包的用法,我们一般是在Red Hat光驱里 ...

  4. 在 Ubuntu 上安装 TensorFlow (官方文档的翻译)

    本指南介绍了如何在 Ubuntu 上安装 TensorFlow.这些指令也可能对其他 Linux 变体起作用, 但是我们只在Ubuntu 14.04 或更高版本上测试了(我们只支持)  这些指令. 一 ...

  5. 在Ubuntu上安装Odoo时遇到的问题

    这两天开始看<Odoo快速入门与实践  Python开发ERP指南>(刘金亮 2019年5月第1版 机械工业出版社).试着在Ubuntu上安装Odoo,遇到很多问题,通过在网上查找,都已解 ...

  6. [异常解决] ubuntu上安装JLink驱动遇到的坑及给后来者的建议

    一.前言 最近将整个电脑格式化,改成了linux操作系统 希望这样能让自己在一个新的世界探索技术.提升自己吧- win上的工具用多了,就不想变化了- 继上一篇<ubuntu上安装虚拟机遇到的问题 ...

  7. Ubuntu上安装Robomongo及添加到启动器

    到目前为止,Robomongo仍是MongoDB最好的客户端管理工具,如需在Ubuntu上安装Robomongo,可直接从官网下载.tar.gz压缩包进行解压,然后直接运行bin目录下的robomon ...

  8. 在 Ubuntu 上安装 Android Studio

    在 Ubuntu 上安装 Android Studio http://www.linuxidc.com/Linux/2013-05/84812.htm 打开terminal,输入以下命令 sudo a ...

  9. Ubuntu上安装Karma失败对策

    在Ubuntu上安装Karma遇到超时 timeout 错误.Google了一下,国外的码农给了一个快捷的解决方案,实测可行,贴在这里: sudo apt-get install npm nodejs ...

随机推荐

  1. SQL Server创建表超出行最大限制解决方法

    问题的现象在创建表A的时候,出现“信息 511,级别 16,状态 1,第 5 行  无法创建大小为 的行,该值大于允许的最大值 8060.”的信息提示.很奇怪,网上查了一下,是因为要插入表的数据类型的 ...

  2. c# 线程的基本使用

    创建线程 线程的基本操作 线程和其它常见的类一样,有着很多属性和方法,参考下表: 创建线程的方法有很多种,这里我们先从thread开始创建线程 class Program { static void ...

  3. 基于ASP.NET几十万数据几秒钟就可以导入到数据库中

    /// <summary> /// 一.构建模拟数据存放于DataTable /// </summary> /// <returns>DataTable</r ...

  4. 将实体转换为Hashtable

    1.将实体转换为Hashtable,用于将实体参数处理为hashtable,方便sql参数传递 /// <summary> /// 将实体转换为Hashtable /// </sum ...

  5. java invoke(转摘)

      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制 ...

  6. 【OCP-12c】2019年CUUG OCP 071考试题库(75题)

    75.Which statements are correct regarding indexes? (Choose all that apply.) A. A non-deferrable PRIM ...

  7. 如何给LOJ补全special judge

    首先你要会写一个叫$data.yml$的东西, 这里面记录了这道题的$subtask$计分策略 也告诉了评测姬这道题是提交答案还是$spj$还是交互题 那么,$YAML$语言是啥啊? 别问我,我也不会 ...

  8. 看个AV也中招之cve-2010-2553漏洞分析

    试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...

  9. linux安装spark-2.3.0集群

    (安装spark集群的前提是服务器已经配置了jdk并且安装hadoop集群(主要是hdfs)并正常启动,hadoop集群安装可参考<hadoop集群搭建(hdfs)>) 1.配置scala ...

  10. Leetcode 98 验证二叉搜索树 Python实现

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...