介绍
谁不愿意! Drone.io使用Docker容器来运行你的测试,并与 GitHub、 GitLab(自托和基于服务)和 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。
点击右上角的注册新申请
按钮,这将带来一个新的表格来填写:
添加您的 应用程序名称. 您的 ** 主页 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
. 您应该看到一个登录屏幕,如下:
我们只看到GitHub,因为它是我们在Dockerfile中设置的唯一服务。
现在点击 ** GitHub ** 按钮,然后点击 ** 授权应用程序 ** 按钮来启动登录和同步过程。
这是 Drone 的主要仪表板,您可以在您的 GitHub 帐户中查看三个最新的存储库,并通过点击浏览全部
来扩展列表。
感觉自由探索仪表板。
接下来,我们需要允许访问您的各种Git库源。
步骤五:从 GitHub 运行构建
找到您想添加到 Drone CI 的存储库的名称并选择它,这将激活 Drone 并将 Webhooks 添加到您的存储库中。
激活后,您将看到空的存储库状态页面:
您可以使用右上角的按钮探索一些更高级的存储库设置。
.drone.yml 檔案
我们需要在存储库中创建一个名为.drone.yml
的新文件,这将命令无人机,并告诉它如何在GitHub存储库中构建和测试代码。
1image: dockerfile/nginx
2script:
3 - echo hello world
*图像
定义了我们从中抽取的基本图像(图像可以来自公共Docker注册表,私人注册表或本地建造)。在这种情况下,我们正在使用 Nginx图像。
*脚本
简单地定义了无人机应该执行的命令,并以何种顺序。
这个脚本只是响起你好世界
来证明无人机正在工作. 它实际上没有测试你的代码。
在真正的构建和测试场景中,你想让无人机使用与你的生产环境相匹配的Docker图像,你想让脚本在库中测试代码。
现在,将您的.drone.yml 文件委托到您的存储库. 这个委托,以及您在未来所做的任何其他委托(对于任何文件,不仅是.drone.yml 文件),将触发在您的存储库中放置的 Webhook 无人机。
无人机将检测新的委托,克隆对代码所做的任何更改,并遵循在.drone.yml 文件中定义的指示,它将在页面底部显示通知,让你知道构建正在运行,点击它以查看构建状态页面。
构建需要几分钟,因为无人机需要从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 注册表中查看可能适合您的应用程序的图像。
如果你想得到真正的幻想,你可以看看一些叫做 无人机墙的内容,以提供你所有的构建状态的显示板。
开心地控制你的无人机!