AWS CodeBuildとGithubを連携させ、自動ビルドを行う方法

AWS

今回はAWS CodeBuildを使い、Github上のdevelopブランチにpushされたタイミングで、管理されているプロジェクトが自動ビルドされる設定方法について確認していきます。

前提条件
  • Github上のdevelopブランチはSpring Bootアプリケーションを管理
  • ビルドツールはMavenを使用
  • IAMユーザーはAdministrator権限であること
知識
  • CodeBuildはDockerコンテナ上のLinuxベースの環境で動作している
  • CodeBuildで作成されたビルドファイルはデフォルトでS3バケットに保存される
  • buildspec.ymlとは、CodeBuildでビルド実行時に実行するコマンドを記述したYAML形式のファイルのこと


以下の順で進めていきます。

設定順序
  • S3バケットの作成
  • AWS Management ConsoleからGitHubへの接続設定

  • AWS CodeBuildのポリシーを作成 + ロールにアタッチ

  • buildspec.ymlの作成

  • CodeBuildプロジェクトの作成

  • リモートブランチにPush後、ビルド実行の確認


S3バケットの作成

AWS Management Consoleにログインして、S3バケットを作成する

【バケットを作成】を選択 → バケットタイプ(汎用) → バケット名(任意) を設定し、後の項目はデフォルトで設定しておきます。必要であれば、適時変更してください

AWS Management ConsoleからGitHubへの接続設定

参考)公式ドキュメントはこちら

CodeBuildを検索し、「設定」→「接続」を選択


「接続を作成」を選択


Githubを選択し、任意の接続名を入力 → 「Githubに接続する」を選択


「新しいアプリをインストールする」を選択


GitHubのページが開きますので
Githubへログインするユーザー名(もしくはメールアドレス)とパスワードを入力


「Authorize AWS Connector for GitHub」を選択し、AWSとGitHubの接続を許可する


認証許可後、再度「新しいアプリをインストールする」を選択


「All repositories」もしくは「Only select repositories」でAWS からGitHubへの接続対象のリポジトリを選び、「Install & Authorize」を選択。今回は特定のリポジトリのみを対象としたいので、「Only select repositories」を選択してます


以下のように接続が利用可能となり、表示されたARNを後ほど使用する

これで自身のAWSアカウントから、GitHubへの接続認証が確立しました。

AWS CodeBuildのポリシーを作成 + ロールにアタッチ

参考)公式ドキュメントはこちら

IAMの「ポリシーの作成」を選択


ポリシーエディタの編集

ポリシー要件

①CodeBuildが他のAWSサービスとやり取りするポリシーの作成
②CodeBuildがGithubとの接続を許可するポリシーの作成

①と②を合わせた以下のJSONポリシーを設定する
なお<connection-arn>の値は先ほどのManagement ConsoleとGitHub接続で生成されたARNの値を使用する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CloudWatchLogsPolicy",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        },
        {
            "Sid": "CodeCommitPolicy",
            "Effect": "Allow",
            "Action": [
                "codecommit:GitPull"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3GetObjectPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3PutObjectPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ECRPullPolicy",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ECRAuthPolicy",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3BucketIdentity",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketAcl",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "codeconnections:GetConnectionToken",
                "codeconnections:GetConnection"
            ],
            "Resource": [
                "<connection-arn>"
            ]
        }
    ]
}

画面下部の「次へ」ボタンを押し、任意のポリシー名を入力し、「ポリシーの作成」を押下

作成したポリシーをロールにアタッチする

IAMの「ロールを作成」を選択


「信頼されたエンティティタイプ」は「AWSのサービス」を選択し
「ユースケース」は「CodeBuild」を選択し、「次へ」


「許可ポリシー」で先ほど作成したポリシーを選択し、「次へ」

任意のロール名(今回はCodeBuildServiceRolePolicy)を入力し、画面下部の「ロールの作成」を押下でCodeBuildのロールが作成される

※またこの後でCodeBuildからCodeDeployへのポリシーの許可を行う必要があるので、先ほど作成したロールに「AWSCodeDeployDeployerAccess」ポリシーを追加でアタッチしておく

buildspec.ymlの作成

参考)公式ドキュメントはこちら

・buildspec.ymlはCodeBuildでのビルドプロセスの手順を明記するファイル
・CodeBuild実行時のデフォルトのディレクトリ位置は、作業ディレクトリとなる
 例)/codebuild/output/src12345678/src/

GitHubのルートリポジトリ配下に、buildspec.ymlファイルを作成しておく

今回のbuildspec.ymlは以下のように設定

version: 0.2

phases:
  install:
    on-failure: ABORT
    runtime-versions:
      java: corretto17
  
  pre_build:
    on-failure: ABORT
    commands:
      - echo "Pre-build phase started"
      - java --version
      - mvn -version
  
  build:
    on-failure: ABORT
    commands:
      - echo "Build phase start"
      - mvn clean package

  post_build:
    on-failure: ABORT
    commands:
      - echo "Post-build phase started"
      - pwd
      - ls -la
      - ls -la target/

artifacts:
  files:
    - target/QRcode_Demo.war
    - appspec.yml
  discard-paths: yes

cache:
  paths:
    - '/home/ec2-user/.m2/**/*'

reports:
  junit:
    files:
      - 'target/surefire-reports/*.xml'
    file-format: JUNITXML

env:
  shell: bash

buildオプションのmvn clean packageコマンドで対象のプロジェクトがビルドされる
そのビルドされたファイルはCodeBuildの作業ディレクトリ直下に配置される
例)/codebuild/output/src12345678/src/target/QRcode_Demo.war

buildspec.ymlの記述について

artifacts:
  files:
    - target/QRcode_Demo.war
    - appspec.yml

上記はCodeBuildの作業ディレクトリ内の直下に作成されたQRcode_Demo.warとappspec.ymlをS3バケットにアップロードするという意味

reports:
  junit:
    files:
      - 'target/surefire-reports/*.xml'
    file-format: JUNITXML

上記はビルド結果をAWS Management Console の CodeBuild上のレポートで確認することができる

ここまでで、事前準備が完了

CodeBuildプロジェクトの作成

参考)公式ドキュメントはこちら

「CodeBuild」と検索し、「プロジェクトの作成」を選択



以下の画像でプロジェクトの設定を確認していきます



リモートブランチにPush後、ビルド実行の確認

リモートブランチ(develop)にPushを行い、CodeBuildの画面で以下が表示されれば、ビルド成功



またビルドログも確認できるので、もしエラーが発生していたらこちらを確認する

また今回はビルドファイルをZip形式でS3に保存されているので、AWS Management Consoleからはファイル名は確認できないっぽいですが、ダウンロードなどすると想定通りのファイルが作成されているはずです。


ちなみに、デフォルトでCodeBuildにはMaven 3.9.5がインストールされていました


今回は以上となります。

次は、S3に保存されたファイルをEC2に自動デプロイするAWS CodeDeployの設定について確認していきます。気になる方はこちら

コメント

タイトルとURLをコピーしました