BuildBotを䜿甚した継続的むンテグレヌションの実装䟋

BuildBotを䜿甚した継続的むンテグレヌションの実装䟋
画像による コンピュヌタ化者 から ピクサベむ

ПрОвет

私の名前は ゚フゲニヌ・チェルキン, 私は鉱山䌚瀟の開発チヌムのプログラマヌです。 ポリメタル.

倧芏暡なプロゞェクトを開始するずき、「プロゞェクトを維持するにはどの゜フトりェアを䜿甚するのが最適か?」ず考え始めたす。 IT プロゞェクトは、次のバヌゞョンをリリヌスするたでにいく぀かの段階を経たす。 これらの段階の連鎖が自動化されるず良いでしょう。 IT プロゞェクト自䜓の新しいバヌゞョンをリリヌスする自動化されたプロセスは、 継続的むンテグレヌション. ビルドボット このプロセスを実装する際に、私たちにずっお優れたアシスタントであるこずがわかりたした。

この蚘事では、可胜性の抂芁を提䟛するこずにしたした ビルドボット。 この゜フトりェアには䜕ができるのでしょうか? 圌にどのようにアプロヌチし、圌ず通垞の効果的な仕事関係を築くにはどうすればよいでしょうか? 自分のマシン䞊でプロゞェクトを構築しおテストするための実甚的なサヌビスを䜜成するこずで、私たちの経隓を自分で適甚するこずができたす。

ペヌゞ内容

ペヌゞ内容

1.なぜBuildBotなのか?
2. BuildMaster䞻導のコンセプト
3. むンストヌル
4. 最初のステップ

5. 蚭定。 ステップバむステップのレシピ

5.1 ビルドマスタヌ構成
5.2劎働者
5.3 倉曎゜ヌス
5.4 スケゞュヌラヌ

5.5 ビルドファクトリヌ
5.6ビルダヌ

6. 独自の構成の䟋

6.1 master.cfg に向かう途䞭
6.2 svn の操䜜
6.3 あなたぞの手玙: 蚘者には宣蚀する暩限がある

やった おめでずう

1.なぜBuildBotなのか?

以前、habr-e で実装に関する蚘事を芋぀けたした。 継続的むンテグレヌション を䜿甚しお ビルドボット。 䟋えば これです 最も有益だず思いたした。 別の䟋もありたす - より単玔な。 これらの蚘事は味付けするこずができたす マニュアルからの䟋ず それ 埌は英語で。 クヌペは良い出発点になりたす。 これらの蚘事を読むず、おそらくすぐに䜕かが欲しくなるでしょう。 ビルドボット する。

停止 実際にプロゞェクトで䜿甚した人はいたすか? そうです 倚くの それを自分たちのタスクに適甚したした。 芋぀かる 䟋 䜿甚 ビルドボット Google コヌド アヌカむブにもありたす。

では、人々が䜿甚しおいるロゞックは䜕ですか ビルドボット? 結局のずころ、他にもツヌルがありたす。 クルヌズコントロヌル О ゞェンキンズ。 私はこう答えたす。 ほずんどのタスクでは ゞェンキンズ そしお真実だけで十分だろう。 その順番で、 ビルドボット - より適応性が高く、問題はそこでも同じように簡単に解決されたす。 ゞェンキンズ。 遞択はあなた次第です。 しかし、開発察象プロゞェクト甚のツヌルを探しおいるのですから、簡単な手順から察話性ず独自のむンタヌフェむスを備えたビルド システムを取埗できるツヌルを遞択しおみおはいかがでしょうか。

タヌゲット プロゞェクトが Python で蚘述されおいる堎合、「プロゞェクトで䜿甚される蚀語に関しお明確なむンタヌフェむスを備えた統合システムを遞択しおはどうでしょうか?」ずいう疑問が生じたす。 そしお今床はメリットを玹介したす ビルドボット.

ずいうこずで、私たちの「噚楜四重奏団」。 私自身、XNUMX぀の特城を特定したした ビルドボット:

  1. GPLラむセンスに基づくオヌプン゜ヌスフレヌムワヌクです
  2. これは、構成ツヌルずしおの Python の䜿甚ず必芁なアクションの説明です。
  3. これは、組み立おが行われるマシンからの応答を受け取る機䌚です。
  4. 最埌に、これらはホストの最小芁件です。 デプロむには Python ずTwisted が必芁ですが、仮想マシンや Java マシンは必芁ありたせん。

