LoginSignup
3
6

More than 1 year has passed since last update.

GitHubにプッシュすると、CodeCommitへ自動で同期させる方法

Last updated at Posted at 2022-01-05

はじめに

GitHubにプッシュするとCodecommitへ自動的に反映させる方法をまとめました。

ミラーリングの詳細です。↓

流れ

  1. IAMユーザー作成
  2. SSHキー作成
  3. ローカルのconfigの設定
  4. codecommitリポジトリ作成し、クローンする
  5. Githubでの設定
  6. GitHubのActionでミラーリング設定
  7. GitHubでアクセストークンを作成
  8. Githubにpushし、ミラーリングの確認

IAMユーザー作成

下記3つのポリシーをアタッチしたIAMユーザーを作成します。

  • IAMUserSSHKeys
  • IAMReadOnlyAccess
  • AWSCodeCommitFullAccess

SSHキー作成

ローカルでSSHキーを作成します。

$ cd ~/.ssh

$ ssh-keygen -t rsa -b 4096 -m PEM -C <githubのメールアドレス>

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa): codecommit_rsa
[ Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in codecommit_rsaa.
Your public key has been saved in codecommit_rsaa.pub.
〜〜〜以下省略

3行目にファイル名を入力します。今回は、codecommit_rsaです。
4行目、5行目のパスフレーズは空で登録します。
何かしらの値を入れるとGithub Actionsでエラーになります。

SSHキーの公開鍵(codecommit_rsa.pub)と
SSHキーの秘密鍵(codecommit_rsa)が作成されました。

先程作成したIAMユーザーから、認証情報タブ > AWS CodeCommitのSSHキーにある「SSHパブリックキーのアップロード」を選択します。

SSHキーの公開鍵(codecommit_rsa.pub)の中身をそのままSSH パブリックキーのアップロードに貼り付けます。

$ cat codecommit_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD5DmZ/NJ/YDMq9Ux0ZHkABUFGtYyLxaR8
〜〜〜以下省略

スクリーンショット 2022-01-05 22.23.50.png

SSHキーID(APK....)が発行されましたが、使用しますので、コピーしてください。

ローカルのconfigの設定

ローカルの~/.ssh/configファイルに以下の設定を追記します。

config
Host git-codecommit.*.amazonaws.com
  User APKXXXXXXXXXXXXX
  IdentityFile ~/.ssh/codecommit_rsa

HOSTは、Host git-codecommit.*.amazonaws.comです。

Userは、IAMに公開鍵を登録した際に発行されたSSHキーID(APK....)を設定してください。

IdentityFileは、秘密鍵(codecommit_rsa)の名前です。

スクリーンショット 2022-01-05 22.32.01.png

codecommitリポジトリ作成し、クローンする

CodeCommitのリポジトリを作成します。
名前は、slotにします。
SSHのクローンをクリックすると、コピーされます。

スクリーンショット 2022-01-05 22.35.12.png

$ git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/slot

これでクローンできます。(空ですが)

適当に1つファイルを作成し、ブランチmaindevelopを作成しておきます。
スクリーンショット 2022-01-05 22.55.11.png

GitHubでの設定

slotという名前のリポジトリを作成し、slotリポジトリ > Settings > Secretsをクリックします。
スクリーンショット 2022-01-05 23.30.13.png

New Repository secretをクリックし、2つ作成します。

  • CODECOMMIT_SSH_PRIVATE_KEY:秘密鍵(codecommit_rsa)の中身
  • CODECOMMIT_SSH_PRIVATE_KEY_ID:SSHキーID(APK....) - スクリーンショット 2022-01-05 22.47.57.png

GitHubのActionでミラーリング設定

Actionsタブから、New workflowをクリックし、set up a workflow yourselfをクリックする。
スクリーンショット 2022-01-05 23.01.06.png
スクリーンショット 2022-01-05 23.00.44.png

mirroring.ymlに下記のとおりにコピペします。
ファイル名は、main.ymlでもよいです。
今回は、②パターン用意しました。自身にあったほうをコピペしてください。

target_repo_urlのSSHリンク箇所は、各自修正してください。

パターン①:GitHubのすべてのブランチをCodeCommitに同期させる場合

mirroring.yml
name: Mirroring

on: [ push, delete ]

jobs:
  to_codecommit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.~~~~(**codecommitのミラーリング先リポジトリSSHリンク)**
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY_ID }}

スクリーンショット 2022-01-05 23.06.54.png

パターン②:GitHubのmaindevelopのみ、CodeCommitに同期させる場合

mirroring.yml
name: Mirroring

on:
  push:
    branches: [main, develop]

jobs:
  to_codecommit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.~~~~(**codecommitのミラーリング先リポジトリSSHリンク)**
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY_ID }}

修正後、Start commitから commit new fileをクリックすると、mainブランチにファイルが作成されます。
mainブランチにコミットするか、ブランチを新たに作成し、プルリクを出すかが選べます。

スクリーンショット 2022-01-05 23.07.58.png

ちなみに、.github/workflows/mirroring.ymlを任意のブランチ内で作成してもミラーリングできます。

fetch-depth: 0の役割

actions/checkout@v2ではチェックアウト時の時間短縮のために指定されたブランチの先頭コミットしか取得(fetch)してきません。
fetch-depth: 0を指定してあげることにより、全タグ・全ブランチ・全履歴を取得するようになるため、次のgit checkoutが意図通り動く、という仕掛けです。

GitHubでアクセストークンを作成

pushする際、アクセストークンが必要になりますが、workflowを加えるようにしてください。
今回は、repoworkflowを選択しました。
スクリーンショット 2022-01-05 22.49.25.png

Githubにpushし、ミラーリングの確認

Githubのmainブランチをローカルにクローン後、適当にプッシュし、GithubのActionsタブのコミットIDをクリックすると、codecommitへのミラーリングができていることが確認できます。

スクリーンショット 2022-01-05 23.14.26.png
スクリーンショット 2022-01-05 23.16.27.png

developブランチには、mirroring.ymlファイルがないため、マージ等を行うことで、developもcodecommitに同期されるようになります。

エラー①

remote: error: refusing to delete the current default branch 'refs/heads/master'.

codecommitのデフォルトブランチがmaster
githubのデフォルトブランチがmainだった場合に、発生します。

codecommitのデフォルトブランチをmainにするとよいです。

エラー②

remote: error: refusing to delete the current default branch 'refs/heads/main'.

mirroring.ymlfetch-depth: 0の記載がないためです。必ず加えましょう。

参考

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6