如何在CoreOS和Docker与Drone.io执行连续集成测试

持续集成是使频繁的提交你的代码库,构建和测试,当您去的发展实践。 Drone.io让您从一个公共Git仓库自动构建和测试。

介绍

想要一个最小的设置持续集成解决方案? 谁不会! Drone.io使用Docker容器运行测试,并与工作GitHub上GitLab (自行管理和服务为主),和到位桶

Drone是使用Go构建的,并利用Docker。 它可以在容器本身内运行,配置非常少。

持续集成是使频繁的提交你的代码库,并建立和测试,当您去的发展实践。 这意味着新代码将(希望)快速,轻松地集成您现有的代码库。 由于持续集成需要频繁构建和测试代码,因此如果您可以自动构建和测试,则会加快开发过程。 Drone这样做; 它自动化构建和测试的过程。

Drone从托管的Git存储库自动提取代码,然后运行您定义的脚本。 您可以运行任何测试套件,并通过电子邮件向您报告,或在您的README中标出状态标志。 Drone与Docker的集成意味着它可以支持大量的语言,包括PHP,Node,Ruby,Go和Python等等。 每个测试将根据来自Docker公共注册表的指定图像生成一个新的容器。 这意味着对语言和开发的支持只会随着创建更多的图像而增加。 你甚至可以自己做,以适应你的具体应用!

在本教程中,我们将介绍如何对Drone.io进行容器化,以便可以使用最小的Linux分发CoreOS运行。

要求

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

它是建议阅读本介绍CoreOS ,如果你以前从未使用的操作系统,然后再继续。

如果您不确定如何配置使用CoreOS cloud-config文件,你可以找到更多的信息,再加上一个示例配置文件, 在这里 示例配置文件将适用于本教程。

第一步 - 准备GitHub

在我们开始之前,我们需要通过oAuth启用对我们的GitHub帐户的访问。 我们将生成一对令牌,用于下一步设置Drone容器。

我们需要从GitHub的帐户中生成这些值。 请点击这里进入到相应的设置页面在GitHub上,称为应用程序

点击右上角的注册新的应用程序按钮。 这将打开一个新的表单填写:

OAuth注册

添加您的应用程序名称 首页网址应为http://YOUR_DROPLET_IP:8080/ 添加您的应用程序的说明

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

一旦你与设置,点击注册申请被带到新的应用程序的信息页面。

你需要的信息,两位从这里, 客户ID客户端密钥 (保持客户端秘密实际上是秘密!这不是你应该与任何人分享!)

这些标记将被用来授权我们自己的Drone的应用程序网络挂接添加到任何GitHub的库,我们添加通过控制板面板的嗡嗡声。 webhooks将触发我们推送到GitHub的每个新提交,这将导致Drone克隆新的更改并运行构建。

记下这些标记,因为我们将在下一步中需要它们。

第二步 - 编写Dockerfile

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

ssh -A core@YOUR_DROPLET_IP

创建一个名为新目录droneio

mkdir droneio
cd droneio

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

我们将使用基于终端的文本编辑器vim在本节。 这是CoreOS上的默认文本编辑器,因此熟悉它非常重要。 我们将一步一步告诉您如何使用它来打开和编辑文件。

现在是时候使用vim创建我们的Dockerfile。 运行命令:

vim Dockerfile

这将打开vim和创建一个名为新文件Dockerfile在当前目录。

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

这里是Dockerfile的完整。 每个部分包括在线内的评论。 您可以完全复制此文件:

# Pull from base Ubuntu image
FROM ubuntu

# Do system updates and install dependencies
RUN apt-get update
RUN apt-get -y upgrade
RUN sudo apt-get -y install git wget
RUN apt-get clean

# Download Drone.io
RUN wget http://downloads.drone.io/master/drone.deb
RUN dpkg -i drone.deb

# Expose the Drone.io port
EXPOSE 8080

ENV DRONE_SERVER_PORT 0.0.0.0:8080
ENV DRONE_DATABASE_DATASOURCE /var/lib/drone/drone.sqlite

# Define our GitHub oAuth keys below
ENV DRONE_GITHUB_CLIENT <CLIENT_TOKEN_HERE>
ENV DRONE_GITHUB_SECRET <CLIENT_SECRET_HERE>

# The command we'll be running when the container starts
CMD /usr/local/bin/droned

更换<CLIENT_TOKEN_HERE><CLIENT_SECRET_HERE>从以上步骤记下的记号。

输入以下命令保存我们所做的更改。 w告诉Vim写的文本文件,然后q会导致VIM退出。

:wq

对不熟悉Dockerfiles的人员的一个快速概述:

  • FROM -图像,我们将使用我们的容器
  • RUN -在构建过程中运行容器内的命令
  • EXPOSE -允许指定端口(多个)容器的外面被访问
  • CMD -当容器开始将运行该命令
  • ENV -设置在容器中的环境变量的值,这里用于Drone配置

有关类型的语句可以在Dockerfiles使更多的信息,请阅读官方Docker文档

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

docker build -t my_drone .

这将需要几分钟时间完成。 一旦构建成功,我们可以使用我们的新图像旋转容器。

第二步 - 启动Drone容器

Drone.io需要一个地方来存储信息,所以我们将使用一个SQLite数据库文件。 创建一个空文件以开始:

touch drone.sqlite

容器启动并运行后,此文件将由Drone填充数据。

