ヘッダー画像

【GitLab CI】変数のタイプと可視化について

投稿 2025年2月24日 最終更新 2025年2月24日 専門用語多め

前置き

GitLab CI/CDにおける変数を使う際に「タイプ」と「可視化」という項目が、どう違うのかがわからなかったので、実際に動かしてみてみました。

環境はDockerでGitLab EE v17.8.2を構築しています。

定義済み変数

CI/CDの変数の話に入る前に、ちらっと出てくるので先に説明しておきます。

GitLabのほうで定義されている変数も、そのまま使用することが可能です。

定義済み変数の参照を見て、必要な変数を使えます。

使い方としては$(ドル)の後に変数名を書けば使えます。

script:
  - echo $CI_COMMIT_BRANCH
$ echo $CI_COMMIT_BRANCH
main

変数の種類

GitLab CI/CDの変数を追加する際に、変数の種類を指定します。

主に変更する「タイプ」と「可視化」は、下記のような選択しが存在します。

  • タイプ
    • 変数(デフォルト)
    • ファイル
  • 可視化
    • 表示
    • マスクする
    • マスクして非表示

今回は下記のような設定を行います。

キー タイプ 可視化
VAR_DISP 変数 表示 var_disp_test
VAR_MASK 変数 マスクする var_mask_test
VAR_MASK_HIDDEN 変数 マスクして非表示 var_mask_hidden_test
FILE_DISP ファイル 表示 file_disp_test
FILE_MASK ファイル マスクする file_mask_test
FILE_MASK_HIDDEN ファイル マスクして非表示 file_mask_hidden_test

画面上

画面上(GUI)だと、「表示」と「マスクする」は特に変わりません。

「値を表示する」ボタンを押せば、値が確認できます。

「マスクして非表示」にすると、値は確認できません。

変数

スクリプト

スクリプトで動作が変わるのは、マスクしているか・していないか
で変化します。

つまり非表示かどうかは関係ないです。

変数

タイプが変数の場合は、よくある一般的な動作になります。

script:
  - echo $VAR_DISP
  - echo $VAR_MASK
  - echo $VAR_MASK_HIDDEN

上記のようにechoで変数を出力すると、下記のような実行結果になります。

$ echo $VAR_DISP
var_disp_test
$ echo $VAR_MASK
[MASKED]
$ echo $VAR_MASK_HIDDEN
[MASKED]

マスクされていますね。

ファイル

タイプがファイルの場合、ちょっと特殊な動作になります。

script:
  - echo $FILE_DISP
  - echo $FILE_MASK
  - echo $FILE_MASK_HIDDEN
  - ls -la /builds/root/$CI_PROJECT_TITLE.tmp

先ほどのようにechoで出力すると、ファイルのパスが出力されます。

$ echo $FILE_DISP
/builds/root/gitlab-ci-test.tmp/FILE_DISP
$ echo $FILE_MASK
/builds/root/gitlab-ci-test.tmp/FILE_MASK
$ echo $FILE_MASK_HIDDEN
/builds/root/gitlab-ci-test.tmp/FILE_MASK_HIDDEN
$ ls -la /builds/root/$CI_PROJECT_TITLE.tmp
total 20
drwxrwxrwx 1 root root  168 Feb 20 12:41 .
drwxrwxrwx 1 root root   64 Feb 15 04:24 ..
-rw-rw-rw- 1 root root 5528 Feb 20 12:41 CI_SERVER_TLS_CA_FILE
-rw-rw-rw- 1 root root   14 Feb 20 12:41 FILE_DISP
-rw-rw-rw- 1 root root   14 Feb 20 12:41 FILE_MASK
-rw-rw-rw- 1 root root   16 Feb 20 12:41 FILE_MASK_HIDDEN
drwxrwxrwx 1 root root   12 Feb 20 12:41 git-template
-rw-rw-rw- 1 root root    0 Feb 20 12:41 gitlab_runner_env

パスとしては、「/builds/root/[プロジェクト名].tmp/」配下にファイルが配置され、このファイルの中に設定された値が設定されています。

つまり…

script:
  - cat $FILE_DISP
  - cat $FILE_MASK
  - cat $FILE_MASK_HIDDEN

catで出力してあげれば、設定された値が確認できます。

$ cat $FILE_DISP
file_disp_test$ cat $FILE_MASK
[MASKED]$ cat $FILE_MASK_HIDDEN
[MASKED]

※値に改行を入れていないので、値の後ろにコマンドが続いちゃってますが…

こちらもちゃんとマスクされていますね。

変数とは異なりファイルパスが渡されるので、ファイルパスをそのまま渡すものであればそのまま渡せます。

script:
  - mkdir ./test
  - cp $FILE_MASK ./test/file.txt
  - ls -la ./test
  - cat ./test/file.txt
$ mkdir ./test
$ cp $FILE_MASK ./test/file.txt
$ ls -la ./test
total 4
drwxr-xr-x 1 root root 16 Feb 20 12:41 .
drwxrwxrwx 1 root root 44 Feb 20 12:41 ..
-rw-r--r-- 1 root root 14 Feb 20 12:41 file.txt
$ cat ./test/file.txt
[MASKED]

どういう仕組みかはわかりませんが、コピーのような別ファイルにしても出力するとマスクされますね。
※シンプルに同じ文字列が出力されようとしたら、マスクされるのでしょうか…

