変数の使用場所
CI/CD変数のドキュメントに記載されているように、様々な変数を定義することができます。それらのいくつかはGitLabのCI/CD機能すべてに使えますが、いくつかは多かれ少なかれ制限されています。
このドキュメントでは、さまざまな種類の変数がどこでどのように使えるのかを説明します。
変数の使用法
定義された変数が使用できる場所は2つあります。それは
- GitLab 側では、
.gitlab-ci.ymlファイル。 - GitLab Runner側、
config.toml。
.gitlab-ci.yml ファイル
GitLab 16.4 で導入された
CI_ENVIRONMENT_SLUG以外のCI_ENVIRONMENT_*変数をサポートしました。
| 定義 | 拡大可能か? | 拡張場所 | 説明 |
|---|---|---|---|
after_script | yes | スクリプト実行シェル | 変数の展開は実行シェルの環境によって行われます。 |
artifacts:name | yes | Runner | 変数の展開は GitLab Runner の Shell 環境によって行われます。 |
before_script | yes | スクリプト実行シェル | 変数の展開は、実行シェル環境 |
cache:key | yes | Runner | 変数の展開は GitLab Runner の内部変数展開メカニズムによって行われます。 |
cache:policy | yes | Runner | 変数の展開は GitLab Runner の内部変数展開メカニズムによって行われます。 |
environment:name | yes | GitLab |
environment:url と似ていますが、変数の展開は以下をサポートしていません:- CI_ENVIRONMENT_* 変数-永続化された変数。 |
environment:url | yes | GitLab | 変数の展開は、GitLab の内部変数展開メカニズムによって行われます。 サポートされるのは、ジョブに対して定義されたすべての変数です(プロジェクト/グループの変数、 .gitlab-ci.yml からの変数、トリガーからの変数、パイプラインスケジュールからの変数)。サポートされないのは、GitLab Runner config.toml で定義された変数と、ジョブのscriptで作成された変数です。 |
environment:auto_stop_in | yes | GitLab | 変数の展開はGitLabの内部変数展開メカニズムによって行われます。 代入される変数の値は、人間が読める自然言語形式の期間でなければなりません。詳しくは可能な入力をご覧ください。 |
except:variables | いいえ | 該当なし |
$variable- CI_ENVIRONMENT_SLUG 変数-永続変数。 |
id_tokens:aud | yes | GitLab | 変数の展開はGitLabの内部変数展開メカニズムによって行われます。変数展開はGitLab 16.1で導入されました。 |
image | yes | Runner | 変数の展開は GitLab Runner の内部変数展開メカニズムによって行われます。 |
include | yes | GitLab | 変数の展開はGitLabの内部変数展開メカニズムによって行われます。 サポートされている変数についての詳細はUse variables with includeをご覧ください。 |
only:variables | いいえ | 該当なし |
$variable- CI_ENVIRONMENT_SLUG 変数-永続変数。 |
resource_group | yes | GitLab |
environment:url と似ていますが、変数の展開は以下をサポートしていません:- CI_ENVIRONMENT_URL-永続変数。 |
rules:changes | yes | GitLab | 変数の展開はGitLabの内部変数展開メカニズムによって行われます。 |
rules:exists | yes | GitLab | 変数の展開はGitLabの内部変数展開メカニズムによって行われます。 |
rules:if | いいえ | 該当なし |
$variable- CI_ENVIRONMENT_SLUG 変数-永続変数。 |
script | yes | スクリプト実行シェル | 変数の展開は実行シェルの環境によって行われます。 |
services:name | yes | Runner | 変数の展開は GitLab Runner の内部変数展開メカニズムによって行われます。 |
services | yes | Runner | 変数の展開は GitLab Runner の内部変数展開メカニズムによって行われます。 |
tags | yes | GitLab | 変数の展開はGitLabの内部変数展開メカニズムによって行われます。GitLab 14.1で導入されました。 |
trigger およびtrigger:project | yes | GitLab | 変数の展開はGitLabの内部変数展開メカニズムによって行われます。GitLab 15.3で導入された trigger:project の変数展開。 |
variables | yes | GitLab/Runner | 変数の展開はまずGitLabの内部変数展開メカニズムによって行われ、認識できない変数や利用できない変数はGitLab Runnerの内部変数展開メカニズムによって展開されます。 |
workflow:name | yes | GitLab |
サポートされる変数は、 workflowで利用可能なすべての変数です。- プロジェクト/グループ変数。 - グローバル変数。 variables とworkflow:rules:variables (ルールにマッチする場合)。- 親パイプラインから継承された変数。 - トリガーからの変数。 - パイプラインスケジュールからの変数。 サポートされない変数は、GitLab Runner config.tomlで定義された変数、ジョブで定義された変数、またはPersisted 変数です。 |
config.toml ファイル
| 定義 | 拡大可能か? | 説明 |
|---|---|---|
runners.environment | yes | 変数の展開は GitLab Runner の内部変数展開メカニズムによって行われます。 |
runners.kubernetes.pod_labels | yes | 変数の展開は GitLab Runner の内部変数展開メカニズムによって行われます。 |
runners.kubernetes.pod_annotations | yes | 変数の展開は GitLab Runner の内部変数展開メカニズムによって行われます。 |
config.toml についてはGitLab Runner のドキュメントを参照してください。
拡張メカニズム
拡張メカニズムは3つあります:
- GitLab
- GitLab Runner
- 実行シェル環境
GitLab 内部変数展開メカニズム
展開される部分は$variable 、または${variable} 、または%variable% の形式である必要があります。どのランナーがジョブを取得する前にGitLab内部で展開が行われるため、どのOS/Shellがジョブを処理しても、それぞれの形式は同じように処理されます。
入れ子の変数展開
- GitLab 13.10 で導入。
variable_inside_variable機能フラグの背後でデプロイされ、デフォルトでは無効になっています。 - GitLab14.3でGitLab.comで有効に。
- GitLab 14.4でセルフマネージドで有効。
- GitLab 14.5で機能フラグ
variable_inside_variableが削除されました。
GitLab はジョブの変数値をランナーに送る前に再帰的に展開します。例えば、以下のシナリオでは
- BUILD_ROOT_DIR: '${CI_BUILDS_DIR}'
- OUT_PATH: '${BUILD_ROOT_DIR}/out'
- PACKAGE_PATH: '${OUT_PATH}/pkg'
ランナーは有効で完全なパスを受け取ります。例えば、${CI_BUILDS_DIR} が/output であれば、PACKAGE_PATH は/output/out/pkgとなります。
使用できない変数への参照はそのまま残ります。この場合、ランナーは実行時に変数値の展開を試みます。たとえば、CI_BUILDS_DIR のような変数は、ランナーによって実行時にのみ認識されます。
GitLab Runnerの内部変数展開メカニズム
- サポート: プロジェクト/グループ変数、
.gitlab-ci.yml変数、config.toml変数、トリガー、パイプラインスケジュール、手動パイプラインからの変数。 - サポート対象外: スクリプト内部で定義された変数 (例:
export MY_VARIABLE="test")。
Runner は変数の展開に Go のos.Expand() メソッドを使用します。つまり、$variable と${variable} として定義された変数のみを扱います。変数の定義の順番や、GitLab でネストされた変数の展開が有効になっているかどうかによって、ネストされた変数が動作するかどうかが変わってきます。
実行シェル環境
これはscript の実行中に行われる拡張フェーズです。その動作は使用するシェルに依存します (bash,sh,cmd, PowerShell)。例えば、ジョブのscript にecho $MY_VARIABLE-${MY_VARIABLE_2}という行が含まれている場合、bash/sh では適切に処理されますが (変数が定義されているかどうかによって、空文字列やいくつかの値が残されます)、Windows のcmd や PowerShell では動作しません。これらのシェルは異なる変数構文を使用するからです。
サポートされています:
-
scriptはシェルのデフォルト変数(例えば、$PATHは全ての bash/sh シェルに存在するはずです)と GitLab CI/CD で定義された全ての変数(プロジェクト/グループ変数、.gitlab-ci.yml変数、config.toml変数、トリガーやパイプラインスケジュールの変数)を使用することができます。 -
scriptは前の行で定義されたすべての変数を使うこともできます。例えば、export MY_VARIABLE="test":- で定義した場合、
before_scriptその行以降とbefore_script関連するscript. -
scriptでは、scriptの後続行で動作します。 - の後続
after_script行でafter_script動作します。
- で定義した場合、
after_script スクリプトの場合は、次のようになります:
- 同じ
after_scriptセクション内で、スクリプトの前に定義された変数のみを使用します。 -
before_scriptとscriptで定義された変数は使用しないでください。
これらの制限は、after_script スクリプトが分離された Shell コンテキストで実行されるために存在します。
永続変数
定義済みの変数の中には、「パーシステッド」と呼ばれるものがあります。
パイプラインレベルのパーシステッド変数:
CI_PIPELINE_IDCI_PIPELINE_URL
ジョブレベルの永続化変数:
CI_JOB_IDCI_JOB_URLCI_JOB_TOKENCI_JOB_STARTED_ATCI_REGISTRY_USERCI_REGISTRY_PASSWORDCI_REPOSITORY_URLCI_DEPLOY_USERCI_DEPLOY_PASSWORD
パーシステッド変数は以下のとおりです:
-
Expansion place “が定義されている場合にサポートされます:
- ランナー。
- スクリプト実行シェル。
- サポートされていません:
パイプライン・トリガ・ジョブはジョブ・レベルの永続化変数を使用できませんが、パイプライン・レベルの永続化変数を使用できます。
永続化された変数の中にはトークンが含まれているものがあり、セキュリティ上の理由から定義によっては使用できません。
環境スコープを持つ変数
環境スコープで定義された変数がサポートされています。review/staging/* のスコープで定義された変数$STAGING_SECRET があるとすると、一致する変数式に基づいて、動的環境を使用する以下のジョブが作成されます:
my-job:
stage: staging
environment:
name: review/$CI_JOB_STAGE/deploy
script:
- 'deploy staging'
rules:
- if: $STAGING_SECRET == 'something'