【AWS】codebuildをローカルPCで動かしてみる
どもども、お久しぶりです。
最近業務でcodebuildを含めたCI/CDを構築することが頻繁にあるのですが、buildspec.ymlやテスト、デプロイスクリプトなどがAWS上codebuildで実際に稼働するまで正しく動くかが分からないというモヤモヤに常に悩まされていました。
ビルドが失敗しても料金は発生しますし、失敗するたびにコンソールやCLIで操作して…というのは非常に面倒です。
そこで今回は、codebuildを起動するdockerを利用してローカルマシンで手軽に試すことができるか試してみようと思います。
準備
まずはcodebuildを稼働させるdockerイメージを用意します。特にDockerHubなどには用意されていないのでこちらのリポジトリからクローンして自分でビルドする必要があります。
$ git clone https://github.com/aws/aws-codebuild-docker-images.git
$ cd ubuntu/standard/6.0
$ docker build -t aws/codebuild/standard:6.0 .
今回は現時点のubuntu最新イメージを利用します。ちなみにマシンスペックにもよりますが、ビルドにはものすんごく時間がかかりますので、お紅茶でもいただきながら気長に待ってくださいね。
イメージビルドが完了しましたらイメージを簡単に利用するためのヘルパースクリプトも入手しておきましょう。引数を渡してスクリプトを実行するだけで手軽にcodebuild dockerを扱えて便利です。
$ curl https://raw.githubusercontent.com/aws/aws-codebuild-docker-images/master/local_builds/codebuild_build.sh > codebuild_build.sh
これでローカルマシンでcodebuildを試す環境が整いました!
稼働してみる
それでは実際にcodebuildを稼働させてみましょう。まずは簡単なbuildspec.ymlを用意しました。
version: 0.2
phases:
build:
commands:
- echo "build success!!"
スクリプトを実行してみます。
$ ./codebuild_build.sh -i aws/codebuild/standard:6.0 -a artifact
“-i"オプションで先ほどビルドしたイメージを指定しています。"-a"はアーティファクト出力先ディレクトリでこれがないとスクリプトは正常に実行できません。
無事codebuildが稼働するとコンソールで見るような出力結果が表示されます!(一部省略)
agent_1 | [Container] 2022/09/11 04:41:16 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
agent_1 | [Container] 2022/09/11 04:41:16 Phase context status code: Message:
agent_1 | [Container] 2022/09/11 04:41:16 Entering phase INSTALL
agent_1 | [Container] 2022/09/11 04:41:16 Phase complete: INSTALL State: SUCCEEDED
agent_1 | [Container] 2022/09/11 04:41:16 Phase context status code: Message:
agent_1 | [Container] 2022/09/11 04:41:16 Entering phase PRE_BUILD
agent_1 | [Container] 2022/09/11 04:41:16 Phase complete: PRE_BUILD State: SUCCEEDED
agent_1 | [Container] 2022/09/11 04:41:16 Phase context status code: Message:
agent_1 | [Container] 2022/09/11 04:41:16 Entering phase BUILD
agent_1 | [Container] 2022/09/11 04:41:16 Running command echo "build success"
agent_1 | build success
“build success"が出力されていますね!
次に一歩踏み込んでCIチックなことをやってみます。今回はGoのtestコードを用意しました。
package main
import (
"fmt"
"testing"
)
func helloWorld(a, b string) string {
result := fmt.Sprintf("%s %s", a, b)
return result
}
func Test(t *testing.T) {
type words struct {
a, b string
}
tests := []struct {
name string
args words
want string
}{
{
name: "usual",
args: words{a: "Hello", b: "World"},
want: "Hello World",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := helloWorld(tt.args.a, tt.args.b); got != tt.want {
t.Errorf("add() = %v, want %v", got, tt.want)
}
})
}
}
CI用のbuildspec.ymlも用意します。今回はbuildspec-test.ymlというファイル名にしてみましょう。
version: 0.2
phases:
build:
commands:
- go test -v
それではヘルパースクリプトから実行してみましょう。こちらのスクリプトはデフォルトで対象buildspecファイルをbuildspec.ymlとしているので、今回は"-b"オプションでbuildspec-test.ymlを対象ファイルとして指定してみます。
./codebuild_build.sh -i aws/codebuild/standard:6.0 -b buildspec-test.yml -a artifact
実行結果は以下の通り(一部省略)
agent_1 | [Container] 2022/09/11 04:51:23 Entering phase INSTALL
agent_1 | [Container] 2022/09/11 04:51:23 Phase complete: INSTALL State: SUCCEEDED
agent_1 | [Container] 2022/09/11 04:51:23 Phase context status code: Message:
agent_1 | [Container] 2022/09/11 04:51:23 Entering phase PRE_BUILD
agent_1 | [Container] 2022/09/11 04:51:23 Phase complete: PRE_BUILD State: SUCCEEDED
agent_1 | [Container] 2022/09/11 04:51:23 Phase context status code: Message:
agent_1 | [Container] 2022/09/11 04:51:23 Entering phase BUILD
agent_1 | [Container] 2022/09/11 04:51:23 Running command go test -v
agent_1 | === RUN Test
agent_1 | === RUN Test/usual
agent_1 | --- PASS: Test (0.00s)
agent_1 | --- PASS: Test/usual (0.00s)
agent_1 | PASS
agent_1 | ok buildspec-local 0.007s
agent_1 |
agent_1 | [Container] 2022/09/11 04:51:27 Phase complete: BUILD State: SUCCEEDED
無事テストが回っていますね!
さいごに
今回はローカルマシン上でcodebuildを回してみました。なにこれめちゃくちゃ便利じゃないか…。
特にCIを目的としたcodebuild構築の際に絶大な力を発揮するなと思いました。昨今の円安でAWS料金にシビアな皆様の見方であることは間違いありません!是非利用してみるべきだと思います!
最後まで読んでいただきありがとうございました!