【GitLab CI】変数のタイプと可視化について
前置き
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における変数の選択肢が多くて、よくわからなかったのでまとめてみました。
使いこなせると便利に使えますね。
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。