2020年6月25日のAWS CodeBuildのアップデートです。
AWS CodeBuildが追加のシェル環境をサポートするようになりました。
AWS CodeBuild Now Supports Additional Shell Environments
AWS CodeBuildを利用すると、ビルド用コンテナが作成され、その中でShellが起動し、buildspec.ymlで定義したコマンドが実行されます。 どのShellが起動するかは、今までは指定できず、Linuxコンテナならsh、WindowsコンテナならPowershellと決まっていましたが、今回のアップデートで他のShellも選択できるようになりました。
For Linux operating systems, supported shell tags are: • bash • /bin/sh For Windows operating systems, supported shell tags are: • powershell.exe • cmd.exe Build specification reference for CodeBuild
以下でShellを指定し、動作確認してみます。
なお、一般的にCodeBuildはアプリケーションをビルドしたり、コンテナイメージを作成したりするのに使われますが、今回は単純にどのShellが動いているのか確認するだけのビルドプロジェクトを作成します。
1.Amazon Linux 2で動作確認
まずはAmazon Linux 2のイメージでShellをbashに指定してみます。
1-1.S3バケットの作成
buildspec.ymlを含むビルドスクリプトを格納するためのS3バケットを作成します。
# 任意の名前のS3バケットの作成
$ aws s3 mb s3://codebuild-shelltest-project-input
1-2.ビルドスクリプトの作成
今回は手元のMacBookで操作しました。
作業ディレクトリ作成
# 任意の名前の作業ディレクトリの作成し、移動 $ mkdir codebuild-shelltest-project $ cd codebuild-shelltest-project
buildspec.yml作成
version: 0.2 env: shell: bash phases: install: commands: - echo Nothing to do in the install phase... - ps -p $$ pre_build: commands: - echo Nothing to do in the pre_build phase... - ps -p $$ build: commands: - echo Nothing to do in the build phase... - ps -p $$ post_build: commands: - echo Nothing to do in the post_build phase... - ps -p $$
3〜4行目が今回のアップデート部分で、Shellを指定しています。 また、現在動いているプロセスを確認するために、ps -p $$を実行させます。
zipで固める
# 任意の名前のzipファイルを作成 $ zip -r codebuild-shelltest.zip .
1-3.S3へビルドスクリプトをアップロード
# zipファイルをS3バケットへアップロード
$ aws s3 cp codebuild-shelltest.zip s3://codebuild-shelltest-project-input/codebuild-shelltest.zip
1-4.CodeBuildプロジェクトの作成
設定項目 | 値 |
---|---|
プロジェクト名 | 任意 |
ソースプロバイダ | Amazon S3 |
バケット | 上記作成したS3バケット名 |
S3 オブジェクトキーまたは S3 フォルダ | 上記でアップロードしたzipファイル名 |
環境イメージ | マネージド型イメージ(Amazon Linux 2) |
ビルド仕様 | buildspecファイルを使用する |
1-5.ビルドの実行
プロジェクトを指定し、ビルドの開始をします。
1-6.ビルドログ確認
ビルドが完了すると、ビルドログが表示され、bashが実行されているのがわかります。
ビルドログ抜粋
[Container] 2020/06/29 03:41:17 Running command ps -p $$ PID TTY TIME CMD 55 ? 00:00:00 bash
ビルドログ全行
[Container] 2020/06/29 03:41:13 Waiting for agent ping [Container] 2020/06/29 03:41:15 Waiting for DOWNLOAD_SOURCE [Container] 2020/06/29 03:41:17 Phase is DOWNLOAD_SOURCE [Container] 2020/06/29 03:41:17 CODEBUILD_SRC_DIR=/codebuild/output/src788750357/src [Container] 2020/06/29 03:41:17 YAML location is /codebuild/output/src788750357/src/buildspec.yml [Container] 2020/06/29 03:41:17 Selecting shell bash as specified in buildspec. [Container] 2020/06/29 03:41:17 Processing environment variables [Container] 2020/06/29 03:41:17 No runtime version selected in buildspec. [Container] 2020/06/29 03:41:17 Moving to directory /codebuild/output/src788750357/src [Container] 2020/06/29 03:41:17 Registering with agent [Container] 2020/06/29 03:41:17 Phases found in YAML: 4 [Container] 2020/06/29 03:41:17 BUILD: 2 commands [Container] 2020/06/29 03:41:17 POST_BUILD: 2 commands [Container] 2020/06/29 03:41:17 INSTALL: 2 commands [Container] 2020/06/29 03:41:17 PRE_BUILD: 2 commands [Container] 2020/06/29 03:41:17 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED [Container] 2020/06/29 03:41:17 Phase context status code: Message: [Container] 2020/06/29 03:41:17 Entering phase INSTALL [Container] 2020/06/29 03:41:17 Running command echo Nothing to do in the install phase... Nothing to do in the install phase... [Container] 2020/06/29 03:41:17 Running command ps -p $$ PID TTY TIME CMD 55 ? 00:00:00 bash [Container] 2020/06/29 03:41:18 Phase complete: INSTALL State: SUCCEEDED [Container] 2020/06/29 03:41:18 Phase context status code: Message: [Container] 2020/06/29 03:41:18 Entering phase PRE_BUILD [Container] 2020/06/29 03:41:18 Running command echo Nothing to do in the pre_build phase... Nothing to do in the pre_build phase... [Container] 2020/06/29 03:41:18 Running command ps -p $$ PID TTY TIME CMD 66 ? 00:00:00 bash [Container] 2020/06/29 03:41:18 Phase complete: PRE_BUILD State: SUCCEEDED [Container] 2020/06/29 03:41:18 Phase context status code: Message: [Container] 2020/06/29 03:41:18 Entering phase BUILD [Container] 2020/06/29 03:41:18 Running command echo Nothing to do in the build phase... Nothing to do in the build phase... [Container] 2020/06/29 03:41:18 Running command ps -p $$ PID TTY TIME CMD 73 ? 00:00:00 bash [Container] 2020/06/29 03:41:18 Phase complete: BUILD State: SUCCEEDED [Container] 2020/06/29 03:41:18 Phase context status code: Message: [Container] 2020/06/29 03:41:18 Entering phase POST_BUILD [Container] 2020/06/29 03:41:18 Running command echo Nothing to do in the post_build phase... Nothing to do in the post_build phase... [Container] 2020/06/29 03:41:18 Running command ps -p $$ PID TTY TIME CMD 80 ? 00:00:00 bash [Container] 2020/06/29 03:41:18 Phase complete: POST_BUILD State: SUCCEEDED [Container] 2020/06/29 03:41:18 Phase context status code: Message:
1-7.POSIXモードを使うかどうか
さて、CodeBuildでbash使えるようになりました。 しかし、Amazon Linux 2に詳しい方は、疑問に思うかもしれません。 なぜなら、実はAmazon Linux 2のshは、bashのシンボリックリンクになっているからです。
[Container] 2020/06/29 04:20:23 Running command cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
[Container] 2020/06/29 04:20:23 Running command ls -l /bin/sh lrwxrwxrwx 1 root root 4 Apr 7 01:49 /bin/sh -> bash [Container] 2020/06/29 04:20:23 Running command ls -l /bin/bash -rwxr-xr-x 1 root root 935968 Jan 16 00:56 /bin/bash [Container] 2020/06/29 04:20:23 Running command ls -l /usr/bin/sh lrwxrwxrwx 1 root root 4 Apr 7 01:49 /usr/bin/sh -> bash [Container] 2020/06/29 04:20:23 Running command ls -l /usr/bin/bash -rwxr-xr-x 1 root root 935968 Jan 16 00:56 /usr/bin/bash
それでは、どれを使ってもbashで違いは無いのでは?と思ってしまいますが、意味はあります。 shでbashを呼び出すと、bashがPOSIXモードで動作するようになります。 どのように動作が変わるかは下記リンク先に記載があります。
6.11 Bash POSIX Mode When invoked as sh, Bash enters POSIX mode after reading the startup files.
結論として、いわゆるBashを使いたい場合は、設定をした方が良いと思います。
2.Ubuntuでのbash利用
Ubuntuのshは、実はshでもなく、bashでもなく、dashです。 したがって、Ubuntuでbashを指定するのは意味があります。
[Container] 2020/06/28 17:11:54 Running command cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/bash /bin/rbash /bin/dash
[Container] 2020/06/29 04:25:27 Running command ls -l /bin/sh lrwxrwxrwx 1 root root 4 Apr 3 17:13 /bin/sh -> dash [Container] 2020/06/29 04:25:27 Running command ls -l /bin/bash -rwxr-xr-x 1 root root 1113504 Jun 6 2019 /bin/bash [Container] 2020/06/29 04:25:27 Running command ls -l /bin/rbash lrwxrwxrwx 1 root root 4 Jun 6 2019 /bin/rbash -> bash [Container] 2020/06/29 04:25:27 Running command ls -l /bin/dash -rwxr-xr-x 1 root root 121432 Jan 25 2018 /bin/dash
まとめ
今までは、AWS CodeBuildのビルドスクリプトの中で、Amazon Linux 2はsh(POSIX互換のBash)、Ubuntuはdash、WindowsはPowershellが利用可能でした。 今後は、bashやCMDも利用可能となりました。
渡辺 信秀(記事一覧)
2017年入社 / 地味な内容を丁寧に書きたい