AWS CDKでCodeBuild プロジェクトを作りlintを実行した

2020.02.05

コードのテストやlintはPull Request単位などで自動的に行ってくれると便利で嬉しいですよね. 今回はデプロイは発生しないが, Pull Requestごとにlintを実行して結果をGitHubのPull Requestに伝えられるように, CIをCodeBuild プロジェクトで準備しました. また使い回ししやすいように, AWS CDKを利用してデプロイします.

CDK Projectの作成

cdk initで雛形を作成します. ついでにバージョンを確認しましたが, 1.22.0でした.

$ npx cdk init app --language=typescript

$ npx cdk version
	1.22.0 (build 309ac1b)

次に, 今回は@aws-cdk/aws-codebuild を利用するのでライブラリをインストールします.

$ npm i @aws-cdk/aws-codebuild

ここまで完了したら実際にコードを書いていきます.

コーディング

cdk initを実行した際のディレクトリ名で, lib配下に作成されるファイル名が決まります. なので適宜そこは読み替えるか, ファイルのリネームをしてください. CodeBuildを同一設定で複数個作成しやすいようにStackPropsとしてGitHubのリポジトリオーナー名と, リポジトリ名を受け取るようにしています. それ以外の部分に関して, バッジやローカルキャッシュ, ビルドイメージについては同一の設定で利用するようにしています.

lib/build.ts

import { Stack, StackProps, Construct } from '@aws-cdk/core';
import {
  Cache,
  LinuxBuildImage,
  LocalCacheMode,
  Project,
  Source
} from '@aws-cdk/aws-codebuild';

interface BuildStackProps extends StackProps {
  /**
   * GitHub Repository Owner Name.
   */
  owner: string;
  /**
   * GitHub Repository.
   */
  repo: string;
}

export class BuildStack extends Stack {
  constructor(scope: Construct, id: string, props: BuildStackProps) {
    super(scope, id, props);

    const buildProject = new Project(this, 'build', {
      badge: true,
      source: Source.gitHub({
        owner: props.owner,
        repo: props.repo,
        webhook: true
      }),
      cache: Cache.local(LocalCacheMode.DOCKER_LAYER, LocalCacheMode.CUSTOM),
      environment: {
        buildImage: LinuxBuildImage.STANDARD_3_0
      }
    });
  }
}

次に, CDK Appの設定をします. StackPropsの変更に合わせた対応とリージョンの指定をします. 東京リージョン以外に作る予定もなかったのでここはベタ書きしています.

bin/build.ts

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { BuildStack } from '../lib/build';

const app = new cdk.App();
new BuildStack(app, 'Build', {
  env: {
    region: 'ap-northeast-1'
  },
  owner: 'GITHUB OWNER NAME',
  repo: 'GITHUB REPOSITORY NAME'
});

これでコードの準備が完了しました. コンポーネント数が少ないこともあり, 本当に少ない記述量で書き終わりました.

デプロイ

CodeBuildプロジェクトを作成する場合で, GitHubリポジトリに接続する際はOAuthを行うか, Personal Access Tokenを利用する必要があります. OAuthはマネジメントコンソールでのみ使える方法なので今回はPersonal Access TokenをCodeBuildに渡します. Personal Access Tokenを取得していない場合はこちらを参考に取得してください. CDK Appのデプロイ前に, このコマンドを実行します.

$ aws codebuild import-source-credentials \
 --server-type GITHUB \
 --auth-type PERSONAL_ACCESS_TOKEN \
 --token <YOUR PERSONAL ACCESS TOKEN> \
 --region ap-northeast-1

このコマンドが完了したら, デプロイしましょう.

$ npx cdk deploy

buildspecの準備とPull Requestの確認

リポジトリにbuildspec.yml を配置すると, その内容を元にCodeBuildが実行してくれます. 今回はテストがまだかけてないので..., eslintでエラーを検出するだけにしています. 大した記述量ではないですが, コードレビューとかの時にツールで自動的に指摘してくれると楽だなぁと思っています.

buildspec.yml

version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 12
    commands:
      - npm ci
  build:
    commands:
      - npm run lint

このファイルを配置してPull Requestを作成した際に, CodeBuildが動作した様子が確認できます. READMEにバッチを追加しただけのコミットなので当然ビルドは成功していますね.

img

さいごに

CodeBuild Project自体はある程度言語に依存せずに作成できるので必要であれば使いまわしたいなという気持ちです.

参考