NTTドコモR&Dの技術ブログです。

Github Actionsを用いてPush時にGithubのリポジトリをAWS CodeCommitへ同期させる方法

この記事はNTTドコモR&Dアドベントカレンダー2022、9日目の記事です。

こんにちは、中矢です。2022年10月からNTTドコモによって新しく設立されたARやVRの開発をメインに行うNTTコノキューに所属しています。

NTTコノキューにおける私の業務は、主にバックエンドの試験と監視です。ARやVRを裏から支えるチームに所属しています。

本記事では、Github Actionsを使って、Githubの任意のブランチをAWS CodeCommitへPush時に同期させる方法を紹介し解説します。 これは私がAWS CodeCommitのPushをトリガーに動作する自動試験環境を構築している最中に、Githubをソース管理として利用した開発環境と共存させる必要性が出てきたため、簡単に共存方法を調査し、まとめたものとなります。

本記事が少しでもGithub Actions初学者の参考になれば幸いです。

Github Actionsとは

主にCI/CDを実現するためにGithubが提供している機能です。 CI/CD(継続的インテグレーション/継続的デリバリー)とは、ソフトウェア開発に自動化を取り入れ、顧客にソフトウェアを提供する頻度を高める手法で、ざっくり書くと、開発時からビルド・テスト・デプロイの一連の流れをできる限り自動化しようぜ!というようなものです。

Github Actionsを用いることで、「Pushしたときに自動的に環境をビルドし、テストを実行する」のようなことができます。

やりたいこと

やりたいことは、図のようにGithub上でPushされた時に、PushをトリガーとしてAWS CodeCommitへGithubのリポジトリをPushし同期することです。

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

連携したいGithubリポジトリから、Settings > Secrets > Actionsと進み、右上緑のNew repository secretからSecrets情報を設定します。前提としてAWS CodeCommitのSSH接続設定は下記リンク先のように設定できているとします。
Windows で AWS CodeCommit リポジトリへの SSH 接続をセットアップする手順

ここでは、以下のような名前の情報を登録します。(名前は任意です)
1. CODECOMMIT_SSH_KEY_IDは、IAMユーザの認証情報タブから、「AWS CodeCommitのSSHキー」欄を確認し、登録したSSHのパブリックキーの「SSHキーID」を値として設定します。
2. CODECOMMIT_SSH_PRIVATE_KEYは、ローカルに保存されているSSHのプライベートキーの値を設定します。

これで準備完了です。

Github Actionsを設定する

Github Actionsを動作させるためには、リポジトリのディレクトリ内に.github/workflows/ディレクトリを作成し、その中に任意の名前のYAMLファイルを作成します。このYAMLファイルを「ワークフロー」と呼び、Github Actionsの動作を定義します。

本記事では、.github/workflows/ディレクトリにauto_push_aws_codecommit.ymlファイルを作成し、次のワークフローを定義しました。

name: Auto Push To AWS CodeCommit

on: 
  workflow_dispatch:
  push:
  delete:
    
jobs:
  auto_push_to_codecommit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/auto-push-test-aws
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_KEY_ID }}

.github/workflows/auto_push_aws_codecommit.ymlが入ったリポジトリをGithubへPushすることで、「Push時に自動でリポジトリをAWS CodeCommitへ同期させる」ワークフローを設定できます。

Github Actionsの動作を確認する

リポジトリをPushし、動作を確認してみます。

Pushを実行すると下図の画面でGithub Actionsが実行されていることを確認できます。無事実行が完了になると、緑のチェックマークで教えてくれます。 ここで、「GithubとAWS CodeCommitの同期テスト」はPush時のコミットメッセージです。

続いて、AWS CodeCommitのリポジトリも確認してみます。 無事,Githubと同様のリポジトリが作成されていることを確認できました。

ちなみに私はSSH認証の設定を誤り、何回かワークフローを失敗しました。本記事のワークフローで失敗する場合、SSH認証周りを確認すると良いかもしれません。

Github Actionsのワークフローを解読する

動作確認した本記事のGithub Actionsワークフローを解読します。 使用したワークフローを再掲します。

name: Auto Push To AWS CodeCommit

on: 
  workflow_dispatch:
  push:
  delete:
    
jobs:
  auto_push_to_codecommit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/auto-push-test-aws
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_KEY_ID }}

まず、ワークフローは以下のように大きく分かれます。