また、ファイルを先ほどの変数のように使用したければ、ファイルの中身を出力してあげれば使えます。

script:
  - cat $FILE_DISP | xargs -i echo "ファイルの中身は{}です"
  - echo "ファイルの中身は`cat $FILE_DISP`です"
$ cat $FILE_DISP | xargs -i echo "ファイルの中身は{}です"
ファイルの中身はfile_disp_testです
$ echo "ファイルの中身は`cat $FILE_DISP`です"
ファイルの中身はfile_disp_testです

yaml

最後にyaml全貌をのせておきます。

image: ruby

stages:
  - test

variables_sample:
  stage: test
  script:
    # 定義済み変数
    - echo $CI_COMMIT_BRANCH
    # 変数
    - echo $VAR_DISP
    - echo $VAR_MASK
    - echo $VAR_MASK_HIDDEN
    # ファイル
    - echo $FILE_DISP
    - echo $FILE_MASK
    - echo $FILE_MASK_HIDDEN
    - ls -la /builds/root/$CI_PROJECT_TITLE.tmp
    # ファイルの中身
    - cat $FILE_DISP
    - cat $FILE_MASK
    - cat $FILE_MASK_HIDDEN
    # ファイルパス
    - mkdir ./test
    - cp $FILE_MASK ./test/file.txt
    - ls -la ./test
    - cat ./test/file.txt
    # ファイル出力
    - cat $FILE_DISP | xargs -i echo "ファイルの中身は{}です"
    - echo "ファイルの中身は`cat $FILE_DISP`です"
Running with gitlab-runner 17.8.3 (690ce25c)
  on docker-runner t1_S5S4ik, system ID: r_9ntxuFB257bV
Preparing the "docker" executor
Using Docker executor with image ruby ...
Pulling docker image ruby ...
Using docker image sha256:e58f1a5dfa9de2dd6662f6d77f273d40de157faf6845ae26a37200e53e0d3d9a for ruby with digest ruby@sha256:8f6ea87b2c88607fa33c431da37127ca5c8cb065e4e0a0edd5e59808a12da4c8 ...
Preparing environment
Running on runner-t1s5s4ik-project-6-concurrent-0 via 498eb2969af1...
Getting source from Git repository
Fetching changes with git depth set to 20...
Reinitialized existing Git repository in /builds/root/gitlab-ci-test/.git/
Checking out 815c000e as detached HEAD (ref is main)...
Skipping Git submodules setup
Executing "step_script" stage of the job script
Using docker image sha256:e58f1a5dfa9de2dd6662f6d77f273d40de157faf6845ae26a37200e53e0d3d9a for ruby with digest ruby@sha256:8f6ea87b2c88607fa33c431da37127ca5c8cb065e4e0a0edd5e59808a12da4c8 ...
$ echo $CI_COMMIT_BRANCH
main
$ echo $VAR_DISP
var_disp_test
$ echo $VAR_MASK
[MASKED]
$ echo $VAR_MASK_HIDDEN
[MASKED]
$ echo $FILE_DISP
/builds/root/gitlab-ci-test.tmp/FILE_DISP
$ echo $FILE_MASK
/builds/root/gitlab-ci-test.tmp/FILE_MASK
$ echo $FILE_MASK_HIDDEN
/builds/root/gitlab-ci-test.tmp/FILE_MASK_HIDDEN
$ ls -la /builds/root/$CI_PROJECT_TITLE.tmp
total 20
drwxrwxrwx 1 root root  168 Feb 20 12:41 .
drwxrwxrwx 1 root root   64 Feb 15 04:24 ..
-rw-rw-rw- 1 root root 5528 Feb 20 12:41 CI_SERVER_TLS_CA_FILE
-rw-rw-rw- 1 root root   14 Feb 20 12:41 FILE_DISP
-rw-rw-rw- 1 root root   14 Feb 20 12:41 FILE_MASK
-rw-rw-rw- 1 root root   16 Feb 20 12:41 FILE_MASK_HIDDEN
drwxrwxrwx 1 root root   12 Feb 20 12:41 git-template
-rw-rw-rw- 1 root root    0 Feb 20 12:41 gitlab_runner_env
$ cat $FILE_DISP
file_disp_test$ cat $FILE_MASK
[MASKED]$ cat $FILE_MASK_HIDDEN
[MASKED]$ mkdir ./test
$ cp $FILE_MASK ./test/file.txt
$ ls -la ./test
total 4
drwxr-xr-x 1 root root 16 Feb 20 12:41 .
drwxrwxrwx 1 root root 44 Feb 20 12:41 ..
-rw-r--r-- 1 root root 14 Feb 20 12:41 file.txt
$ cat ./test/file.txt
[MASKED]$ cat $FILE_DISP | xargs -i echo "ファイルの中身は{}です"
ファイルの中身はfile_disp_testです
$ echo "ファイルの中身は`cat $FILE_DISP`です"
ファイルの中身はfile_disp_testです
$ rm -rf ./test
Cleaning up project directory and file based variables
Job succeeded

まとめ

GitLabのCIにおける変数の選択肢が多くて、よくわからなかったのでまとめてみました。

使いこなせると便利に使えますね。

以上、ここまで見ていただきありがとうございます。

皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。

コメント

この記事のコメントはありません。