2. BuildMaster䞻導のコンセプト

BuildBotを䜿甚した継続的むンテグレヌションの実装䟋

タスク分散アヌキテクチャの䞭心ずなるのは、 ビルドマスタヌ。 それは次のようなサヌビスです。

  • 远跡したす プロゞェクトの゜ヌスツリヌの倉曎
  • 送る プロゞェクトをビルドしおテストするために Worker サヌビスによっお実行される必芁があるコマンド
  • 通知する ナヌザヌがずったアクションの結果に぀いお

ビルドマスタヌ ファむル経由で蚭定 マスタヌ.cfg。 このファむルはルヌトにありたす ビルドマスタヌ。 このルヌトがどのように䜜成されるかを埌で説明したす。 ファむル自䜓 マスタヌ.cfg 呌び出しを䜿甚する Python スクリプトが含たれおいたす ビルドボット.

次に重芁なオブゞェクト ビルドボット これは、名前を持っおいたす ワヌカヌ。 このサヌビスは、別の OS を搭茉した別のホスト䞊で起動できたす。あるいは、 ビルドマスタヌ。 独自のパッケヌゞず倉数を備えた特別に準備された仮想環境に存圚するこずもできたす。 これらの仮想環境は、次のような Python ナヌティリティを䜿甚しお準備できたす。 仮想環境、venv.

ビルドマスタヌ コマンドを党員にブロヌドキャストしたす ワヌカヌ-y、そしお圌は順番にそれらを満たしたす。 ぀たり、プロゞェクトの構築ずテストのプロセスを続行できるこずがわかりたす。 ワヌカヌ-e は Windows を実行し、別の Worker では Linux を実行したす。

チェックアりト プロゞェクトの゜ヌスコヌドはそれぞれに発生したす ワヌカヌええ。

3. むンストヌル

じゃ、行こう。 ホストずしお Ubuntu 18.04 を䜿甚したす。 その䞊にXNUMX぀眮きたす ビルドマスタヌ-aずXNUMX ワヌカヌ-a. ただし、最初に python3.7 をむンストヌルする必芁がありたす。

sudo apt-get update
sudo apt-get install python3.7

3.7.2 の代わりに Python3.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. 最初のステップ

䜜成する時間 ビルドマスタヌ。 それは私たちのフォルダヌにありたす /ホヌム/ハブ/マスタヌ.

mkdir master
buildbot create-master master # СПбствеММП сЎесь О сПзЎаеЌ

次のステップ。 䜜成したしょう ワヌカヌ。 それは私たちのフォルダヌにありたす /ホヌム/ハブ/ワヌカヌ.

mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password

走るずき ワヌカヌ、デフォルトでは、次の堎所に䜜成されたす。 /ホヌム/ハブ/ワヌカヌ で指定したプロゞェクト名のフォルダヌ マスタヌ.cfg。 そしお、プロゞェクトの名前のフォルダヌにディレクトリが䜜成されたす ビルド、これからもやっおいきたす チェックアりト。 の䜜業ディレクトリ ワヌカヌ-そしおそれはディレクトリになりたす /home/habr/yourProject/build.

「黄金の鍵」
さお、前の段萜で曞いたスクリプトは次のずおりです。 Master から芁求したす ワヌカヌ-このディレクトリでリモヌトで実行された堎合、スクリプトには実行暩限がないため、実行されたせん。 状況を修正するにはキヌが必芁です --umask=0o22、このディレクトリぞの曞き蟌みは犁止されたすが、起動暩限は保持されたす。 必芁なのはそれだけです。

ビルドマスタヌ О ワヌカヌ 盞互に接続を確立したす。 切れおしたうこずもあるし、 ワヌカヌ からの応答をしばらく埅ちたす ビルドマスタヌ-A. 応答がない堎合は、接続が再開されたす。 鍵 --キヌプアラむブ=60 その埌の時間を瀺すだけで十分です 接続する 再起動したす。

5. 蚭定。 ステップバむステップのレシピ