name: {ここにワークフローの名前を書く}

on:
    {ここに動作のトリガーを書く}

jobs:
    {ここに動作を定義する}

では、ひとつずつ解説していきます。

nameはワークフローの名前です。この名前はGithub ActionのIDになり、好きな名称を設定できます。 本記事では以下のように記述し、図のようにGithub ActionのIDがnameに設定したものになっていることが確認できます。

name: Auto Push To AWS CodeCommit

続いて、onはGithub Actionsを動作させるトリガーを定義します。いわゆるイベントトリガーです。 本記事では、以下のように定義しています。

on: 
  workflow_dispatch:
  push:
  delete:

workflow_dispatchは、Githubを手動実行するイベントトリガーです。実行は図の中の緑の「Run workflow」ボタンを押下です。このボタンは、何らかの理由でGithub Actionの動作が失敗したときの再実行などで便利なようです。 手動実行のイベントトリガー

続いてpushです。これを記述することでGithubへのPushがイベントトリガーになります。ちなみに以下のように書くと、GithubのmainブランチでPushされたときに動作するようになります。これを利用すると任意のブランチへのPushをトリガーにできます。

on:
  push:
    branches:
      - main

最後にdeleteです。これはブランチ削除をトリガーとします。

以上が本記事で登場するイベントトリガーです。また、これらイベントトリガーはまとめて以下のように書くこともできます。

on: [workflow_dispatch, push, delete]

続いて、Github Actionsのメイン部分となるjobsです。jobsの中でGithub Actionsの動作を定義します。本記事は以下を定義しています。

jobs:
  auto_push_to_codecommit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/auto-push-test-aws
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_KEY_ID }}

まず、auto_push_to_codecommitはjobのIDで、任意の名前を付けることができます。

続いて、runs-onjobsの実行環境です。ubuntu-latestはubuntuの最新版であり、2022年12月9日のバージョンは22.04のようです。

stepsから具体的な動作の定義になります。usesで定義されたアクションを呼びだすことができ、withを使うことでアクションを呼びだす際にパラメータを付与することができます。

例えば、以下であれば、

- uses: actions/checkout@v3
        with:
          fetch-depth: 0

https://github.com/actions/checkout
上記のリンク先で定義されるcheckoutを呼びだし、gitリポジトリのブランチを取得します。そして、withfetch-depth: 0を付与することにより、githubリポジトリの全タグ、全ブランチ、全履歴を取得するようになります。ちなみに、fetch-depth: 0を付与しないと、GithubのリポジトリとAWS CodeCommitのリポジトリの差異が、直前のコミット分以上あると、エラーが発生しアクションが動作しなくなります。

また、@3はバージョンを表し、checkout@3はメジャーバージョン3のcheckoutになります。

最後に以下のコードを解説します。これが本記事が対象とするリポジトリの同期を定義するアクションです。

- uses: pixta-dev/repository-mirroring-action@v1
        with:
          target_repo_url:
            ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/auto-push-test-aws
          ssh_private_key:
            ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          ssh_username:
            ${{ secrets.CODECOMMIT_SSH_KEY_ID }}

これは下記リンク先で定義されるrepository-mirroring-actionを呼びだしています。
https://github.com/pixta-dev/repository-mirroring-action
また、以下3つのパラメータをwithで付与しています。
1. target_repo_url:同期させたいAWS CodeCommitリポジトリのSSHのURL
2. ssh_private_key:SSH認証のプライベートキー
3. ssh_username:SSHキーのID

ここで、SSHのプライベートキーとSSHキーのIDは、${{ screts.{Secrets情報の名前} }}と書くことでGithubリポジトリのSecrets設定で登録した値を呼びだしています。

まとめ

本記事では、Github Actionsを用いてPush時にGithubのリポジトリをAWS CodeCommitへ同期させる方法を紹介し、解説しました。本記事の内容はそこまで難しいものではなく、数日程度で動作確認ができるため、Github Actions初心者の良い学習題材にもなりそうです。

今後、GithubとAWS CodeCommitを共存させる時に、本記事の内容を活かしていこうと思います。

参考

本記事を書く際に参考にしたサイトです。
1. GitHub Actionsを使ってGitHubリポジトリをCodeCommitリポジトリへミラーリングする
2. GitHubへのPush時にAWS CodeCommitにリポジトリを同期する