如何在 CoreOS 和 Docker 上使用 Drone.io 执行持续集成测试

介绍

谁不愿意! Drone.io使用Docker容器来运行你的测试,并与 GitHubGitLab(自托和基于服务)和 Bitbucket合作。

无人机是使用Go构建的,并使用Docker,它可以运行在容器内部,而且配置很少。

Continuous integration 是开发实践,即经常向您的代码库做出承诺,并随着您的开发和测试而进行。这意味着新代码将(希望)快速和轻松地整合您的现有代码库。

无人机会自动从托管的 Git 存储库中提取代码,然后运行您定义的脚本。您可以运行任何测试套件,并通过电子邮件向您报告或在您的 README 中标记状态。 无人机与 Docker 的集成意味着它可以支持大量的语言,包括 PHP、Node、Ruby、Go 和 Python,以列举几个。 每个测试都会生成一个基于 Docker 公共注册表的特定图像的新容器。 这意味着语言和开发堆栈的支持只会随着更多图像的创建而增加。

在本教程中,我们将看看如何容器化Drone.io,以便它可以使用最小的Linux发行版CoreOS运行。

要求

  • 至少一个 SSH 密钥添加到您的帐户
  • 单一的 CoreOS Beta Droplet (512 MB RAM 将正常工作)

建议在继续之前阅读本文(如果您以前从未使用过操作系统。

如果您不确定如何使用云配置文件来配置 CoreOS,您可以找到更多信息,加上样本配置文件, 这里!样本配置文件将为本教程工作。

步骤一:准备GitHub

在我们开始之前,我们需要通过oAuth允许访问我们的GitHub帐户,我们将生成一对代币,用于下一步设置无人机容器。

我们需要从您的 GitHub 帐户中生成这些值。 点击此处以访问 GitHub 上相应的设置页面,称为 Applications

点击右上角的注册新申请按钮,这将带来一个新的表格来填写:

OAuth registration

添加您的 应用程序名称. 您的 ** 主页 URL应该是 http://YOUR_DROPLET_IP:8080/. 添加您的 ** 应用程序描述

** 重要性**: 确保 ** 授权回调 URL ** 设置为 http://YOUR_DROPLET_IP:8080/api/auth/github.com 以便正确验证!

一旦设置为此,点击 注册应用程序将被带到新应用程序的信息页面。

您将需要从这里获得两个信息,客户 ID 和客户秘密(保密客户秘密!这不是你应该与任何人分享的东西!)

这些代币将被用来授权我们自己的无人机应用程序将webhooks添加到任何GitHub存储库中,我们通过 Dashboard面板添加到Drone。

请注意这些代币,因为我们将在下一步需要它们。

步骤二:编写Dockerfile

一旦你的CoreOS Droplet准备好了,通过SSH连接到它:

1ssh -A core@YOUR_DROPLET_IP

创建一个名为droneio的新目录:

1mkdir droneio
2cd droneio

由于CoreOS的根文件系统的只读性质,我们不能直接安装Drone.io,我们需要先使用Docker进行集装,我们将设置一个Dockerfile,其中包含安装Drone.io的说明,就像我们在Ubuntu系统上一样。

我们将在本节中使用基于终端的文本编辑器vim。这是CoreOS上的默认文本编辑器,所以很重要的是要熟悉它。

现在是时候使用vim创建我们的Dockerfile了。

1vim Dockerfile

这会打开vim,并在当前目录中创建一个名为Dockerfile的新文件。

现在输入 _insert 模式。 要做到这一点,请按i键。 终端的左下角现在应该说: -- INSERT --. 现在你可以键入或粘贴 Dockerfile 内容。

这里是完整的Dockerfile。 每个部分的评论都包含在线上. 您可以复制这个文件:

 1# Pull from base Ubuntu image
 2FROM ubuntu
 3
 4# Do system updates and install dependencies
 5RUN apt-get update
 6RUN apt-get -y upgrade
 7RUN sudo apt-get -y install git wget
 8RUN apt-get clean
 9
10# Download Drone.io
11RUN wget http://downloads.drone.io/master/drone.deb
12RUN dpkg -i drone.deb
13
14# Expose the Drone.io port
15EXPOSE 8080
16
17ENV DRONE_SERVER_PORT 0.0.0.0:8080
18ENV DRONE_DATABASE_DATASOURCE /var/lib/drone/drone.sqlite
19
20# Define our GitHub oAuth keys below
21ENV DRONE_GITHUB_CLIENT <CLIENT_TOKEN_HERE>
22ENV DRONE_GITHUB_SECRET <CLIENT_SECRET_HERE>
23
24# The command we'll be running when the container starts
25CMD /usr/local/bin/droned

<CLIENT_TOKEN_HERE><CLIENT_SECRET_HERE>替换为从上面的步骤中注意到的代币。

输入下面的命令来保存我们所做的更改. w 告诉 vim 将文本写入文件,而 q 会导致 vim 停止。

1:wq

对于那些不熟悉Dockerfiles的人来说,一个非常快速的概述:

  • FROM - 我们将用于我们的集装箱的图像
  • RUN - 在构建过程中在集装箱内运行命令
  • EXPOSE - 允许指定的端口(s)在集装箱外访问
  • CMD - 当集装箱启动时运行的命令
  • ENV - 设置集装箱中的环境变量值,在这里用于无人机配置

有关您可以在 Dockerfiles 中创建的陈述类型的更多信息,请参阅 官方 Docker 文档

在此时刻,我们可以使用以下命令构建图像:

1docker build -t my_drone .

一旦建成成功,我们可以使用我们的新图像旋转一个容器。

步骤二:启动无人机集装箱

Drone.io 需要一个存储信息的地方,所以我们会使用 SQLite 数据库文件。

1touch drone.sqlite

该文件将由无人机填充数据,一旦容器启动并运行。

发射无人机相当简单,但我们需要做一些额外的步骤,以确保无人机可以访问我们的主机的Docker服务器。 最简单的方法是使用一个卷,将主机插槽文件绑定到容器的插槽文件所在的位置。

1docker run -d --name="drone-ci" \
2    -p 8080:8080 \
3    -v /var/lib/drone/ \
4    -v /var/run/docker.sock:/var/run/docker.sock \
5    -v /home/core/droneio/drone.sqlite:/var/lib/drone/drone.sqlite \
6    my_drone

顺便说一句,让我们分开具体发生了什么:

  • 'docker run -d --name='drone-ci'' - 在这部分命令中,我们告诉Docker在背景中运行这个容器,所以如果我们断开SSH会话,我们不必担心它会死. 我们还给它一个友好的名字,** drone-ci**,以便我们用 " docker " 命令来管理它。 *-p 8080:8080 ' - 我们把8080号港口从东道方接入集装箱中的同一港口。 这让我们可以访问运行的容器网络外的"无人机"接口. *-v/var/lib/drone'-这为集装箱内的储存设置了数量。 *'-v/var/run/docker.sock:/var/run/docker.sock' - 这是允许Drone.io容器控制宿主多克系统的把戏. 我们正在将容器的位置绑定在 Docker UNIX 套接字所在的位置上。 换句话说,我们告诉"无人机"在主机"CoreOS"上使用"多克"安装,而不是在"无人机"正在运行的容器内. 这是因为宿主安装了多克,而容器没有(即多克容器没有运行多克的嵌入式安装).
  • '-v/home/core/droneio/drone.sqlite:/var/lib/drone/drone.sqlite {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 将空存储文件绑入容器内的数据库,以保存我们存储的数据. 这个文件在容器外,以防我们需要从容器中取回数据,或者由于某种原因,数据库需要外部修改. *`My-drone ' - 我们正在使用我们先前建造的图像来运行这个容器。 (英语)

执行该命令后,如果出现任何错误,请确保双重检查您是否创建了空数据库文件,并正确输入所有路径。

要确保容器运行,请快速检查状态:

1docker ps

你的输出应该看起来如下:

1CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26eddddd09900 my_drone:latest    "/bin/sh -c '/usr/lo 1 seconds ago Up 1 seconds 0.0.0.0:8080->8080/tcp drone-ci

我的容器没有启动!

如果你运行了docker ps并且没有结果,请从上方双检查长的docker run命令,并确保你准确地输入了它。

要重建容器并再次尝试,我们需要从Docker中删除破碎的容器;否则,它会抱怨重复的命名容器。

使用docker rm drone-ci删除旧容器(注意我们在上面的命令中使用了容器的名称)。

如果容器已经启动,但您无法访问安装页面,那么您应该尝试重新启动它. 使用docker stop drone-ci停止容器. 或者为了更具攻击性的停止,使用docker kill drone-ci 然后尝试使用docker start drone-ci重新启动它。

如果您想在集装箱日志中进行一些挖掘,您可以使用 Docker 的日志命令:docker logs drone-ci

步骤三:设置无人机

现在,我们已经准备好与初始帐户设置Drone。 打开您的网页浏览器并导航到: http://YOUR_DROPLET_IP:8080/login. 您应该看到一个登录屏幕,如下:

Drone.io Login

我们只看到GitHub,因为它是我们在Dockerfile中设置的唯一服务。

现在点击 ** GitHub ** 按钮,然后点击 ** 授权应用程序 ** 按钮来启动登录和同步过程。

Repo List

这是 Drone 的主要仪表板,您可以在您的 GitHub 帐户中查看三个最新的存储库,并通过点击浏览全部来扩展列表。

感觉自由探索仪表板。

接下来,我们需要允许访问您的各种Git库源。

步骤五:从 GitHub 运行构建

找到您想添加到 Drone CI 的存储库的名称并选择它,这将激活 Drone 并将 Webhooks 添加到您的存储库中。

激活后,您将看到空的存储库状态页面:

Commit Stream

您可以使用右上角的按钮探索一些更高级的存储库设置。

.drone.yml 檔案

我们需要在存储库中创建一个名为.drone.yml的新文件,这将命令无人机,并告诉它如何在GitHub存储库中构建和测试代码。

1image: dockerfile/nginx
2script:
3  - echo hello world

*图像定义了我们从中抽取的基本图像(图像可以来自公共Docker注册表,私人注册表或本地建造)。在这种情况下,我们正在使用 Nginx图像。 *脚本简单地定义了无人机应该执行的命令,并以何种顺序。

这个脚本只是响起你好世界来证明无人机正在工作. 它实际上没有测试你的代码。

在真正的构建和测试场景中,你想让无人机使用与你的生产环境相匹配的Docker图像,你想让脚本在库中测试代码。

现在,将您的.drone.yml 文件委托到您的存储库. 这个委托,以及您在未来所做的任何其他委托(对于任何文件,不仅是.drone.yml 文件),将触发在您的存储库中放置的 Webhook 无人机。

无人机将检测新的委托,克隆对代码所做的任何更改,并遵循在.drone.yml 文件中定义的指示,它将在页面底部显示通知,让你知道构建正在运行,点击它以查看构建状态页面。

Drone worker

构建需要几分钟,因为无人机需要从Docker公共注册表中提取图像。

如果 build 通过,您可以点击 commit 以查看更多细节. 您应该看到类似于以下的输出:

1$ git clone --depth=50 --recursive --branch=master git://github.com/captainshar/dronetest.git /var/cache/drone/src/github.com/captainshar/dronetest
2$ git checkout -qf 9908588ae4e4abcba8afb5029baad5c49a835ba4
3$ echo hello world
4hello world
5$ exit 0

您可能还会看到一些与 Perl 相关的警告;这很好。

如果你完成了所有这些步骤,你的构建通过,你现在有自己的个人 Drone.io 工人准备建造和测试几乎任何基于语言的项目!

无人机还支持 Bitbucket 和 GitLab,使用 OAuth 的设置过程与 Github 相对相同,您可能需要编辑 Dockerfile 并使用正确的环境变量重建容器:

1DRONE_BITBUCKET_CLIENT
2DRONE_BITBUCKET_SECRET
3DRONE_GITLAB_URL
4...

下一步

现在你已经准备好运行 Drone 构建了,你可以修改.drone.yml 来进行一些更高级的测试。

例如,如果您想使用 Karma 或 Mocha 等测试框架来测试 Node 应用程序,您可以将图像部分更改为官方的节点图像,并更改脚本部分以执行npm并运行测试!在 Docker 注册表中查看可能适合您的应用程序的图像。

如果你想得到真正的幻想,你可以看看一些叫做 无人机墙的内容,以提供你所有的构建状态的显示板。

开心地控制你的无人机!

Published At
Categories with 技术
comments powered by Disqus