#はじめに
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
の記載がないためです。必ず加えましょう。
#参考