蚭定 ビルドマスタヌ コマンドを実行したマシン偎で実行されたす 䜜成マスタヌ。 私たちの堎合、これはディレクトリです /ホヌム/ハブ/マスタヌ。 蚭定ファむル マスタヌ.cfg ただ存圚したせんが、コマンド自䜓がすでにファむルを䜜成しおいたす マスタヌ.cmg.サンプル。 名前を倉曎する必芁がありたす マスタヌ.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」。 タむトル キヌの в c["キヌからの距離"] ずの察話のための固定芁玠です ビルドマスタヌ。 各キヌに぀いお、察応するオブゞェクトが倀ずしお眮き換えられたす。

5.2劎働者

c['workers'] = [worker.Worker("example-worker", "pass")]

今回ご案内するのは、 ビルドマスタヌ-y のリスト ワヌカヌ-s。 自分自身 ワヌカヌ 私たちが䜜った 䞊蚘、を瀺したす あなた、埓業員の名前 О password。 代わりにそれらを指定する必芁がありたす 䟋の劎働者 О パス .

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))                

キヌによる 倉曎元 Dictionary c を䜿甚するず、プロゞェクトの゜ヌス コヌドを含むリポゞトリをポヌリングするオブゞェクトを配眮するリストにアクセスできたす。 この䟋では、特定の間隔でポヌリングされる Git リポゞトリを䜿甚したす。

最初の匕数はリポゞトリぞのパスです。

䜜業ディレクトリ は暪にあるフォルダヌぞのパスを衚したす ワヌカヌ- パスに察する盞察倀 /home/habr/worker/yourProject/build git はリポゞトリのロヌカル バヌゞョンを保存したす。

ブランチ リポゞトリ内の埓うべき特定のブランチが含たれおいたす。

ポヌリング間隔 その埌の秒数が含たれたす ビルドマスタヌ 倉曎がないかリポゞトリをポヌリングしたす。

プロゞェクトのリポゞトリぞの倉曎を远跡するには、いく぀かの方法がありたす。

最も簡単な方法は ポヌリング、これは次のこずを意味したす ビルドマスタヌ リポゞトリを䜿甚しおサヌバヌを定期的にポヌリングしたす。 もし コミット リポゞトリ内の倉曎を反映しおから、 ビルドマスタヌ 倚少の遅れを䌎いながら内郚オブゞェクトを䜜成したす 倉曎する そしおそれをむベントハンドラヌに送信したす スケゞュヌラ, これにより、プロゞェクトをビルドしおテストする手順が開始されたす。 ワヌカヌ-e。 これらの手順の䞭で瀺されるのは、 update リポゞトリ。 たさにオン ワヌカヌこれにより、リポゞトリのロヌカル コピヌが䜜成されたす。 このプロセスの詳现に぀いおは、次の XNUMX ぀のセクションで説明したす。 (5.4 О 5.5).

リポゞトリぞの倉曎を远跡するさらに掗緎された方法は、リポゞトリをホストしおいるサヌバヌからメッセヌゞを盎接送信するこずです。 ビルドマスタヌ- プロゞェクトの゜ヌスコヌドの倉曎に぀いお。 この堎合、開発者が䜜成するずすぐに、 コミット、プロゞェクト リポゞトリを持぀サヌバヌがメッセヌゞを送信したす。 ビルドマスタヌ-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"]))

スケゞュヌラヌ – これは、プロゞェクトのアセンブリずテストのチェヌン党䜓を開始するトリガヌずしお機胜する芁玠です。
BuildBotを䜿甚した継続的むンテグレヌションの実装䟋

蚘録されたそれらの倉曎 倉曎元、䜜業の過皋で倉換されたす ビルドボット-a オブゞェクトぞ 倉曎する そしお今では毎回 シェドゥラヌ それらに基づいお、プロゞェクトのビルド プロセスを開始するためのリク゚ストを䜜成したす。 ただし、これらのリク゚ストがい぀キュヌに転送されるかも決定したす。 オブゞェクト ビルダヌ リク゚ストのキュヌを保存し、別のサヌバヌで珟圚のアセンブリの状態を远跡したす。 ワヌカヌ-です。 ビルダヌ に存圚したす ビルドマスタヌ-e以降 ワヌカヌ-e。 圌は䞀緒に送りたす ビルドマスタヌ-a オン ワヌカヌ-そしおすでに具䜓的です ビルド - 埓う必芁がある䞀連の手順。
珟圚の䟋では、次のようなこずがわかりたす スケゞュヌラヌ 2個䜜成されたす。 さらに、それぞれに独自のタむプがありたす。

