パイプの記述の高度なテクニック

パイプ変数での特殊文字の引用とエスケープ

パイプで使用される変数は多くの異なるシステム間で渡され、慎重に扱わない場合は予期しない結果が生じる可能性があります。たとえば、パイプを使用している人が「MY_VARIABLE: "\\\\"」と記述すると、パイプが受け取る MY_VARIABLE の値は '\' になります。
(コミュニティで、文字のエスケープの問題に関する詳細を確認できます)。

この種の問題を回避するのに役立ついくつかのベスト プラクティスがあります。

  • 複数の変数を持つコマンドを使用する必要がある場合、変数を別々に使用し、1 つにまとめないでください。

  • シェル スクリプトでは常に二重引用符を使用して変数を参照します。
    推奨:
    command --option1 "$VAR1" --option2 "$VAR2" --option3 "$VAR3"

    非推奨:
    ARGS= "--option1 $VAR1 --option2 $VAR2 --option3 $VAR3"
    command $ARGS


値のリスト (追加の引数のリストなど) や配列を含む変数を使用する必要がある場合、yaml で直接定義できます。例:

1 2 variables: EXTRA_ARGS: ['--description', 'text containing spaces', '--verbose']

 パイプ内では、これにより次の変数が生成されます。

1 2 3 4 EXTRA_ARGS_COUNT: 3 EXTRA_ARGS_0: --description EXTRA_ARGS_1: text containing spaces EXTRA_ARGS_2: --verbose

この一連の変数をパイプ内で配列型の変数に変換する必要がある場合、関数を定義する次の bash スクリプトなどを使用できます。

1 2 3 4 5 6 7 8 init_array_var() { local array_var=${1} local count_var=${array_var}_COUNT for (( i = 0; i < ${!count_var:=0}; i++ )) do eval ${array_var}[$i]='$'${array_var}_${i} done }

関数を使用するには、次のように記述します。

1 2 3 init_array_var 'EXTRA_ARGS' command --option1 "$VAR1" --option2 "$VAR2" --option3 "$VAR3" "${EXTRA_ARGS[@]}"

パイプ間での情報の共有

パイプ間でステータスやその他の情報を共有できるようにしたい場合、パイプラインが有効な間のみ存在する 2 つの組み込み変数があります。

  • BITBUCKET_PIPE_STORAGE_DIR このディレクトリを使用して、以降の実行パイプ間で情報やアーティファクトを渡すことができます。

  • BITBUCKET_PIPE_SHARED_STORAGE_DIR 別のパイプから情報を取得する必要がある場合は、このディレクトリから読み取ることができます。

そのため、パイプラインの後のステップで自身のパイプを使用したデータを保存したい場合、次のようなスクリプトを作成できます。

1 2 3 #!/bin/sh set -e echo "{'key': 'value'}" >> $BITBUCKET_PIPE_STORAGE_DIR/<filename>

このデータをあとのステップで読み取るには、次の手順を実行します。

1 2 3 #!/bin/sh set -e cat $BITBUCKET_PIPE_STORAGE_DIR/<filename>

別のパイプのデータを読み取ることもできます。

これを行うには、使用するパイプのキーと、それを所有するアカウントを知っておく必要があります。

1 2 3 #!/bin/sh set -e cat $BITBUCKET_PIPE_SHARED_STORAGE_DIR/<pipeAccount>/<pipeName>/metadata.json

たとえば、aws-lambda-deploy パイプから aws-lambda-deploy-env ファイルにアクセスするには、次のように記述する必要があります。

1 2 3 #!/bin/sh set -e cat $BITBUCKET_PIPE_SHARED_STORAGE_DIR/atlassian/aws-lambda-deploy/aws-lamda-deploy-env

 

 

その他のヘルプ