CodeBuild の buildspec.yml のバージョン 0.2 がリリースされていました

こんにちは、藤本です。

現地時間 5/9 に Forum ページで CodeBuild の buildspec.yml のバージョン 0.2 がリリースされた旨が公開されていました。

変更内容

変更内容は Forum ページに記載がある通りです。

環境変数の指定方法

環境変数の設定キーがenvironment_variablesからenvに、plaintextvariablesに変わりました。

0.2 の記法

env:
  variables:
    KEY1: VALUE1
    KEY2: VALUE2

0.1 の記法

environment_variables:
  plaintext:
    KEY1: VALUE1
    KEY2: VALUE2

スッキリしましたね。

なお、バージョン 0.2 ではenvironment_variablesの記述は非推奨となっています。既存のbuildspec.ymlのバージョンを 0.2 へ変更する際は、環境変数の記法を忘れずに変更しましょう。

同一シェルによる実行

0.1 まではコマンド一つ一つが異なるシェルで実行されていたようです。カレントディレクトリがコマンド毎に元に戻されたり、設定した環境変数がコマンド毎にリセットされる状況でした。バージョン 0.2 を利用することで同一シェルでコマンドが実行されるため、カレントディレクトリ、環境変数が保持されるようになりました。

例えば、下記のコマンドはカレントディレクトリのパスを表示して、親階層へ移動して、カレントディレクトリのパスを表示します。手元のターミナルで試していただければ分かりますが、pwdの結果は異なります。ただ今までの CodeBuild では同じ結果が返ってきました。

phases:
  build:
    commands:
      - pwd
      - cd ..
      - pwd

以前、私がハマり、下記エントリに記載したものが解消されていました。

Elastic Beanstalk のカスタムプラットフォームを継続的デリバリする

バージョン 0.2 の利用方法

現在、buildspec.ymlはバージョン 0.1、0.2 のどちらでも使えます。今まで使っていたものが使えなくなるということは今現在はありません。バージョン 0.2 を利用したい場合、buildspec.ymlversion0.2を指定するだけです。

version: 0.2

試してみた

それでは新旧のバージョンで動作を比較してみましょう。

バージョン 0.1

まずはバージョン 0.1 だとそもそもどういう記述と動作か確認しておきます。

buildspec.yml
version: 0.1

environment_variables:
  plaintext:
    KEY: VALUE

phases:
  build:
    commands:
      - pwd
      - cd .. && pwd
      - pwd
      - echo $KEY
      - KEY=CHANGE
      - echo $KEY

ソースコードリポジトリへのプッシュ

$ git commit -am "buildspec.yml test v0.1"
[master e11be3c] buildspec.yml test v0.1
 1 file changed, 15 insertions(+), 23 deletions(-)
 rewrite buildspec.yml (95%)

$ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 411 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/NodePlatform_AmazonLinux
   3afe8bb..e11be3c  master -> master

ビルドの実行

$ aws codebuild start-build --project-name buildtest --region us-west-2
<snip>
        "id": "buildtest:9aa4f35d-074f-445d-a43f-b906a242c9c6",
<snip>

動作確認

Build のログを CloudWatch Logs から確認します。

$ aws logs get-log-events --log-group-name /aws/codebuild/buildtest --log-stream-name 9aa4f35d-074f-445d-a43f-b906a242c9c6 --region us-west-2
<snip>
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "[Container] 2017/05/24 01:38:40 Running command pwd\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "/tmp/src634227524/src\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "[Container] 2017/05/24 01:38:40 Running command cd .. && pwd\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "/tmp/src634227524\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "[Container] 2017/05/24 01:38:40 Running command pwd\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "/tmp/src634227524/src\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "[Container] 2017/05/24 01:38:40 Running command echo $KEY\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "VALUE\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "[Container] 2017/05/24 01:38:40 Running command KEY=CHANGE\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "[Container] 2017/05/24 01:38:40 Running command echo $KEY\n"
        },
        {
            "ingestionTime": 1495589921653,
            "timestamp": 1495589921000,
            "message": "VALUE\n"
        },
<snip>

カレントディレクトリも、環境変数も、コマンド単位でリセットされていることが分かります。

バージョン 0.2

続いて、バージョン 0.2 の記述と動作を確認します。

version: 0.2

env:
  variables:
    KEY: VALUE

phases:
  build:
    commands:
      - pwd
      - cd .. && pwd
      - pwd
      - echo $KEY
      - KEY=CHANGE
      - echo $KEY

ソースコードリポジトリへのプッシュ

$ git commit -am "buildspec.yml test v0.2"
[master 01b4d45] buildspec.yml test v0.2
 1 file changed, 3 insertions(+), 3 deletions(-)
$ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 338 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/NodePlatform_AmazonLinux
   e11be3c..01b4d45  master -> master

ビルドを実行します。

$ aws codebuild start-build --project-name buildtest --region us-west-2
<snip>
        "id": "buildtest:baaffef8-1d9f-434e-8796-9d901c0c5405",
<snip>

ログから実行結果を確認します。

$ aws logs get-log-events --log-group-name /aws/codebuild/buildtest --log-stream-name baaffef8-1d9f-434e-8796-9d901c0c5405 --region us-west-2
<snip>
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "[Container] 2017/05/24 01:53:30 Running command pwd\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "/tmp/src996175544/src\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "[Container] 2017/05/24 01:53:30 Running command cd .. && pwd\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "/tmp/src996175544\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "[Container] 2017/05/24 01:53:30 Running command pwd\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "/tmp/src996175544\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "[Container] 2017/05/24 01:53:30 Running command echo $KEY\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "VALUE\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "[Container] 2017/05/24 01:53:30 Running command KEY=CHANGE\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "[Container] 2017/05/24 01:53:30 Running command echo $KEY\n"
        },
        {
            "ingestionTime": 1495590812026,
            "timestamp": 1495590812000,
            "message": "CHANGE\n"
        },

バージョン 0.2 ではカレントディレクトリも、環境変数も保持されていることが分かります。

まとめ

いかがでしたでしょうか? 私自身、ハマった経験もあり、その時は異なるシェルが利用されているとは思っていなかったため、CodeBuild はブラックボックスで怖いな、と思っていましたが、スッキリしました。コマンド単位でカレントディレクトリを移動して、コマンド実行したり、環境変数もコマンド単位で設定可能なのでワークアラウンドがあったので、大きなアップデートではないですが、シンプルに設定ファイルを書けるようになったのは嬉しいですね。