Link and Motivation Developers' Blog

リンクアンドモチベーションの開発者ブログです

CodeBuild実行の手間をなくすツールを作りました

はじめに

こんにちは。

リンクアンドモチベーション SREの篠原です。
弊社ではクラウド基盤にAWSを利用しているのですが、中でもAWS CodeBuildをいろいろな用途に利用しています。

非常に便利なサービスではありますが、弊社の利用方法だと一部実行そのものがトイルになるケースがあったため簡単なツールを作成して効率化を目指しました。

背景

CodeBuildは一般的にはbuildやunit testなどに利用されることが多いと思います。
基本的にはGitHubなどへのpushやmainへのmergeをフックに動かせば実行自体を意識する必要はなくなります。

ただし弊社の場合はそういった使い方に加えて、各種トイルの自動化にCodeBuildを利用することが多いです。

例えば「QAをするためのテストデータを用意する」というトイルがあった場合、

  • 最初は手動でRDSの画面をポチポチしたり、sqlファイルをimportしたりしている状態
  • RDSの復元からテストデータimportまでを実行するようなスクリプトを書いて自動化する (大体bashPython)
  • 利用する人が各自で実行環境用意しなくてもいいようにCodeBuildで動かせるようにする
  • どのデータを使うかなどのパラメータが必要な場合は、CodeBuildの設定を上書きで実行し環境変数を設定して実行する

のような流れでトイルを自動化して開発者みんなが利用できる状態にする。といった作業を各種進めてきました。

イメージ

上書きでBuildする際の画面イメージです。
利用者にはDUMP_FILEの値を使いたいsqlファイル名に変更して実行してね!とアナウンスします。

このような形で各種トイルを自動化してきましたが、今度は逆にCodeBuildの実行自体がトイルのようになってきます。
「こっちのCodeBuildを実行して、次はこのCodeBuildをこのパラメータ書き換えて実行して...」というのが日常的に発生する状態です。

CodePipelineやAWS CLIを利用した自動化なども検討しましたが、柔軟にパラメータを書き換えたり直感的に操作するのが少し難しそうでした。

なのでこういった手間を解決するために手前味噌ではありますが簡単なツールを作成しました。

概要

github.com

リポジトリはこちらです。

一言で説明すると、実行したいCodeBuildの一覧をYAMLで管理してコマンド一発で同時実行できるようにするCLIツールです。

簡単な使い方

Homebrewでインストールできます。

brew install koh-sh/tap/codebuild-multirunner
% codebuild-multirunner -h
This is a simple CLI tool to "Start build with overrides" multiple AWS CodeBuild Projects at once.

This command will read YAML based config file and run multiple CodeBuild projects with oneliner.

Usage:
  codebuild-multirunner [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  dump        dump config for running CodeBuild projects
  help        Help about any command
  log         Print CodeBuild log for a single build with a provided id.
  retry       retry CodeBuild build with a provided id
  run         run CodeBuild projects based on YAML

Flags:
      --config string   file path for config file. (default "./.codebuild-multirunner.yaml")
  -h, --help            help for codebuild-multirunner
  -v, --version         version for codebuild-multirunner

Use "codebuild-multirunner [command] --help" for more information about a command.

設定

実行したいCodeBuildをYAMLで管理できます。

以下のようなファイルを作成します。
buildsはCodeBuildのstart-buildのinputを配列にしたものです。

docs.aws.amazon.com

% cat .codebuild-multirunner.yaml
builds:
  - projectName: testproject
  - projectName: testproject2
    environmentVariablesOverride:
    - name: TEST_VAR
      value: FOOBAR
      type: PLAINTEXT
  - projectName: testproject3
    sourceVersion: feature/aaa_function

上記ファイルを指定してコマンド実行します。そうすると、

  • testprojectというCodeBuildを実行
  • testproject2というCodeBuildに TEST_VAR=FOOBARという環境変数を追加して実行
  • testproject3というCodeBuildのsource versionを feature/aaa_function と指定して実行

を同時に実行し、ステータスをpollingします。

% codebuild-multirunner run --config .codebuild-multirunner.yaml
2023/08/07 16:50:00 testproject:25fe921a-2c5e-4e91-953a-b63ffe29b03e [STARTED]
2023/08/07 16:50:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [STARTED]
2023/08/07 16:50:00 testproject3:33719fff-7ee7-4828-9c6a-ec814226e3fc [STARTED]
2023/08/07 16:51:00 testproject:25fe921a-2c5e-4e91-953a-b63ffe29b03e [SUCCEEDED]
2023/08/07 16:50:00 testproject3:33719fff-7ee7-4828-9c6a-ec814226e3fc [FAILED]
2023/08/07 16:51:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS]
2023/08/07 16:52:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS]
2023/08/07 16:53:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS]
2023/08/07 16:54:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS]
2023/08/07 16:55:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS]
2023/08/07 16:56:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS]
2023/08/07 16:57:01 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [SUCCEEDED]

他にも設定ファイルの中に環境変数を使えたり、コマンドからそのまま実行ログの確認やリトライなどもできます。
またGitHub Actionsでの利用なども最近対応したのでもし興味があれば試してみてください。

まとめ

おそらく弊社のようなCodeBuildの使い方が珍しいためか、今回のようなケースの解決が既存のサービスやツールだとなかなかできなさそうでした。

もし似たようなお悩みをお持ちであればぜひ試してみてくださいmm