ジョブスクリプトでCI/CD変数を使用する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
すべてのCI/CD変数は、ジョブの環境内で環境変数として設定されます。各環境のシェルに対して標準的な形式でジョブスクリプト内の変数を使用できます。
環境変数にアクセスするには、Runner executorのシェルの構文を使用します。
Bash、shなどでの使用
Bash、sh、および同様のシェルで環境変数にアクセスするには、CI/CD変数に($)をプレフィックスとして付けます:
job_name:
script:
- echo "$CI_JOB_ID"PowerShellでの使用
システムによって設定された環境変数を含む、Windows PowerShell環境で変数にアクセスするには、変数名の前に$env:または$を付けます:
job_name:
script:
- echo $env:CI_JOB_ID
- echo $CI_JOB_ID
- echo $env:PATH場合によっては、環境変数を適切に展開するには次のように引用符で囲む必要があります:
job_name:
script:
- D:\\qislsf\\apache-ant-1.10.5\\bin\\ant.bat "-DsosposDailyUsr=$env:SOSPOS_DAILY_USR" portal_testWindowsバッチでの使用
WindowsバッチでCI/CD変数にアクセスするには、次のように変数を%で囲みます:
job_name:
script:
- echo %CI_JOB_ID%遅延展開には、変数を!で囲むこともできます。空白または改行を含む変数には、遅延展開が必要な場合があります:
job_name:
script:
- echo !ERROR_MESSAGE!サービスコンテナ内での使用
サービスコンテナはCI/CD変数を使用できますが、デフォルトでは.gitlab-ci.ymlファイルに保存された変数にのみアクセスできます。サービスコンテナはデフォルトで信頼されないため、GitLab UIで追加された変数は、サービスコンテナでは使用できません。
UIで定義した変数をサービスコンテナで使用できるようにするには、.gitlab-ci.ymlで別の変数に再割り当てることができます:
variables:
SA_PASSWORD_YAML_FILE: $SA_PASSWORD_UI再割り当てされた変数は、元の変数と同じ名前にすることはできません。名前が同じの場合、正しく展開されません。
環境変数を別のジョブに渡す
ジョブで新しい環境変数を作成し、後のステージで別のジョブに渡すことができます。これらの変数は、パイプラインを設定するためのCI/CD変数として(たとえば、rulesキーワードで)使用することはできませんが、ジョブスクリプトでは使用できます。
ジョブで作成された環境変数は、次の方法で他のジョブに渡せます:
- ジョブスクリプトで、変数を
.envファイルとして保存します。- ファイルの形式は、1行に1つの変数定義である必要があります。
- 各行は、
VARIABLE_NAME=ANY VALUE HEREという形式で記述する必要があります。 - 値は引用符で囲むことができますが、改行文字を含めることはできません。
.envファイルをartifacts:reports:dotenvアーティファクトとして保存します。- 後のステージのジョブは、ジョブが
dotenv変数を受け取らないように構成されていない限り、スクリプトで変数を使用できます。
例:
build-job:
stage: build
script:
- echo "BUILD_VARIABLE=value_from_build_job" >> build.env
artifacts:
reports:
dotenv: build.env
test-job:
stage: test
script:
- echo "$BUILD_VARIABLE" # Output is: 'value_from_build_job'dotenvレポートからの変数は、ジョブ定義変数など、特定のタイプの新しい変数定義よりも優先されます。
dotenv変数をダウンストリームパイプラインに渡すこともできます。
どのジョブがdotenv変数を受け取るかを制御する
dependenciesキーワードまたはneedsキーワードを使用して、どのジョブがdotenvアーティファクトを受け取るのかを制御できます。
次の手順で、dotenvアーティファクトから環境変数を受け取らないようにできます:
- 空の
dependenciesまたはneeds配列を渡す。 needs:artifactsをfalseとして渡す。dotenvアーティファクトを持たないジョブのみをリストするようにneedsを設定する。
例:
build-job1:
stage: build
script:
- echo "BUILD_VERSION=v1.0.0" >> build.env
artifacts:
reports:
dotenv: build.env
build-job2:
stage: build
needs: []
script:
- echo "This job has no dotenv artifacts"
test-job1:
stage: test
script:
- echo "$BUILD_VERSION" # Output is: 'v1.0.0'
dependencies:
- build-job1
test-job2:
stage: test
script:
- echo "$BUILD_VERSION" # Output is ''
dependencies: []
test-job3:
stage: test
script:
- echo "$BUILD_VERSION" # Output is: 'v1.0.0'
needs:
- build-job1
test-job4:
stage: test
script:
- echo "$BUILD_VERSION" # Output is: 'v1.0.0'
needs:
- job: build-job1
artifacts: true
test-job5:
stage: deploy
script:
- echo "$BUILD_VERSION" # Output is ''
needs:
- job: build-job1
artifacts: false
test-job6:
stage: deploy
script:
- echo "$BUILD_VERSION" # Output is ''
needs:
- build-job2scriptセクションからartifactsまたはcacheに環境変数を渡します。
$GITLAB_ENVを使用して、scriptセクションで定義された環境変数をartifactsまたはcacheキーワードで使用します。例:
build-job:
stage: build
script:
- echo "ARCH=$(arch)" >> $GITLAB_ENV
- touch some-file-$(arch)
artifacts:
paths:
- some-file-$ARCH1つの変数に複数の値を格納する
値の配列であるCI/CD変数を作成することはできませんが、シェルスクリプト手法を使用して同様の動作を実現できます。
たとえば、スペースで区切られた複数の値を変数に格納し、スクリプトでその値をループ処理できます:
job1:
variables:
FOLDERS: src test docs
script:
- |
for FOLDER in $FOLDERS
do
echo "The path is root/${FOLDER}"
done他の変数でCI/CD変数を使用する
次のように、他の変数内で変数を使用できます:
job:
variables:
FLAGS: '-al'
LS_CMD: 'ls "$FLAGS"'
script:
- 'eval "$LS_CMD"' # Executes 'ls -al'文字列の一部として
文字列の一部として変数を使用できます。中括弧({})で変数を囲み、変数名を周囲のテキストから区別しやすくすることができます。中括弧がない場合、隣接するテキストは変数名の一部として解釈されます。例:
job:
variables:
FLAGS: '-al'
DIR: 'path/to/directory'
LS_CMD: 'ls "$FLAGS"'
CD_CMD: 'cd "${DIR}_files"'
script:
- 'eval "$LS_CMD"' # Executes 'ls -al'
- 'eval "$CD_CMD"' # Executes 'cd path/to/directory_files'CI/CD変数で$文字を使用する
$文字を別の変数の開始として解釈させたくない場合は、代わりに$$を使用します:
job:
variables:
FLAGS: '-al'
LS_CMD: 'ls "$FLAGS" $$TMP_DIR'
script:
- 'eval "$LS_CMD"' # Executes 'ls -al $TMP_DIR'これは、CI/CD変数をダウンストリームパイプラインに渡す場合には機能しません。