このノンベアリポジトリが同じGitマシン内に存在するのであれば、
post-receiveファイル内でブランチ名を特定した上で、ノンベアリポジトリのディレクトリへ移動して新たなgitコマンドを発行するだけで終わりです。
参考記事: Gitのpost-receive Hookでブランチ名などを受け取ったりする
もし別マシンだった場合が厄介です。
post-receiveという実行ファイル1個で別マシンに遠隔操作でGit操作を行わせる事になり、相当困難な作業となります。
この場合はWebhookの仕組みを活用したり、メッセージングサーバを立ち上げる事で解決します。
こういう仕組みを作るのが上手な人なら1,2週間程度でさくっと作ってくれるかもしれませんが、
エラーのハンドリング等も考えると大変かもしれないですね。
この流れを説明していきます。
今回の登場人物は3人です
- A: 質問者さんのパソコン
- B: Gitのサーバ
- C: 追従したい別マシン
A -> Bに向けて更新したmasterブランチをpushしました。
この時、通信はAB間で完結してしまっているので、Cはそれを知る術がありません。
B内で実行されるpost-receiveファイルを使って、
Cにmasterブランチの更新を知らせてCにpullをさせる必要があります。
post-receiveに関して
postreceiveは実行ファイルである必要があります。
実行ファイルということでコンパイルしたC言語やRustの実行ファイルを
post-receiveという名前にして配置するのが基本ですかね。
しかし質問文にあった「該当のソースコード」の中身はテキストファイルです。
実行ファイルじゃないのに実行出来るわけないじゃん。
Linux等でテキストファイルに実行権限を付与して実行した場合、
ファイルの1行目に書かれている#!/bin/sh
、これをシバンと呼び、
書かれている実行ファイルを探して、そいつに読み込ませて実行するという挙動をしてくれます。
#!/bin/sh
はシェルスクリプトですね。
一般的によく使われるbashあたりなんじゃね?とは思いますが、
一概にshと書かれている場合はash
やbash
を始めとして多くの候補が存在するので、100%bashのコードが動作するとは限りません。
シェルスクリプトで他のマシンへの通知や実行を全て任せるのはちと荷が重いので、
RubyやPython、Node.js等の汎用スクリプト言語の力を借りるのが楽だと思います。
#!/usr/bin/env ruby
という感じのシバンを書けばシェルスクリプト以外も動作させる事が可能です。
どうやって実行ファイル1個で
追従したい別マシンにmasterブランチの更新を知らせてpullをさせるか?
これが今回の障壁となる部分です。
「Gitのサーバ」で実行ファイルを動作させても、
影響を及ぼせるのは「Gitのサーバ」内だけです。
その垣根を勝手に超えて「別マシン」を操作しようなんて、遠隔操作・セキュリティホールに他なりません。
ここは「別マシンでgit pull origin master
を実行するだけ」の仕組みを作って
その用途だけに使うのが良いでしょう。
こうしておけば仮に悪意の第三者に知られても「別マシンでgit pull origin master
を実行するだけ」という機能を何度も実行されるだけの被害で済みます。
- 別マシンでWebサーバを稼働して、特定のURLにアクセスすると「Gitサーバのブランチが更新した」と見なしてpullを試みる
- PubSub方式のメッセージングサーバを稼働させ、別マシンはメッセージングサーバにSubscribe側として接続しっぱなしにする。GitサーバからPublishして「Gitサーバのブランチが更新」された事を検知させてpullを試みる
- Node.jsでWebSocketサーバを開設して、Gitサーバと別マシンを接続しっぱなしにする
1番目の方法はGitHubでもWebhookという仕組みで提供されています。
ブランチが更新された等の契機で、機械的にHTTPアクセスを飛ばして通知します。
受け手となる別マシンにそのHTTPアクセスを受け取れるWebサーバを構築しておけば良いですね。
実現だけなら最も楽だと思います。
デメリットはGitサーバのpost-receive内に受け手となる別マシンへHTTPリクエストを飛ばすという情報を覚えさせる必要がある点ですね。
エンジニアの感覚として、なんで俺がそれを覚える必要があるの?になります。
他の方法は別ルートで通知する経路を確保しておいて、
post-receiveファイルはその経路を利用してメッセージを伝えるというアプローチです。
Yahoo!ではPlusarというメッセージングの仕組みを開発・運用してその筋では有名になりました。
大規模なマシン達を管理するとなると、こういうアプローチは欠かせないというわけですね。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/11/16 06:09
2022/11/16 07:38
2022/11/16 08:07