我的名字是 葉夫根尼·切爾金,我是一家礦業公司開發團隊的程式設計師 多金屬.
當開始任何大型專案時,您開始思考:“最好使用什麼軟體來維護它?” IT 專案在發布下一個版本之前會經歷多個階段。 當這些階段的鏈條實現自動化時,那就太好了。 發布 IT 專案本身新版本的自動化流程稱為 持續集成. 建構機器人 事實證明,它是我們實施這一過程的好助手。
在這篇文章中,我決定概述可能性 建構機器人。 這個軟體有什麼功能? 如何接近他,如何與他建立正常且有效的工作關係? 您可以透過建立工作服務來應用我們的經驗,以便在您的電腦上建置和測試您的專案。
Содержание
Содержание
1. 為什麼選擇BuildBot?
之前在 habr-e 上我看到過有關實施的文章 持續集成 同 建構機器人。 例如,
停止! 有人在他們的專案中實際使用過它嗎? 事實證明是的
那麼人們使用的邏輯是什麼呢? 建造機器人? 畢竟,還有其他工具: 巡航控制 и 詹金斯。 我就這樣回答吧。 對於大多數任務 詹金斯 真相就足夠了。 輪到時, 建構機器人 - 更具適應性,而問題的解決就像在 詹金斯。這是你的選擇。但既然我們正在尋找一種用於開發目標專案的工具,為什麼不選擇一個能夠從簡單的步驟開始獲得具有互動性和獨特介面的建置系統的工具呢?
對於那些目標專案是用 python 編寫的人來說,問題是:“為什麼不選擇一個在專案所使用的語言方面具有清晰界面的整合系統呢?” 現在是展示好處的時候了 建構機器人.
所以,我們的「器樂四重奏」。 就我自己而言,我確定了四個特徵 建構機器人:
- 它是一個GPL許可下的開源框架
- 這是使用python作為配置工具以及所需操作的描述
- 這是從進行組裝的機器接收回應的機會
- 最後,這些是主機的最低要求。 部署需要python和twisted,不需要虛擬機器和java機器。
2. BuildMaster主導的理念
任務分配架構的核心是 建造大師。 這是一項服務:
- 跟踪 專案原始碼樹中的更改
- 發送 Worker 服務應該執行的命令來建立專案並測試它
- 通知 使用者了解所採取行動的結果
建造大師 透過檔案配置 主控設定檔。 這個檔案在根目錄下 建造大師。 稍後我將展示如何創建這個根。 文件本身 主控設定檔 包含一個使用呼叫的 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
下一步是安裝 發推文 и 建構機器人以及允許您使用附加功能的套件 建構機器人-a。
/*Все что под 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/工人 具有項目名稱的資料夾,該項目名稱在中指定 主控設定檔。 並在專案名稱的資料夾中建立目錄 建立,並且會繼續做下去 結帳。 工作目錄 工作者-它將成為一個目錄 /home/habr/yourProject/build.
「金鑰匙
現在我寫上一段的目的是:一個腳本 碩士 將會要求來自 工作者- 並且在該目錄下遠端完成的腳本不會被執行,因為該腳本沒有運行權限。 要糾正這種情況,您需要一把鑰匙
建造大師 и 工作者 相互建立聯繫。 碰巧它會折斷並且 工作者 等待一段時間的回复 建造大師-A。 如果沒有回應,則重新啟動連線。 鑰匙 --保持活動=60 只需要指明之後的時間 連 重新啟動。
5. 配置。一步一步的食譜
組態 建造大師 是在我們執行命令的機器一側進行的 建立主控。 在我們的例子中,這是一個目錄 /home/habr/master。 設定檔 主控設定檔 尚不存在,但命令本身已經創建了該文件 master.cmg.樣本。 您需要將其重命名為 master.cfg.樣本 в 主控設定檔
mv master.cfg.sample master.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,我們稍後會設定。 在我們的例子中,名稱將與項目名稱相同: 你的專案.
強制調度器 很簡單的事。 這種類型的計劃是透過滑鼠點擊觸發的 建構機器人-網路介面。 這些參數的本質與 單分支調度器.
附:第三。也許它會派上用場
定期 是按特定時間固定頻率運轉的計劃。通話看起來像這樣
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結帳。 這些動作包含在參數中 方法,沒有明確說明,但暗示了預設值 新鮮。 範圍 模式='增量' 表示檔案來自所在目錄 查喬特,雖然從存儲庫中丟失,但保持不變。
新增的第二步是呼叫腳本 審訊 帶參數 你好 在一邊 工作者-a 來自目錄 /home/habr/worker/yourProject/build 使用環境變數 PATHONPATH=... 因此,您可以編寫自己的腳本並在側面執行它們 工作者-a 每一步 util.Shell命令。 這些腳本可以直接放入儲存庫中。 然後在 查喬特-e 他們會陷入 /home/habr/worker/yourProject/build。 然而,還有兩個「但是」:
- 工作者 必須用密鑰創建
--umask 這樣它就不會阻止之後的執行權 結帳-a。 - 在 git push-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['工人'].
工廠 - 具體的 建立,與之相關聯 建設者。 他將發送該對象 建立 上 工作者 完成此中包含的所有步驟 建立-a。
6. 自己的設定範例
這是我建議透過以下方式實現的範例專案架構 建構機器人
.
我們將用作版本控制系統 SVN。 儲存庫本身將位於某種雲端。 這是這個雲端的位址
建造大師 и 工作者 在同一主機上執行 專案.主機 .建造大師 將其檔案儲存在資料夾中 /home/habr/master. 工作者 它儲存在以下路徑中 /home/habr/工人。 行程通訊 建造大師-a 和 工作者-a 根據協定透過4000連接埠進行 建構機器人-a,即 '鉛' 協定.
目標專案完全用Python編寫。 任務是追蹤其更改、建立可執行檔、生成文件並進行測試。 如果失敗,所有開發人員都需要透過電子郵件發送訊息,說明操作不成功。
網頁展示 建構機器人 我們將連接到連接埠 80 專案.主機。 不需要安裝Apatch。 作為圖書館的一部分 雙絞線 已經有網路伺服器, 建構機器人 使用它。
儲存內部資訊 建構機器人 будемиспользовать 源碼.
郵寄時需要主機 smtp.您的域名 - 它允許從郵件發送信件 [電子郵件保護] 無需身份驗證。 也在主機上'SMTP ' 會議紀要在 1025 號後聽取。
這個過程有兩個人參與: 管理員 и 用戶。 管理員管理 建構機器人。 用戶是提交的人 承諾-s。
可執行檔是透過產生的 py安裝程式。 文件是透過產生的 強力氧.
對於這個架構我寫了這個: 主控設定檔:
主控設定檔
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,執行使用上述架構建置和測試專案的步驟。
下面我將描述上面的一些特點 master.cfg。
6.1 前往 master.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] 提供服務列表,其中我們的服務包括 記者.
我們做到了! 恭喜你
我們創建了自己的配置並看到了它所具有的功能。 建構機器人。 我認為這足以了解創建您的專案是否需要該工具。 你對他有興趣嗎? 它對你有用嗎? 跟他一起工作舒服嗎? 那我寫這篇文章也不是白寫的。
並進一步。 我希望專業社群使用 建構機器人,變得更廣泛,手冊被翻譯,甚至還有更多的例子。
感謝大家的關注。 祝你好運。
來源: www.habr.com