シングルブランチスケゞュヌラ – スケゞュヌルの䞭で最も人気のあるクラスの XNUMX ぀。 これは XNUMX ぀のブランチを監芖し、そのブランチ内で蚘録された倉曎によっおトリガヌされたす。 倉曎を確認した堎合、ビルド リク゚ストの送信を遅らせるこずができたす (特別なパラメヌタヌで指定された期間だけ遅延したす)。 ツリヌ安定タむマヌ で 名 に衚瀺されるスケゞュヌルの名前を蚭定したす。 ビルドボット-りェブむンタヌフェむス。 で フィルタヌ倉曎 フィルタヌが蚭定され、ブランチ内の倉曎を通過した埌、スケゞュヌルに構築リク゚ストの送信が芁求されたす。 で ビルダヌ名 名前が蚘茉されおいる ビルダヌ-a、少し埌で蚭定したす。 この堎合の名前はプロゞェクト名ず同じになりたす。 あなたのプロゞェクト.

フォヌススケゞュヌラ ずおも単玔なこず。 このタむプのスケゞュヌルは、マりスのクリックによっおトリガヌされたす ビルドボット-りェブむンタヌフェむス。 パラメヌタの本質は次のずおりです。 シングルブランチスケゞュヌラ.

PSその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チェックアりト。 これらのアクションはパラメヌタに含たれたす 方法、明確に蚘茉されおいたせんが、デフォルト倀を暗瀺しおいたす。 新鮮な。 パラメヌタ モヌド='むンクリメンタル' ファむルが次のディレクトリからのものであるこずを瀺したす。 チェックアりト、リポゞトリから欠萜しおいる間は、倉曎されないたたになりたす。

XNUMX 番目に远加されたステップはスクリプトの呌び出しです。 トラむアル パラメヌタ付き こんにちは 暪に ワヌカヌ-a ディレクトリから /home/habr/worker/yourProject/build 環境倉数 PATHONPATH=... を䜿甚するず、独自のスクリプトを䜜成しおサむドで実行できたす。 ワヌカヌ-すべおのステップ util.ShellCommand。 これらのスクリプトはリポゞトリに盎接配眮できたす。 その埌、 チェックアりト-e 圌らは陥るだろう /home/habr/worker/yourProject/build。 ただし、次の XNUMX ぀の「ただし」がありたす。

  1. ワヌカヌ キヌを䜿甚しお䜜成する必芁がありたす --umask 埌の実行暩限をブロックしないようにするため チェックアりト-そしお。
  2. に git pushこれらのスクリプトの -e プロパティを指定する必芁がありたす 実行可胜それで埌で チェックアりト-e は、Git スクリプトを実行する暩利を倱いたせんでした。

5.6ビルダヌ


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
                                        workernames=["example-worker"],
                                        factory=factory))

ずは䜕かに぀いお ビルダヌ 蚀われた ここで。 それでは、䜜成方法に぀いお詳しく説明しおいきたす。 ビルダヌ構成 コンストラクタヌです ビルダヌ。 そんなデザむナヌたちが、 c['ビルダヌ'] これはオブゞェクトのシヌトであるため、耇数指定できたす ビルダヌ タむプ。 では、次の䟋を曞き盎しおみたしょう。 ビルドボット、私たちのタスクに近づけたす。


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
                                            workernames=["yourWorkerName"],
                                            factory=factory))

次にパラメヌタに぀いお説明したす ビルダヌ構成.

名 名前を指定したす ビルダヌ-a. ここで名前を付けたした あなたのプロゞェクト。 これは、 ワヌカヌ- たさにこのパスが䜜成されたす /home/habr/worker/yourProject/build. シェドゥラヌ 探しおいる ビルダヌ この名前だけで。

劎働者名 シヌトが含たれおいたす ワヌカヌ-s。 それぞれを远加する必芁がありたす c['劎働者'].

工堎 - 特定の ビルド、それに関連付けられおいたす ビルダヌ。 圌は物䜓を送りたす ビルド Ма ワヌカヌ この文曞に含たれるすべおの手順を完了するには ビルド-そしお。

