CodeBuildを使う時にbuildsopec.yml
を書きますよね。こんなやつ。
version: 0.2
env:
variables:
LANG: ja_JP.UTF-8
phases:
pre_build:
commands:
- REPOSITORY_URI=hoge
- IMAGE_TAG=0.1
build:
commands:
- docker build -t develop -f ./docker/Dockerfile .
- docker tag develop $REPOSITORY_URI:$IMAGE_TAG
...
この時に、各ステップで複数行のコマンドを各方法でちょっとハマりました。
例えば、ファイルの文字列置換をする時に↓のようなコマンドを書く場合です。
sed -i -e "s#<PARAM1>#${PARAM1}#" \
-e "s#<PARAM2>#${PARAM2}#" \
Dockerfile
失敗した方法
複数行のコマンドをそのまま書くと、怒られます。yaml的にインデントが狂ってしまうからですね。
version: 0.2
env:
variables:
LANG: ja_JP.UTF-8
phases:
pre_build:
commands:
- REPOSITORY_URI=hoge
- IMAGE_TAG=0.1
build:
commands:
- sed -i -e "s#<PARAM1>#${PARAM1}#" \
-e "s#<PARAM2>#${PARAM2}#" \
Dockerfile
- docker build -t develop -f ./docker/Dockerfile .
- docker tag develop $REPOSITORY_URI:$IMAGE_TAG
...
「複数行のコマンド」をyaml的に「改行を含んだ文字列」として書く必要があります。
こちらのqiitaの記事にyamlでの改行文字の扱いが詳しくまとめられていました。どうやら|
で複数行テキストとして扱ってくれるようですね。なので、buildspec.yaml
をこのようにしました。
version: 0.2
env:
variables:
LANG: ja_JP.UTF-8
phases:
pre_build:
commands:
- REPOSITORY_URI=hoge
- IMAGE_TAG=0.1
build:
commands:
- | sed -i -e "s#<PARAM1>#${PARAM1}#" \
-e "s#<PARAM2>#${PARAM2}#" \
Dockerfile
- docker build -t develop -f ./docker/Dockerfile .
- docker tag develop $REPOSITORY_URI:$IMAGE_TAG
...
これで行けるかと思いきや、、、またインデントがおかしいと怒られました。
正しい方法
正しくはこうです。先ほどとほとんど同じですが、|
の後に改行が入っています。この改行がないとだめなんですね。|
で複数業の文字列がかけるということは結構いろんなサイトに書いてあるのですが、|
の後に改行が必要だということは以外と見落としがちなのではないかと思いました。
version: 0.2
env:
variables:
LANG: ja_JP.UTF-8
phases:
pre_build:
commands:
- REPOSITORY_URI=hoge
- IMAGE_TAG=0.1
build:
commands:
- |
sed -i -e "s#<PARAM1>#${PARAM1}#" \
-e "s#<PARAM2>#${PARAM2}#" \
Dockerfile
- docker build -t develop -f ./docker/Dockerfile .
- docker tag develop $REPOSITORY_URI:$IMAGE_TAG
...