如何在CoreOS和Docker上使用Drone.io执行持续集成测试
介绍
想要一个最小设置的持续集成解决方案? 谁不会! Drone.io 使用 Docker 容器运行您的测试,并与 GitHub、GitLab(自托管和基于服务)和 Bitbucket[ X158X]。
Drone 使用 Go 构建并使用 Docker。 它可以在容器本身内部运行,只需很少的配置。
持续集成 是对代码库进行频繁提交并在进行中构建和测试的开发实践。 这意味着新代码将(希望)快速轻松地集成您现有的代码库。 由于持续集成需要您经常构建和测试代码,如果您可以自动构建和测试,它会加快开发过程。 无人机这样做; 它使构建和测试过程自动化。
Drone 从托管的 Git 存储库中自动提取代码,然后运行您定义的脚本。 您可以运行任何测试套件并让它通过电子邮件向您报告,或者在您的 README 中用徽章指示状态。 Drone 与 Docker 的集成意味着它可以支持大量语言,包括 PHP、Node、Ruby、Go 和 Python 等等。 每个测试都将根据 Docker 公共注册表中的指定图像生成一个新容器。 这意味着对语言和开发堆栈的支持只会随着创建更多图像而增加。 您甚至可以自己制作以适合您的特定应用!
在本教程中,我们将了解如何将 Drone.io 容器化,以便可以使用最小的 Linux 发行版 CoreOS 运行它。
要求
- 至少一个 SSH 密钥添加到您的帐户
- 单个 CoreOS Beta Droplet(512 MB RAM 可以正常工作)
如果您以前从未使用过操作系统,建议您在继续之前阅读此 CoreOS 简介。
如果您不确定如何使用 cloud-config
文件配置 CoreOS,您可以在 here 找到更多信息以及示例配置文件! 示例配置文件将适用于本教程。
第一步——准备 GitHub
在开始之前,我们需要启用通过 oAuth 访问我们的 GitHub 帐户。 我们将生成一对令牌,用于设置 Drone 容器的下一步。
我们需要从您的 GitHub 帐户生成这些值。 点击这里进入GitHub上相应的设置页面,名为Applications。
点击右上角的【X10X】注册新应用【X38X】按钮。 这将弹出一个新的表格来填写:
添加您的 应用程序名称 。 主页 URL 应该是 http://YOUR_DROPLET_IP:8080/
。 添加您的 应用程序描述 。
重要:确保 Authorization 回调 URL 设置为 http://YOUR_DROPLET_IP:8080/api/auth/github.com
以便正确验证!
设置完成后,单击 注册应用程序 以进入新应用程序的信息页面。
您需要从这里获取两位信息,Client ID 和 Client Secret。 (保持客户端秘密实际上是秘密! 这不是你应该与任何人分享的东西!)
这些令牌将用于授权我们自己的 Drone 应用程序向我们通过 Dashboard 面板添加到 Drone 的任何 GitHub 存储库添加 webhook。 webhook 将在我们推送到 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.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-ci,所以我们可以使用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。 打开您的网络浏览器并导航到:http://YOUR_DROPLET_IP:8080/login
。 您应该会看到如下所示的登录屏幕:
我们只看到 GitHub,因为它是我们在 Dockerfile 中设置的唯一服务。
现在点击 GitHub 按钮,然后点击 Authorize application 按钮开始登录和同步过程。
这是 Drone 的主仪表板,您可以在 GitHub 帐户中看到三个最新的存储库,然后单击“BROWSE ALL”展开列表。 如果您的所有存储库都没有出现,只需单击右上角的“SYNC”。
随意探索仪表板。
接下来,我们需要允许访问您的各种 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
文件)将触发放置在您的存储库中的 webhook Drone。 Drone 现在应该努力提取基础映像并运行您的构建脚本!
Drone 将检测新的提交,克隆对代码所做的任何更改,并按照 .drone.yml
文件中定义的说明进行操作。 它将在页面底部显示一条通知,让您知道构建正在运行,单击它可以查看构建状态页面。
构建需要几分钟,因为 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
以进行一些更高级的测试。
例如,如果您想使用 Karma 或 Mocha 等测试框架来测试 Node 应用程序,您可以将 image
部分更改为官方的 node
映像,并将脚本部分更改为执行npm
并运行测试! 查看 Docker 注册表 以获取可能适合您的应用程序的图像。
如果您想变得非常花哨,您可以查看名为 Drone Wall 的东西,以提供所有构建状态的显示板。
玩得开心指挥你的无人机!