6. 独自の構成の䟋

これは、私が実装するこずを提案するプロゞェクト アヌキテクチャの䟋です。 ビルドボット
.

バヌゞョン管理システムずしお䜿甚したす SVN。 リポゞトリ自䜓は、ある皮のクラりドに配眮されたす。 このクラりドのアドレスは次のずおりです svn.host/svn/yourProject/trunk。 䞋の雲の䞭で SVN アカりントのナヌザヌ名がありたす: user、パスワヌド: password。 ステップを衚すスクリプト ビルド-a もブランチに存圚したす SVN、別のフォルダヌにありたす buildbot/worker_linux。 これらのスクリプトは、保存されたプロパティを持぀リポゞトリにありたす。 実行ファむル.

ビルドマスタヌ О ワヌカヌ 同じホスト䞊で実行する プロゞェクト.ホスト .ビルドマスタヌ ファむルをフォルダヌに保存したす /ホヌム/ハブ/マスタヌ. ワヌカヌ 次のパスに保存されたす /ホヌム/ハブ/ワヌカヌ。 プロセス通信 ビルドマスタヌ-aず ワヌカヌ-a はプロトコルに埓っおポヌト 4000 経由で実行されたす ビルドボット-あ、぀たり 「pb」 プロトコル。

タヌゲット プロゞェクトはすべお Python で曞かれおいたす。 タスクは、倉曎を远跡し、実行可胜ファむルを䜜成し、ドキュメントを生成し、テストを実斜するこずです。 倱敗した堎合、すべおの開発者は、アクションが倱敗したこずを瀺すメッセヌゞを電子メヌルで送信する必芁がありたす。

りェブ衚瀺 ビルドボット ポヌト80に接続したす プロゞェクト.ホスト。 Apatchをむンストヌルする必芁はありたせん。 図曞通の䞀郚ずしお ねじれた すでにWebサヌバヌが存圚しおおり、 ビルドボット それを䜿甚したす。

内郚情報を保存するため ビルドボット буЎеЌОспПльзПвать sqlite.

メヌル送信にはホストが必芁です smtp.your.domain - メヌルから手玙を送信できるようになりたす [メヌル保護] 認蚌なしで。 ホスト䞊でも」SMTP 議事録はポスト 1025 で審理されたす。

このプロセスには XNUMX 人が関䞎したす。 管理人 О user。 管理者が管理する ビルドボット。 ナヌザヌはコミットする人です コミット-s。

実行可胜ファむルは次のように生成されたす。 pyむンストヌラヌ。 ドキュメントは次の方法で生成されたす。 ドキシゲン.

このアヌキテクチャに぀いおは、次のように曞きたした。 マスタヌ.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"
}

たず必芁なのは 䜜成する ビルドマスタヌ-aず ワヌカヌ-a. 次に、このファむルを貌り付けたす マスタヌ.cfg в /ホヌム/ハブ/マスタヌ.

次のステップはサヌビスを開始するこずです ビルドマスタヌああ


sudo buildbot start /home/habr/master

次にサヌビスを開始したす ワヌカヌ-a


buildbot-worker start /home/habr/worker

準備ができお 今 ビルドボット 倉曎を远跡しおトリガヌしたす コミット-y で SVN、䞊蚘のアヌキテクチャでプロゞェクトを構築しおテストする手順を実行したす。

以䞋に䞊蚘の特城をいく぀か説明したす master.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。 これは䟝然ずしお同じむンタヌフェむスであり、XNUMX 分に XNUMX 回定期的にリポゞトリをポヌリングしたす。 この堎合 svn_poller ブランチにのみアクセスしたす トランク。 謎のパラメヌタ split_file=util.svn.split_file_alwaystrunk ルヌルを蚭定したす: フォルダヌ構造を分割する方法 SVN 枝の䞊に。 圌はたた、それらに盞察パスも提䟛したす。 その順番で Split_file_alwaystrunk リポゞトリに含たれるもののみを指定するこずでプロセスを簡略化したす トランク.

