変数を使用できる場所
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
CI/CD変数ドキュメントで説明されているように、さまざまな変数を定義できます。すべてのGitLab CI/CD機能に使用できる変数もありますが、使用範囲がある程度制限されているものもあります。
このドキュメントでは、さまざまなタイプの変数をどこでどのように使用できるかについて説明します。
変数の使用
定義された変数は、次の2つの場所で使用できます:
- GitLab側(
.gitlab-ci.ymlファイル内)。 - GitLab Runner側(
config.toml内)。
.gitlab-ci.ymlファイル
| 定義 | 展開可否 | 展開場所 | 説明 |
|---|---|---|---|
after_script | 可 | スクリプト実行Shell | 変数の展開は、実行Shell環境が行います。 |
artifacts:name | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
artifacts:paths | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
artifacts:exclude | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
before_script | 可 | スクリプト実行Shell | 変数の展開は、実行Shell環境が行います。 |
cache:key | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
cache:paths | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
cache:policy | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
environment:name | 可 | GitLab | environment:urlと似ていますが、変数展開は次の変数をサポートしていません:- CI_ENVIRONMENT_*変数。- 永続変数。 |
environment:url | 可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。 ジョブに定義されたすべての変数(プロジェクト/グループ変数、 .gitlab-ci.ymlからの変数、トリガーからの変数、パイプラインスケジュールからの変数)がサポートされています。GitLab Runnerの config.tomlで定義された変数と、ジョブのscriptで作成された変数はサポートされていません。 |
environment:deployment_tier | 可 | GitLab | environment:urlと似ていますが、変数展開は次の変数をサポートしていません:- CI_ENVIRONMENT_*変数。- 永続変数。 |
environment:auto_stop_in | 可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。 代入される変数の値は、人間が判読可能な自然言語形式の期間である必要があります。詳細については、サポートされている値を参照してください。 |
environment:kubernetes:agent | 可 | GitLab | environment:urlと似ていますが、変数展開は次の変数をサポートしていません:- CI_ENVIRONMENT_*変数。- 永続変数。 |
environment:kubernetes:namespace | 可 | GitLab | environment:urlと似ていますが、変数展開は次の変数をサポートしていません:- CI_ENVIRONMENT_*変数。- 永続変数。 |
id_tokens:aud | 可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。変数展開はGitLab 16.1で導入されました。 |
image | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
include | 可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。 サポートされている変数の詳細については、includeで変数を使用するを参照してください。 |
resource_group | 可 | GitLab | environment:urlと似ていますが、変数展開は次の変数をサポートしていません:- CI_ENVIRONMENT_URL。- 永続変数。 |
rules:changes | 不可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。 |
rules:changes:compare_to | 不可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。 |
rules:exists | 不可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。 |
rules:if | 可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。 |
script | 可 | スクリプト実行Shell | 変数の展開は、実行Shell環境が行います。 |
services:name | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
services | 可 | Runner | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います。 |
tags | 可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。 |
triggerおよびtrigger:project | 可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。trigger:projectの変数展開は、GitLab 15.3で導入されました。 |
variables | 可 | GitLab/Runner | 変数の展開は、まずGitLabの内部変数展開メカニズムが行い、認識されない変数または利用できない変数は、GitLab Runnerの内部変数展開メカニズムが展開します。 |
workflow:name | 可 | GitLab | 変数の展開は、GitLabの内部変数展開メカニズムが行います。workflowで使用できるすべての変数がサポートされています:- プロジェクト/グループ変数。 - グローバル variablesおよびworkflow:rules:variables(ルールに一致する場合)。- 親パイプラインから継承された変数。 - トリガーからの変数。 - パイプラインスケジュールからの変数。 GitLab Runner config.tomlで定義された変数、ジョブで定義された変数、永続変数はサポートされていません。 |
config.tomlファイル
| 定義 | 展開可否 | 説明 |
|---|---|---|
runners.environment | 可 | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います |
runners.kubernetes.pod_labels | 可 | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います |
runners.kubernetes.pod_annotations | 可 | 変数の展開は、GitLab Runnerの内部変数展開メカニズムが行います |
config.tomlの詳細については、GitLab Runnerのドキュメントを参照してください。
展開メカニズム
次の3つの展開メカニズムがあります:
- GitLab
- GitLab Runner
- 実行Shell環境
GitLabの内部変数展開メカニズム
展開対象の部分は、$variable、${variable}、%variable%のいずれかの形式で記述する必要があります。各形式は、どのOS/Shellがジョブを処理するかに関係なく同じように処理されます。これは、Runnerがジョブを取得する前に、GitLabで展開が行われるためです。
ネストされた変数展開
GitLabは、ジョブ変数の値を再帰的に展開してから、Runnerに送信します。例として、次のシナリオについて説明します:
- BUILD_ROOT_DIR: '${CI_BUILDS_DIR}'
- OUT_PATH: '${BUILD_ROOT_DIR}/out'
- PACKAGE_PATH: '${OUT_PATH}/pkg'Runnerは、有効で完全な形式のパスを受け取ります。たとえば、${CI_BUILDS_DIR}が/outputの場合、PACKAGE_PATHは/output/out/pkgになります。
利用できない変数への参照は、そのまま残されます。この場合、Runnerはランタイムに変数値を展開しようとします。たとえば、CI_BUILDS_DIRのような変数は、Runnerがランタイムにのみ認識します。
GitLab Runnerの内部変数展開メカニズム
- サポート対象: プロジェクト/グループ変数、
.gitlab-ci.yml変数、config.toml変数、およびトリガー、パイプラインスケジュール、手動パイプラインからの変数。 - サポート対象外: スクリプト内で定義された変数(例:
export MY_VARIABLE="test")。
Runnerは、変数展開にGoのos.Expand()メソッドを使用します。つまり、$variableおよび${variable}として定義された変数のみを処理します。もう1つ重要な点として、展開は1回しか行われないため、ネストされた変数は、変数の定義の順序によって、またGitLabでネストされた変数の展開が有効になっているかどうかによって、動作する場合としない場合があります。
アーティファクトおよびキャッシュのアップロードの場合、Runnerは変数展開にGoのos.Expand()ではなく、mvdan.cc/sh/v3/expandを使用します。これは、mvdan.cc/sh/v3/expandがパラメータ展開をサポートしているためです。
実行Shell環境
これは、script実行中に発生する展開フェーズです。その動作は、使用されるShell(bash、sh、cmd、PowerShell)によって異なります。たとえば、ジョブのscriptにecho $MY_VARIABLE-${MY_VARIABLE_2}という行がある場合、bash/shでは適切に処理されるはずですが(変数が定義されているかどうかに応じて、空の文字列や値に置き換えられる)、WindowsのcmdまたはPowerShellでは異なる変数構文を使用するため動作しません。
サポート対象:
scriptでは、Shellでデフォルトとして利用可能なすべての変数(たとえば、すべてのbash/sh Shellに存在するはずの$PATH)と、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_DEPLOY_PASSWORDCI_DEPLOY_USERCI_JOB_IDCI_JOB_STARTED_ATCI_JOB_TOKENCI_JOB_URLCI_PIPELINE_CREATED_ATCI_REGISTRY_PASSWORDCI_REGISTRY_USERCI_REPOSITORY_URL
環境スコープを持つ変数
環境スコープで定義された変数がサポートされています。たとえば、review/staging/*のスコープで定義された変数$STAGING_SECRETがある場合、一致する変数式に基づいて、次のような動的環境を使用するジョブが作成されます:
my-job:
stage: staging
environment:
name: review/$CI_JOB_STAGE/deploy
script:
- 'deploy staging'
rules:
- if: $STAGING_SECRET == 'something'