はじめに
GitHubにプッシュするとCodecommitへ自動的に反映させる方法をまとめました。
ミラーリングの詳細です。↓
流れ
- IAMユーザー作成
- SSHキー作成
- ローカルのconfigの設定
- codecommitリポジトリ作成し、クローンする
- Githubでの設定
- GitHubのActionでミラーリング設定
- GitHubでアクセストークンを作成
- 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
〜〜〜以下省略
SSHキーID(APK....)が発行されましたが、使用しますので、コピーしてください。
ローカルのconfigの設定
ローカルの~/.ssh/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)の名前です。
codecommitリポジトリ作成し、クローンする
CodeCommitのリポジトリを作成します。
名前は、slotにします。
SSHのクローンをクリックすると、コピーされます。
$ git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/slot
これでクローンできます。(空ですが)
適当に1つファイルを作成し、ブランチmainとdevelopを作成しておきます。

GitHubでの設定
slotという名前のリポジトリを作成し、slotリポジトリ > Settings > Secretsをクリックします。

New Repository secretをクリックし、2つ作成します。
GitHubのActionでミラーリング設定
Actionsタブから、New workflowをクリックし、set up a workflow yourselfをクリックする。


mirroring.ymlに下記のとおりにコピペします。
ファイル名は、main.ymlでもよいです。
今回は、②パターン用意しました。自身にあったほうをコピペしてください。
target_repo_urlのSSHリンク箇所は、各自修正してください。
パターン①:GitHubのすべてのブランチをCodeCommitに同期させる場合
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 }}
パターン②:GitHubのmainとdevelopのみ、CodeCommitに同期させる場合
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ブランチにコミットするか、ブランチを新たに作成し、プルリクを出すかが選べます。
ちなみに、.github/workflows/mirroring.ymlを任意のブランチ内で作成してもミラーリングできます。
fetch-depth: 0の役割
actions/checkout@v2ではチェックアウト時の時間短縮のために指定されたブランチの先頭コミットしか取得(fetch)してきません。
fetch-depth: 0を指定してあげることにより、全タグ・全ブランチ・全履歴を取得するようになるため、次のgit checkoutが意図通り動く、という仕掛けです。
GitHubでアクセストークンを作成
pushする際、アクセストークンが必要になりますが、workflowを加えるようにしてください。
今回は、repoとworkflowを選択しました。

Githubにpushし、ミラーリングの確認
Githubのmainブランチをローカルにクローン後、適当にプッシュし、GithubのActionsタブのコミットIDをクリックすると、codecommitへのミラーリングができていることが確認できます。
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.ymlにfetch-depth: 0の記載がないためです。必ず加えましょう。
参考







