この記事は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-on
はjobs
の実行環境です。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リポジトリのブランチを取得します。そして、with
でfetch-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にリポジトリを同期する