我的名字是 叶夫根尼·切尔金,我是一家矿业公司开发团队的程序员 多金属.
当开始任何大型项目时,您开始思考:“最好使用什么软件来维护它?” IT 项目在发布下一个版本之前会经历多个阶段。 当这些阶段的链条实现自动化时,那就太好了。 发布 IT 项目本身新版本的自动化过程称为 持续整合. 构建机器人 事实证明,它是我们实施这一过程的好助手。
在这篇文章中,我决定概述可能性 构建机器人。 这个软件有什么功能? 如何接近他,如何与他建立正常有效的工作关系? 您可以通过创建一个工作服务来应用我们的经验,以便在您的计算机上构建和测试您的项目。
内容
内容
1. 为什么选择BuildBot?
之前在 habr-e 上我看到过有关实施的文章 持续整合 同 构建机器人. 例如,
停止! 有人在他们的项目中实际使用过它吗? 事实证明是的
那么人们使用的逻辑是什么呢? 建造机器人? 毕竟,还有其他工具: 巡航控制 и 詹金斯。 我就这样回答吧。 对于大多数任务 詹金斯 真相就足够了。 轮到时, 构建机器人 - 更具适应性,而问题的解决就像在 詹金斯。 这是你的选择。 但既然我们正在寻找一种用于开发目标项目的工具,为什么不选择一个能够从简单的步骤开始获得具有交互性和独特界面的构建系统的工具呢?
对于那些目标项目是用 python 编写的人来说,问题是:“为什么不选择一个在项目所使用的语言方面具有清晰界面的集成系统呢?” 现在是展示好处的时候了 构建机器人.
所以,我们的“器乐四重奏”。 就我自己而言,我确定了四个特征 构建机器人:
- 它是一个GPL许可下的开源框架
- 这是使用python作为配置工具以及所需操作的描述
- 这是从进行组装的机器接收响应的机会
- 最后,这些是主机的最低要求。 部署需要python和twisted,不需要虚拟机和java机。
2. BuildMaster主导的理念
任务分配架构的核心是 建造大师。 这是一项服务:
- 跟踪 项目源代码树中的更改
- 发送 Worker 服务应该执行的命令来构建项目并测试它
- 通知 用户了解所采取行动的结果
建造大师 通过文件配置 大师.cfg。 这个文件在根目录下 建造大师。 稍后我将展示如何创建这个根。 文件本身 大师.cfg 包含一个使用调用的 python 脚本 构建机器人.
下一个最重要的对象 构建机器人 它有一个名字 工人。 该服务可以在具有不同操作系统的另一台主机上启动,也可以在其中启动 建造大师。 它还可以存在于专门准备的虚拟环境中,具有自己的包和变量。 这些虚拟环境可以使用 python 实用程序来准备,例如 虚拟环境,venv.
建造大师 向所有人广播命令 工人-y,而他反过来又实现了这些目标。 也就是说,事实证明,构建和测试项目的过程可以继续下去 工人-e 运行 Windows 并在另一个运行 Linux 的 Worker 上。
结账 项目源代码出现在每个 工人-e。
3. 安装
那么,我们走吧。 我将使用 Ubuntu 18.04 作为主机。 我会在上面放一个 建造大师-a 和一 工人-A。 但首先你需要安装python3.7:
sudo apt-get update
sudo apt-get install python3.7
对于那些需要 python3.7.2 而不是 3.7.1 的人,可以执行以下操作:
sudo apt-get update
sudo apt-get software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3.7
sudo ln -fs /usr/bin/python3.7 /usr/bin/python3
pip3 install --upgrade pip
下一步是安装 发推文 и 构建机器人以及允许您使用附加功能的包 构建机器人-和。
/*Все что под sudo будет установленно для всех пользователей в директорию /usr/local/lib/python3.7/dist-packages*/
#На хосте который производит мониторинг Worker-ов
sudo pip install twisted #Библиотека twisted
sudo pip install buildbot #BuildMaster
#Дополнительный функционал
pip install pysqlite3 #Устанавливаем базу sqllite в учебных целях
pip install jinja2 #framework наподобие django, для web и для почтовых рассыллок
pip install autobahn #Web cокеты для связи BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #Для отображения схемы базы данных
#Для Web отображения BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #Отображение дат в web
#На стороне хоста который непосредственно осуществляет сборку и тестирование
pip install buildbot-worker #Worker
#Дополнительный функционал
sudo pip install virtualenv #Виртуальная среда
4. 第一步
创作时间 建造大师。 它将在我们的文件夹中 /home/habr/master.
mkdir master
buildbot create-master master # Собственно сдесь и создаем
mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password
当你跑步时 工人,那么默认情况下它将创建在 /home/habr/工人 具有项目名称的文件夹,该项目名称在中指定 大师.cfg。 并在项目名称的文件夹中创建一个目录 建立,并且会继续做下去 结帐。 工作目录 工人-它将成为一个目录 /home/habr/yourProject/build.
“金钥匙
现在我写上一段的目的是:一个脚本 总音量 将会要求来自 工人- 并且在此目录中远程完成的脚本不会被执行,因为该脚本没有运行权限。 要纠正这种情况,您需要一把钥匙
建造大师 и 工人 相互建立联系。 碰巧它会折断并且 工人 等待一段时间的回复 建造大师-A。 如果没有响应,则重新启动连接。 钥匙 --保持活动=60 只需要指明之后的时间 联接 重新启动。
5. 配置。 一步一步的食谱
布局 建造大师 是在我们执行命令的机器一侧进行的 创建主。 在我们的例子中,这是一个目录 /home/habr/master。 配置文件 大师.cfg 尚不存在,但命令本身已经创建了该文件 master.cmg.样本。 您需要将其重命名为 master.cfg.样本 в 大师.cfg
mv master.cfg.sample master.cfg
我们来打开这个 大师.cfg。 让我们看看它由什么组成。 之后,让我们尝试制作我们自己的配置文件。
大师.cfg
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
'git://github.com/buildbot/hello-world.git',
workdir='gitpoller-workdir', branch='master',
pollInterval=300))
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="all",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
name="force",
builderNames=["runtests"]))
factory = util.BuildFactory()
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
env={"PYTHONPATH": "."}))
c['builders'] = []
c['builders'].append(
util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
c['services'] = []
c['title'] = "Hello World CI"
c['titleURL'] = "https://buildbot.github.io/hello-world/"
c['buildbotURL'] = "http://localhost:8010/"
c['www'] = dict(port=8010,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite",
}
5.1 构建主配置
c = BuildmasterConfig = {}
构建主配置 — 配置文件的基本字典。 它必须包含在配置文件中。 为了方便使用,在配置代码中引入了别名 “C”... 名字
5.2工人
c['workers'] = [worker.Worker("example-worker", "pass")]
这次我们表明 建造大师-y 列表 工人-s。 我 工人 我们创造了
5.3 更改源
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
'git://github.com/buildbot/hello-world.git',
workdir='gitpoller-workdir', branch='master',
pollInterval=300))
通过按键 更改源 通过字典 c,我们可以访问要放置一个对象的列表,该对象用项目的源代码轮询存储库。 该示例使用按特定时间间隔轮询的 Git 存储库。
第一个参数是存储库的路径。
工作目录 代表侧面的文件夹路径 工人-a 相对于路径 /home/habr/worker/yourProject/build git 将存储存储库的本地版本。
科 包含存储库中应遵循的特定分支。
轮询间隔 包含之后的秒数 建造大师 将轮询存储库以了解更改。
有多种方法可以跟踪项目存储库的更改。
最简单的方法是 轮询,这意味着 建造大师 定期使用存储库轮询服务器。 如果 承诺 反映存储库中的更改,然后 建造大师 将创建一个带有一定延迟的内部对象 更改 并将其发送到事件处理程序 调度,这将启动构建和测试项目的步骤 工人-e。 其中会标明这些步骤 更新 存储库。 正好在 工人这将创建存储库的本地副本。 此过程的详细信息将在接下来的两节中介绍。 (
跟踪存储库更改的一种更优雅的方法是将消息直接从托管存储库的服务器发送到 建造大师- 关于更改项目源代码。 在这种情况下,开发商一旦做出 承诺,有项目仓库的服务器会发送一条消息 建造大师-y。 反过来,他将通过创建一个对象来拦截它 PB变更源。 接下来,这个对象将被传输到 调度,这将激活构建项目并测试它的步骤。 该方法的一个重要部分是与 钩- 存储库中的服务器脚本。 在脚本中 钩-a,负责处理动作时 承诺-e,您需要调用该实用程序 发送更改 并指定网络地址 建造大师-A。 您还需要指定将侦听的网络端口 PB变更源. PB变更源顺便说一句,是一部分 建造大师-A。 此方法需要许可 管理员-a 在项目存储库所在的服务器上。 您首先需要对存储库进行备份。
5.4 调度程序
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="all",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
name="force",
builderNames=["runtests"]))
调度 – 这是一个充当触发器的元素,启动项目的整个组装和测试链。
那些被记录的变化 更改源,在工作过程中转变 构建机器人-a 表示反对 更改 现在每个 调度器 基于它们,它构建请求以启动项目构建过程。 但是,它还确定何时将这些请求进一步传输到队列。 一个东西
我们看到在当前的例子中这样 调度 已创建 2 件。 而且,每种都有自己的类型。
单分支调度器 – 日程表上最受欢迎的课程之一。 它监视一个分支并由其中记录的更改触发。 当他看到变化时,他可以延迟发送构建请求(延迟特殊参数中指定的时间段) 树稳定定时器) 在 姓名 设置将在其中显示的计划的名称 构建机器人-网络界面。 在 更改过滤器 设置一个过滤器,通过后分支中的更改会提示调度发送构建请求。 在 建造者名称 名称已显示 建设者-a,我们稍后会设置。 在我们的例子中,名称将与项目名称相同: 你的项目.
强制调度器 很简单的事情。 这种类型的计划是通过鼠标点击触发的 构建机器人-网络界面。 这些参数的本质与 单分支调度器.
附注3。 也许它会派上用场
定期 是按特定时间固定频率运行的计划。 通话看起来像这样
from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
builderNames=["full-solaris"],
periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]
5.5 构建工厂
factory = util.BuildFactory()
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
env={"PYTHONPATH": "."}))
周期性构建定时器 指定该周期的时间(以秒为单位)。
建造工厂 创建一个特定的 建立,然后 建设者 发送至 工人。 在 建造工厂 表示要遵循的步骤 工人-y。 通过调用方法添加步骤 添加步骤
本例中第一个添加的步骤是 git clean -d -f -f –x然后 git结帐。 这些动作包含在参数中 方法,没有明确说明,但暗示了默认值 新鲜... 范围 模式='增量' 表示文件来自所在目录 查乔特,虽然从存储库中丢失,但保持不变。
添加的第二步是调用脚本 试用 带参数 hello 在一边 工人-a 来自目录 /home/habr/worker/yourProject/build 使用环境变量 PATHONPATH=... 因此,您可以编写自己的脚本并在侧面执行它们 工人-a 每一步 util.Shell命令。 这些脚本可以直接放入存储库中。 然后在 查乔特-e 他们会陷入 /home/habr/worker/yourProject/build。 然而,还有两个“但是”:
- 工人 必须用密钥创建
--umask 这样它就不会阻止之后的执行权 结帐-和。 - 在 git推-e 这些脚本中你需要指定的属性 可执行的以便以后 查乔特-e 不失去执行Git脚本的权利。
5.6 建设者
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
关于什么是 生成器 被告知
c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
workernames=["yourWorkerName"],
factory=factory))
现在我给大家介绍一下参数 构建器配置.
姓名 指定名称 建设者-A。 这里我们把它命名为 你的项目... 这意味着在 工人- 将创建这条路径 /home/habr/worker/yourProject/build. 调度器 寻找 建设者 就凭这个名字。
工人姓名 包含表 工人-s。 其中每一项都必须添加到 c['工人'].
工厂 - 具体的 建立,与之相关联 建设者。 他将发送该对象 建立 上 工人 完成此中包含的所有步骤 建立-和。
6. 自己的配置示例
这是我建议通过以下方式实现的示例项目架构 构建机器人
.
我们将用作版本控制系统 svn。 存储库本身将位于某种云中。 这是这个云的地址
建造大师 и 工人 在同一主机上运行 项目.主机 .建造大师 将其文件存储在文件夹中 /home/habr/master. 工人 它存储在以下路径中 /home/habr/工人。 进程通讯 建造大师-a 我 工人-a 根据协议通过4000端口进行 构建机器人-a,即 '铅' 协议。
目标项目完全用Python编写。 任务是跟踪其更改、创建可执行文件、生成文档并进行测试。 如果失败,所有开发人员都需要通过电子邮件发送消息,说明操作不成功。
网页展示 构建机器人 我们将连接到端口 80 项目.主机。 不需要安装Apatch。 作为图书馆的一部分 双绞线 已经有一个网络服务器, 构建机器人 使用它。
存储内部信息 构建机器人 будемиспользовать 轻石.
邮寄时需要主机 smtp.您的域名 - 它允许从邮件发送信件 [电子邮件保护] 无需身份验证。 也在主机上'SMTP ' 会议纪要在 1025 号后听取。
这个过程有两个人参与: 管理员 и 用户。 管理员管理 构建机器人。 用户是提交的人 承诺-s。
可执行文件是通过生成的 安装程序。 文档是通过生成的 多氧.
对于这个架构我写了这个: 大师.cfg:
大师.cfg
import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
c['workers'] = [ worker.Worker('yourWorkerName', 'password') ]
c['protocols'] = {'pb': {'port': 4000}}
svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
svnuser="user",
svnpasswd="password",
pollinterval=60,
split_file=util.svn.split_file_alwaystrunk
)
c['change_source'] = svn_poller
hourlyscheduler = schedulers.SingleBranchScheduler(
name="your-project-schedulers",
change_filter=util.ChangeFilter(branch=None),
builderNames=["yourProject"],
properties = {'owner': 'admin'}
)
c['schedulers'] = [hourlyscheduler]
checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
mode='full',
method='fresh',
username="user",
password="password",
haltOnFailure=True)
projectHost_build = util.BuildFactory()
cleanProject = steps.ShellCommand(name="Clean",
command=["buildbot/worker_linux/pyinstaller_project", "clean"]
)
buildProject = steps.ShellCommand(name="Build",
command=["buildbot/worker_linux/pyinstaller_project", "build"]
)
doxyProject = steps.ShellCommand(name="Update Docs",
command=["buildbot/worker_linux/gendoc", []]
)
testProject = steps.ShellCommand(name="Tests",
command=["python","tests/utest.py"],
env={'PYTHONPATH': '.'}
)
projectHost_build.addStep(checkout)
projectHost_build.addStep(cleanProject)
projectHost_build.addStep(buildProject)
projectHost_build.addStep(doxyProject)
projectHost_build.addStep(testProject)
c['builders'] = [
util.BuilderConfig(name="yourProject", workername='yourWorkerName', factory=projectHost_build)
]
template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=True,
lookup="your.domain",
relayhost="smtp.your.domain",
smtpPort=1025,
mode="warnings",
extraRecipients=['[email protected]'],
messageFormatter=reporters.MessageFormatter(
template=template_html,
template_type='html',
wantProperties=True,
wantSteps=True)
)
c['services'] = [sendMessageToAll]
c['title'] = "The process of bulding"
c['titleURL'] = "http://project.host:80/"
c['buildbotURL'] = "http://project.host"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}
首先你需要
下一步是启动服务 建造大师小号
sudo buildbot start /home/habr/master
然后启动服务 工人-a
buildbot-worker start /home/habr/worker
准备好! 现在 建造机器人 将跟踪变化并触发 承诺-y 在 svn,执行使用上述架构构建和测试项目的步骤。
下面我将描述上面的一些特点 大师.cfg
6.1 前往 master.cfg 的路上
在写我的 大师.cfg 会出现很多错误,因此需要读取日志文件。 它存储为 建造大师-ec 绝对路径 /home/habr/master/twistd.log,以及侧面 工人-a 带有绝对路径 /home/habr/worker/twistd.log。 当您阅读错误并修复它时,您将需要重新启动服务 建造大师-A。 其操作方法如下:
sudo buildbot stop /home/habr/master
sudo buildbot upgrade-master /home/habr/master
sudo buildbot start /home/habr/master
6.2 使用 svn
svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
svnuser="user",
svnpasswd="password",
pollinterval=60,
split_file=util.svn.split_file_alwaystrunk
)
c['change_source'] = svn_poller
hourlyscheduler = schedulers.SingleBranchScheduler(
name="your-project-schedulers",
change_filter=util.ChangeFilter(branch=None),
builderNames=["yourProject"],
properties = {'owner': 'admin'}
)
c['schedulers'] = [hourlyscheduler]
checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
mode='full',
method='fresh',
username="user",
password="password",
haltOnFailure=True)
首先我们来看看 svn_poller。 这仍然是相同的界面,每分钟定期轮询存储库一次。 在这种情况下 svn_poller 只访问分支 树干。 神秘参数 split_file=util.svn.split_file_alwaystrunk 设置规则:如何分解文件夹结构 svn 在树枝上。 他还为他们提供了相对路径。 轮到时 split_file_alwaysstrunk 通过说存储库仅包含来简化过程 树干.
В 调度器 被指出 更改过滤器谁看到 不包含 并将一个分支与其关联 树干 根据给定的关联 split_file_alwaysstrunk。 应对变化 树干, 发射 建设者 有名字 你的项目.
这里需要它,以便管理员作为流程所有者接收构建和测试结果的邮件列表。
步骤 建立-a 结帐 能够完全删除位于存储库本地版本中的任何文件 工人-A。 然后做完整的 SVN 更新。 模式通过参数配置 模式=完整, 方法=新鲜... 范围 暂停 说如果 SVN 更新 执行时会出错,那么整个构建和测试过程应该暂停,因为进一步的操作没有意义。
6.3 致您的信:记者有权声明
记者 是一项通过电子邮件发送通知的服务。
template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=True,
lookup="your.domain",
relayhost="smtp.your.domain",
smtpPort=1025,
mode="warnings",
extraRecipients=['[email protected]'],
messageFormatter=reporters.MessageFormatter(
template=template_html,
template_type='html',
wantProperties=True,
wantSteps=True)
)
c['services'] = [sendMessageToAll]
他可以发消息
邮件通知程序 使用电子邮件发送通知。
模板_html 设置时事通讯的文本模板。 HTML 用于创建标记。 它是由引擎修改的
邮件通知程序 包含以下参数。
来自地址 – 每个人都会收到时事通讯的地址。
发送给感兴趣的用户=True 向创建者和用户发送消息 承诺.
查找 — 必须添加到接收新闻通讯的用户姓名中的后缀。 所以 管理员 用户如何在该地址接收新闻通讯 [电子邮件保护].
中继主机 指定打开服务器的主机名 SMTP,以 简单端口 指定监听的端口号 SMTP 服务器。
模式=“警告” 表示只有在至少有一个步骤的情况下才应该进行邮寄 建立-a,以状态失败或警告结束。 如果成功,则无需发送新闻通讯。
额外收件人 除了邮件所有者和执行邮件的人之外,还包含邮件应发送给的人员列表 承诺.
消息格式化程序 是一个对象,指定消息格式、其模板以及一组可用的变量 神社2。 选项如 想要属性=真 и 想要步骤=真 定义这组可用变量。
with['services']=[sendMessageToAll] 提供服务列表,其中我们的服务包括 记者.
我们做到了! 恭喜你
我们创建了自己的配置并看到了它所具有的功能。 构建机器人。 我认为这足以了解创建您的项目是否需要该工具。 你对他感兴趣吗? 它对你有用吗? 和他一起工作舒服吗? 那我写这篇文章也不是白写的。
并进一步。 我希望专业社区使用 构建机器人,变得更广泛,手册被翻译,甚至还有更多的例子。
感谢大家的关注。 祝你好运。
来源: habr.com