В スケゞュヌラヌ 衚瀺されたす フィルタヌ倉曎誰が芋たすか なし ブランチをそれに関連付けたす トランク 特定の関連付けに埓っお、 Split_file_alwaystrunk。 倉化ぞの察応 トランク、発売 ビルダヌ 名前付き あなたのプロゞェクト.

プロパティ ここでは、管理者がプロセスの所有者ずしおビルドおよびテスト結果のメヌリング リストを受信するために必芁です。

手順 ビルド-a チェックアりト ロヌカル バヌゞョンのリポゞトリにあるファむルを完党に削陀できたす ワヌカヌ-A. そしお、すべおを実行したす svn update。 モヌドはパラメヌタを通じお蚭定されたす。 モヌド=フル, メ゜ッド=フレッシュ。 パラメヌタ 停止オンテヌル もし svn update ゚ラヌが発生しお実行されるず、それ以䞊のアクションは意味がないため、ビルドずテストのプロセス党䜓が䞀時停止される必芁がありたす。

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]

圌はメッセヌゞを送るこずができる 違う方法.

MailNotifier 電子メヌルを䜿甚しお通知を送信したす。

テンプレヌト_html ニュヌスレタヌのテキスト テンプレヌトを蚭定したす。 HTML はマヌクアップの䜜成に䜿甚されたす。 ゚ンゞンによっお改造される ゞンゞャ2 (ず比范できる ゞャンゎ). ビルドボット には、メッセヌゞ テキストの生成プロセス䞭にその倀がテンプレヌトに眮き換えられる䞀連の倉数がありたす。 これらの倉数は {{ 二重䞭括匧 }} で囲たれおいたす。 䟋えば、 芁玄 完了した操䜜のステヌタス、぀たり成功たたは倱敗が衚瀺されたす。 あ プロゞェクト(実瞟䜜品) 出力したす あなたのプロゞェクト。 したがっお、制埡コマンドを䜿甚するず、 ゞンゞャ2、倉数 ビルドボット-a ず Python 文字列フォヌマット ツヌルを䜿甚するず、非垞に有益なメッセヌゞを䜜成できたす。

MailNotifier には次の匕数が含たれたす。

fromaddr – 党員がニュヌスレタヌを受け取るアドレス。

興味のあるナヌザヌに送信=True は、䜜成した所有者ずナヌザヌにメッセヌゞを送信したす。 コミット.

怜玢 — ニュヌスレタヌを受信するナヌザヌの名前に远加する必芁があるサフィックス。 それで 管理人 ナヌザヌがそのアドレスでニュヌスレタヌを受け取る方法 [メヌル保護].

リレヌホスト サヌバヌが開かれおいるホスト名を指定したす SMTP smptポヌト リッスンするポヌト番号を指定したす SMTP サヌバ。

モヌド = "è­Šå‘Š" 少なくずも XNUMX ぀のステップがある堎合にのみ郵送を行う必芁があるず述べおいたす ビルド-a、ステヌタス倱敗たたは譊告で終了したした。 成功した堎合、ニュヌスレタヌを送信する必芁はありたせん。

远加受信者 所有者および郵䟿物の実行者に加えお、郵送物が送信されるべき人物のリストが含たれたす。 コミット.

メッセヌゞフォヌマッタ メッセヌゞ圢匏、そのテンプレヌト、およびから利甚可胜な倉数のセットを指定するオブゞェクトです。 ゞンゞャ2。 などのオプション wantProperties=True О wantSteps=True この利甚可胜な倉数のセットを定矩したす。

with['services']=[sendMessageToAll] サヌビスのリストを提䟛したす。そのうちの XNUMX ぀は、 レポヌタヌ.

やった おめでずう

私たちは独自の構成を䜜成し、それが可胜な機胜を確認したした。 ビルドボット。 これは、プロゞェクトの䜜成にこのツヌルが必芁かどうかを理解するのに十分だず思いたす。 圌に興味がありたすか それは圹に立ちたすか 圌は䞀緒に仕事をするのが快適ですか そうすれば、私はこの蚘事を無駄に曞いおいるわけではありたせん。

そしおさらに。 プロフェッショナルコミュニティに掻甚しおもらいたい ビルドボットの範囲が広くなり、マニュアルも翻蚳され、䟋もさらに増えたした。

ご枅聎ありがずうございたした。 幞運を。

出所 habr.com

コメントを远加したす