AWSで作るGit Mirroring API

Gitのリモートリポジトリを一方的に同期するAPIを作ってみました.

github.com

APIをkickすると,リモートリポジトリAの内容がリモートリポジトリBに同期される,というイメージです.

 

背景

GitHub便利ですよね.理由として,GitHub自体の便利さももちろん,他のツールとの連携のしやすさ,というのも大きいと思います.例えば,CI/CDツールのTravisCIやCircleCIなど,GitHubとの連携は非常に簡単にできます.

一方で,何らかの諸事情により,GitHub以外のGitホスティングサービスを利用している場合,一気に他サービスとの連携の敷居が上がることもあります.そんなときに,じゃあGitHubミラーリングしちゃえばいいのでは?と思ったのが,このAPIを作ったきっかけです.

 

設計

 AWSのサーバレスアーキテクチャで構築しました.API GatewayからKinesisを通し,Lambdaを呼ぶ構成になっています.わざわざKinesisを通しているのは,可用性や拡張性を上げるためです.そして,Lambda上では,カスタムランタイムを利用しており,bashを実行しています.

https://github.com/pyto86pri/git-mirror/raw/master/docs/design.png

実装的には,現状Backlog Gitが同期元のGitホスティングサービスであることが前提となっていますが,少し手を加えれば他のGitホスティングサービスへも応用可能だと思います.

工夫ポイント

APIのパスにターゲットリポジトリのURLを指定するようにしているので,1つのAPIを複数のリポジトリで使いまわせるようになっています.また,KinesisのシャードIDとしてターゲットリポジトリのURLをこれまた指定しているので,同一ターゲットリポジトリに対して,同時にpushしてしまう,ということもないような作りになっています.

 

まとめ

これで,どうしても大元のGitホスティングサービスをGitHubに移行できない場合でも無理やり他サービスと連携させることができると思います.その他にもなんか用途がありそうなので,他リポジトリとのミラーリングに対応していないGitホスティングサービスを使っている方はぜひ参考にしてみてください.