启动Drone是相当简单,但我们需要做一些额外的步骤,以确保Drone可以访问我们的主机的Docker服务器。 最简单的方法是使用卷将主机套接字文件绑定到容器的套接字文件所在的位置。 正确启动容器的命令如下:

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

逐行,让我们分开究竟是怎么回事:

  • docker run -d --name="drone-ci" -在命令的这一部分,我们告诉Docker以在后台运行这个容器,所以我们不必担心它奄奄一息,如果我们从SSH断开会话。 我们也给它一个友好的名称, Drone词 ,所以我们可以使用它管理docker命令。

  • -p 8080:8080 -在这里,我们从主机绑定端口8080到容器内的同一个端口。 这使我们可以在运行容器的网络之外访问Drone的接口。

  • -v /var/lib/drone -这个选项可以设置在容器内存储的卷。

  • -v /var/run/docker.sock:/var/run/docker.sock -这是允许的Drone.io容器来控制主机的Docker系统的伎俩。 我们将容器的位置绑定到Docker UNIX套接字到实际主机的Docker UNIX套接字。 换句话说,我们告诉Drone在我们的主机CoreOS上使用Docker安装,而不是在Drone运行的容器内部。这是因为主机安装了Docker,而容器没有安装(即Docker容器没有运行Docker的嵌套安装)。

  • -v /home/core/droneio/drone.sqlite:/var/lib/drone/drone.sqlite \ -绑定容器内的空文件存储到数据库中,以保持我们在那里存储数据。 此文件在容器之外,以防我们需要从其中恢复数据,或者数据库需要由于某种原因而被外部修改。

  • my_drone -我们正在利用我们前面建成运行这个容器的图像。

执行该命令后,如果发生任何错误,请务必仔细检查是否已创建空数据库文件,并且所有路径都已正确输入。

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

docker ps

您的输出应类似于以下内容:

CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                             NAMES
6eddddd09900        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 ,从上面的命令,并确保您键入它完全吻合。 你可以试试运行它没有换行符。 另外,还要确保你创建的空drone.sqlite在正确的目录文件。

要重建容器并重试,我们需要从Docker中删除损坏的容器; 否则,它将抱怨重复的命名容器。

拆下用旧容器docker rm drone-ci (注意,我们使用我们给容器上面的命令的名称)。 然后,尝试运行长docker run ,从上一节命令再次。

如果容器已启动,但无法访问安装页面,则应尝试重新启动它。 使用停止容器docker stop drone-ci 或采取更为进取的停止,利用docker kill drone-ci 然后,尝试以再次启动docker start drone-ci

如果你想要做一些挖掘在容器日志,你可以使用Docker的日志命令: docker logs drone-ci

第三步 - 设置Drone

现在我们准备用初始帐户设置Drone。 打开Web浏览器,然后导航至: http://YOUR_DROPLET_IP:8080/login 您应该看到如下所示的登录屏幕:

Drone.io登录

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

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

回购列表

这是Drone的主要仪表板,您可以在您的GitHub帐户中查看三个最新的存储库,并通过单击“BROWSE ALL”扩展列表。 如果所有的回购没有出现,只需点击右上角的“同步”。

随意浏览仪表板。

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

第五步 - 从GitHub运行构建

找到要添加到Drone CI的存储库的名称并选择它。 这将激活Drone并将webhook添加到您的存储库。

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

提交流

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

.drone.yml文件

我们需要在一个名为存储库的新文件.drone.yml 这将命令Drone并告诉它如何构建和测试GitHub存储库中的代码。 这里是一个非常简单的文件,我们将用来测试Drone是否正确设置。

image: dockerfile/nginx
script:
  - echo hello world
  • image定义我们是从拉动基本图像(图像可以从公共Docker注册表,私人注册,或当地建造)。 在这种情况下,我们使用Nginx图像。
  • script简单地定义了Drone应执行的命令,以及以什么顺序。 你可以用另一种定义多个脚本命令- <command here>在新的一行。 (确保标签排队!)

这个脚本只是回应“hello world”来证明Drone正在工作。 它实际上没有测试任何关于你的代码。

在真正的构建和测试场景中,您希望让Drone使用与您的生产环境匹配的Docker映像,并且您希望脚本测试存储库中的代码。

现在,提交您.drone.yml文件到您的存储库。 这种承诺,并且在未来进行任何其他提交(任何文件,而不仅仅是.drone.yml文件),将触发网络挂接雄蜂放置在你的仓库。 Drone现在应该努力工作拉基本镜像,并运行您的构建脚本!

Drone将检测到新的提交,克隆到代码所做的任何更改,并按照规定的说明.drone.yml文件。 它将在页面底部显示一个通知,让您知道构建正在运行,单击它以查看构建状态页面。

Drone工人

构建将需要几分钟,因为Drone需要从Docker公共注册表中获取映像。

如果构建通过,您可以单击提交以查看更多详细信息。 您应该看到类似以下的输出:

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

您可能还会看到一些与Perl相关的警告; 没关系。

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

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

DRONE_BITBUCKET_CLIENT
DRONE_BITBUCKET_SECRET
DRONE_GITLAB_URL
...

下一步

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

例如,如果你想使用一个测试框架,如噶或摩卡测试节点的应用程序,您可以更改image部分官方node的图像,并改变脚本部分执行npm和运行测试! 看看周围的一看Docker登记为可能适合你的应用程序的图像。

如果你想获得真正看中的,你可以看看一些所谓的Drone华尔街提供您的所有版本状态的显示板。

有乐趣指挥你的Drone!