シェル スクリプトの使用

1+ year ago1 min read
Last updated • Read time
クラウド
This document is applicable to CircleCI クラウド
Server v4.x
This document is applicable to CircleCI Server v4.x
Server v3.x
This document is applicable to CircleCI Server v3.x

概要

CircleCI の設定では、シェルスクリプトの記述が必要になることは少なくありません。 シェルスクリプトを使用すると、ビルドをより細かく制御できますが、エラーが発生する可能性があります。 以下に説明するベストプラクティスを参照すれば、これらのエラーの多くを回避することができます。

シェルスクリプトのベストプラクティス

ShellCheck の使用

ShellCheck は、シェル スクリプトの静的解析ツールです。bash/sh シェル スクリプトに対して警告と提案を行います。

ShellCheck を version: 2.1 の設定に追加するには、 ShellCheck Orb の使用が最も簡単な方法です ( 必ず x.y.z を有効なバージョンに変更してください)。

version: 2.1

orbs:
  shellcheck: circleci/shellcheck@x.y.z

workflows:
  check-build:
    jobs:
      - shellcheck/check # job defined within the orb so no further config necessary
      - build-job:
          requires:
            - shellcheck/check # only run build-job once shellcheck has run
          filters:
            branches:
              only: main # only run build-job on main branch

jobs:
  build-job:
    ...

または、version 2 の設定をご使用の場合は、 Orb を使わなくても ShellCheck を設定できます。

version: 2
jobs:
  shellcheck:
    docker:
      - image: koalaman/shellcheck-alpine:stable
        auth:
          username: mydockerhub-user
          password: $DOCKERHUB_PASSWORD  # context / project UI env-var reference
    steps:
      - checkout
      - run:
          name: Check Scripts
          command: |
            find . -type f -name '*.sh' | wc -l
            find . -type f -name '*.sh' | xargs shellcheck --external-sources
  build-job:
    ...

workflows:
  version: 2
  check-build:
    jobs:
      - shellcheck
      - build-job:
          requires:
            - shellcheck # only run build-job once shellcheck has run
          filters:
            branches:
              only: main # only run build-job on main branch

上述したように、この tmp.sh スクリプトファイルでは、公開すべきでない部分まで公開されています。

> cat tmp.sh
#!/bin/sh

set -o nounset
set -o errexit
set -o xtrace

if [ -z "${SECRET_ENV_VAR:-}" ]; then
  echo "You must set SECRET_ENV_VAR!" fi
> sh tmp.sh
+ '[' -z '' ']'
+ echo 'You must set SECRET_ENV_VAR!'
You must set SECRET_ENV_VAR!
> SECRET_ENV_VAR='s3cr3t!' sh tmp.sh
+ '[' -z 's3cr3t!' ']'

エラーフラグの設定

いくつかのエラーフラグを設定することで、好ましくない状況が発生した場合にスクリプトを自動的に終了できます。 厄介なエラーを回避するために、各スクリプトの先頭に以下のフラグを追加することをお勧めします。

#!/usr/bin/env bash

# Exit script if you try to use an uninitialized variable.
set -o nounset

# Exit script if a statement returns a non-true return value.
set -o errexit

# Use the error status of the first failure, rather than that of the last item in a pipeline.
set -o pipefail

シェルスクリプトの実行

ターミナルで、実行するスクリプトのフォルダ/場所に移動します。 ls を使用すると、スクリプトの正しいパスにいることを確認できます。 次にターミナルで以下を実行します。

sh <name-of-file>.sh

場合によっては、スクリプトがデフォルトで実行できないことがあり、実行する前にファイルを実行可能な状態にする必要があります。 このプロセスはプラットフォームによって異なり、お客様のプラットフォームでの方法を調べる必要があります。 たとえば、スクリプトファイル上で右クリックすると、実行可能にするオプションがあるかを確認できる場合があります。 macOS または Linux を使用している場合は、chmodコマンドを使用して、異なる権限でスクリプトファイルを実行可能にする方法を確認することができます。

関連リソース

堅牢な Bash シェルスクリプトの記述に関する詳しい説明と追加テクニックについては、 こちらのブログ記事を参照してください。