GitHub リポジトリのコードを CodeCommit リポジトリに複製する

記事タイトルとURLをコピーする

こんにちは、島村です。

今回はGitHubリポジトリのコードをCodeCommitへ同期する内容を紹介したいと思います。
たまたま、GitHubで管理しているコードをEC2へ格納する必要があり、CodeCommitからCloneしたいという要件がありました。
GitHub Actions自体あまり使用したことがないので、簡単に設定の定義についても触れていきたいと思います。

早速、記載していきます。

簡易構成図

簡易構成図です。

OpenID Connect のセットアップ

GitHubとAWSの連携はOpenID Connect で行います。
具体的な手順については、弊社エンジニアの福島がブログにまとめているので、こちらを参考にしてみてください。
権限の部分が異なりますので、今回はCodeCommitFullAccessを付与してください。
厳密に制御したい場合は、CodeCommit:GitPush 権限のみでOKです。

blog.serverworks.co.jp

GitHub Actionsの設定

Workflowファイルの作成

GitHub Actionsを利用する場合、リポジトリの直下に.github/workflows/というディレクトリを作成します。
作成したディレクトリの中に、Workflowファイルを用意します。
名前はなんでもいいですが、codecommit-mirror-workflow.ymlという名前で今回は進めます。

yamlファイルの記述

Workflowファイルを記述していきます。
出来上がったworkflowファイルを先に載せておきます。

name: github repository mirror to CodeCommit
on:
  push:
    branches:
      - main
env:
  AWS_REGION: ap-northeast-1
  REPOSITORY_NAME: {{ リポジトリ名が入ります }}
# permission can be added at job level or workflow level    
permissions:
  id-token: write   # This is required for requesting the JWT
  contents: read    # This is required for actions/checkout
jobs:
  MirrortoCodeCommit:
    runs-on: ubuntu-latest
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 0 
      - name: Configure aws
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.IAM_ROLE_ARN }} 
          role-session-name: {{ IAM Role名 }}
          aws-region: ${{ env.AWS_REGION }}
      - name: PushtoCodeCommit 
        run: |
          git config --global credential.helper '!aws codecommit credential-helper $@'
          git config --global credential.UseHttpPath true
          git remote add codecommit https://git-codecommit.${{ env.AWS_REGION }}.amazonaws.com/v1/repos/${{ env.REPOSITORY_NAME }}
          git push --mirror codecommit

私自身、GitHub Actionsを使用する機会が少ないので書く項目で何をしているのかざっくりまとめてみたいと思います。
興味のある方はご覧ください。

name

ワークフローの名前

on

GitHub Actionsを実行するトリガーを指定できます。
今回しているのはpushなので、pushされたタイミングでGitHub Actionsのワークフローが実行されます。

プルリクエストがマージされた時のイベントでトリガーしたかったのですが、マージに関するイベント指定はできないようでした。
そのため、今回はmain(masterなど) ブランチに直接pushしないルールがある場合を前提として、mainにpushが走ったものをトリガーにしました。

マージしたタイミングでも、mainブランチに対してpushイベントが発生するのでpushイベントとブランチを指定しているという定義になります。
jobsでプルリクエストがマージされたら、というif文を書くこともできるのですが、ジョブを実行せずともGitHub Actionsが動いてしまいます。
実行ログの視認性という観点では望ましくないと感じました。

pushだけでなく、forkやdelete,createなど、非常に多くのアクションをトリガーを指定できるので、詳細はGitHub Actionsのドキュメントをご覧ください。

docs.github.com

jobs

ワークフローで定義するアクションのグルーピングします。

runs-on

ジョブを実行するマシンを選択します。
GitHubで用意されているホストを利用することもできますし、自身で用意したホストも使用できます。
macOSやWindowsホストもGitHubホストで選択できるようです。

docs.github.com

各アクションに関しては、GitHubのリポジトリが用意されているのでご覧ください。

github.com

github.com

CodeCommitリポジトリの作成

Code Commitリポジトリを作成するので、Code Commitコンソールへ移動します。

リポジトリを作成していきます。

作成できましたね。

動作確認

準備ができたので、早速動作確認してみましょう。
今回はGitHubでテストリポジトリを作成してみました。このリポジトリをミラーしたいと思います。

testブランチを作成して、mainブランチにマージするようプルリクを出してみます。
変更内容はテキストファイルを作成するなどで問題ありません。

マージしてみました。

リポジトリの内容は以下の通りです。

CodeCommitのリポジトリに反映されているか確認をします。

GitHub リポジトリのコードが反映されていますね。

次に、GitHub Actionsの実行ログを見てみます。
対象のリポジトリページへ移動し、[Actions]タブを選択します。

ログの一部を確認すると、CodeCommitのリポジトリに対して、git push --mirrorコマンドが実行されていることが確認できました。
うまく動作していない場合は、ログからトラブルシューティングしてみてください。

最後に

今回は、簡単ではありますが、GitHub Actionsを触ってみました。
非常にできることが多く、奥が深い仕組みだなと感じました。
できることが多いので、何ができるのかをしっかり理解してGitHubをより効率的に自動化ができるよう使いこなしたい機能だと感じました。

島村 輝 (Shimamura Hikaru) 記事一覧はコチラ

最近ECS周りをキャッチアップ中。趣味は車・バイク全般。
一応、AWS12冠です。