BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【GitLab・GitHub】GitLabにpushされたらGitHubのリポジトリにも反映させる!(ミラーリング)

はじめに


こんにちは!
株式会社BFT名古屋支店・インフラ女子(?)のやまぐちです。

AWSではCI/CDやWebhookのトリガーとしてGitLabよりもGitHubの方を先に対応します。最近GitHubでpushされたことをトリガーにLambdaのWebhookをキックする仕組みを実装することになり、まずはGitLabにあるリポジトリGitHubにミラーすることにしました。

Gitのレポジトリは一本化したい!
そこからGitHubAWS Code Commitに連携するようにしたい!

という方向けに、まずはGitLab→GitHub連携のお話です。

GitLabからGitHubにミラーする


前提の状態

今回はサクッとミラーリングの部分だけお伝えします。前提条件は以下の通りです。

また、全体でやりたいことは以下の図です。今回は赤点枠の部分を実装します。

GitHub側の設定

GitHubでは「パーソナルアクセストークン」を発行し、GitLabにそのトークンを渡すことで「特定のリポジトリ」に「特定の操作を許可」します。

  1. アカウントの [ Settings ] から左下メニュー [ Developer settings ] を押し、左メニューで [ Personal access toknes ]-[ Fine-grained tokens ] とし、[ Generate new token ] を押します。

  2. 以下の項目を選択 or 入力し [ Generate token ] を押します。

    • Token name(任意の名前)
    • Expiration(期限)
    • Description(任意)
    • Resource owner(リポジトリのオーナー)
    • Repository access --> Only select repositories(今回は特定のリポジトリのみ対象とする)
    • Permissions --> [ Contents ] を [ Read and Write ] とします
  3. 表示されたパーソナルトークンをコピーしておきます(一度しか表示されないので注意)。

悩んだのはPermissionsの部分です。
「Repository permissions permit access to repositories and related resources.」とあるのですが、どの項目がGitLabからのpushを受け付けるのかパッとわかりませんでした(初心者…)。

選択したのは「Contents」です。デフォルトで選択されている「Metadata」と合わせて2つの項目の許可がある状態としました。

GitLab側の設定

GitLabでは更に簡単です。ミラー先のGitリポジトリと先ほどGitHubで発行したパーソナルアクセストークンをパスワードに指定するだけです。

  1. ミラー元のリポジトリを選択している状態で [ 設定 ]-[ リポジトリ ] で [ ミラーしているリポジトリ ] の [ 展開 ] を押します。

  2. 以下の項目を入力し、[ ミラーリポジトリ ] を押します。

  3. ミラーされたリポジトリに登録情報や最新のステータスが表示されます。まだ連携していないので [ 最後の更新の施行 ], [ 最後の成功した更新 ] は [ しない ] と表示されています。

動作確認

こんなんでミラーできるのか…?と一抹の不安を抱きながら、README.mdを更新してみます。

anna@LAPTOP-RNA0J544:~/condoransible/condoru$ vi README.md
anna@LAPTOP-RNA0J544:~/condoransible/condoru$
anna@LAPTOP-RNA0J544:~/condoransible/condoru$ git add README.md
anna@LAPTOP-RNA0J544:~/condoransible/condoru$ git commit -m "mirror test Gitlab to Github."
[main f312c37] mirror test Gitlab to Github.
 1 file changed, 1 insertion(+), 10 deletions(-)
anna@LAPTOP-RNA0J544:~/condoransible/condoru$ git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 323 bytes | 323.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)

To gitlab.com:a-yamaguchi1/condoru.git
   421796b..f312c37  main -> main
anna@LAPTOP-RNA0J544:~/condoransible/condoru$
anna@LAPTOP-RNA0J544:~/condoransible/condoru$
anna@LAPTOP-RNA0J544:~/condoransible/condoru$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
anna@LAPTOP-RNA0J544:~/condoransible/condoru$

GitLabにブラウザでアクセスし、リモートリポジトリが問題なく更新されていることを確認し、GitHubリポジトリを見てみると… きちんと更新内容が反映されていました!!驚きです!!

ちなみに①
PermissionsでWrite Accessをつけないように変更したらGitHubへの反映はしませんでした。この辺りのログはGitLab側のどこかで確認できるのだろうか…[ 最後の更新の施行 ], [ 最後の成功した更新 ] 以外だと有料アカウントならできそうな気配がしたのですがどなたかお詳しい方がいたら教えていただきたい次第です。

ちなみに②
反映のタイミングはまちまちで即座に反映した初回と比べ、何度か更新した時はすぐに反映せず「あれ?なんでだ?設定がおかしいのか?」と不安になりました。
GitHub側ではスーパーリロードしているのでブラウザ上で反映していないという問題ではないはず。
この辺りはもう少し調査が必要ですね。

終わりに


案外簡単にサクッと実装できてよかったです!
パーソナルアクセストークンは無期限にはできないので、ある程度の期間で再発行→GitLabの設定変更が必要になります。この辺りは「運用でカバー」でしょうか。

GitHubへのミラーが出来たので次はGitHubからAWS LambdaへWebhookしてみたいと思います。その前にWebhookを受ける設定か…

ここまで読んでいただきありがとうございました~ ^ ^