GitHub Actionsを使ってGitHubリポジトリをCodeCommitリポジトリへミラーリングする

2022.03.03

CodeCommitからCodePipelineを動かす必要があるけど、GitHubでコードを管理したいケースがあったのでやってみます。ミラーリング自体は多くの記事がでていたのですが、CodePipelineと連携したときの動きを確認したいこともあり試してみました。

前提

  • CodeCommitのリポジトリを作成済み
  • GitHubのリポジトリを作成済み
  • CodeCoommit用のIAMユーザーを作成済み

やってみる

CodeCommitのSSHキーをアップロードする

GitHubからCodeCommitへミラーリングする際の認証情報としてSSHキー使用するためアップロードが必要です。

今回は以下のシェルでパッと作成してアップロードしました。ここで作成する鍵はパスフレーズなしで作成します。

シェルで指定したIAMユーザーの認証情報タブから、 AWS CodeCommit の SSH キー 欄を確認するとアップロードされていることを確認できます。

ここでは塗りつぶしていますが、SSHキーのIDを控えておきましよう。

GitHubのリポジトリにSecretsを設定する

認証情報をSecretsに設定していきます。

GitHubリポジトリのSettings>Secrets>Actionsと進み、New repository secretから作成します。

以下の情報で作成して下さい。

  • Name:CODECOMMIT_SSH_PRIVATE_KEY_ID
  • Value:SSHキー ID(先ほど控えたもの)

SSHのプライベートキーはローカルに作成されたものを確認しましょう。同じシェルで作成した場合は~/.ssh/test-ssh-keyから確認できます。

-----BEGIN OPENSSH PRIVATE KEY-----から最後までをコピーします。

$ cat ~/.ssh/test-ssh-key
-----BEGIN OPENSSH PRIVATE KEY-----
~
~
~
-----END OPENSSH PRIVATE KEY-----

コピーできたら以下の情報で保存します。

  • Name:CODECOMMIT_SSH_PRIVATE_KEY
  • Value:SSHプライベートキー

GitHub Actionsを設定する

GitHubへPushするフォルダにGitHub Actionsの定義ファイル(main.yml)を作成します。今回は以下のフォルダ構成で作成しています。

.
└ .github
     └ workflows
         └ main.yml

main.ymlに記述する内容は以下の通りです。は適宜変更してください。

name: Mirroring

on: [ push, delete ]

jobs:
  to_codecommit:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v1
      - uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/<CodeCommitのリポジトリ名>
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY_ID }}

これで準備完了です。ミラーリングは以下を利用していて、サンプルからGitlabへのミラーリング部分は不要だったので削除しています。

Mirroring Repository · Actions · GitHub Marketplace

Pushしてミラーリングを確認する

それでは早速動作を確認してみます。その他のファイルを入れずにそのままPushしてみると、Actionsのタブからミラーリングされていることを確認できます。

テスト用に作成したCodeCommitのリポジトリを確認すると、ミラーリングされていることを確認できました。

別ブランチを作成してPushした場合や、マージした場合でもCodeCommitへのミラーリングが実行されます。

CodePipelineを実行する場合

CodeCommitをソースとしてCodePipelineを作成している場合、当たり前ですが、指定したブランチへの変更がない場合は動きません。逆にGitHubのマージからミラーリングが実行され、指定ブランチが変更された場合にはCodePipelineが実行されます。

例えば、CodePipelineのソースとしてmainブランチを指定した場合は以下の動きになります。

  • GitHub上で別ブランチをPush→CodeCommitのリポジトリへミラーリング→CodePipelineは実行されない(mainブランチの変更がないため)
  • GitHub上で別ブランチをmainブランチへマージ→CodeCommitのリポジトリへミラーリング→CodePipelineは実行される

後続でCodePipelineを実行する場合は意識しておきましょう。

おわりに

GitHubのリポジトリをCodeCommitへミラーリングしてCodePipelinewを動かしてみました。AWSのソリューション等を利用していて、CodeCommitを使う必要があるけどコード管理はGitHubで行いたいときにご活用ください。