正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

ジョブスクリプトで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_test

Windowsバッチでの使用

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キーワードで)使用することはできませんが、ジョブスクリプトでは使用できます。

ジョブで作成された環境変数は、次の方法で他のジョブに渡せます:

  1. ジョブスクリプトで、変数を.envファイルとして保存します。
    • ファイルの形式は、1行に1つの変数定義である必要があります。
    • 各行は、VARIABLE_NAME=ANY VALUE HEREという形式で記述する必要があります。
    • 値は引用符で囲むことができますが、改行文字を含めることはできません。
  2. .envファイルをartifacts:reports:dotenvアーティファクトとして保存します。
  3. 後のステージのジョブは、ジョブが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:artifactsfalseとして渡す。
  • 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-job2

scriptセクションから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-$ARCH

1つの変数に複数の値を格納する

値の配列である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変数をダウンストリームパイプラインに渡す場合には機能しません。