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

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

Variables that are used in pipes get passed between lots of different systems, and if you are not careful this can lead to unexpected results. For example, if someone using your pipe writes: MY_VARIABLE: "\\\\" then the value of MY_VARIABLE your pipe receives is '\'!
(You can read more about issues escaping characters, on Community).

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

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

  • in a shell script, always use double quotes when referencing a variable
    do:
    command --option1 "$VAR1" --option2 "$VAR2" --option3 "$VAR3"

    don't do:
    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  You can use this directory to pass information or artifacts between subsequent runs of your pipe.

  • 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

 

 

その他のヘルプ