GitLab CICD に興味があって色々な検証作業を行っていたところ、ジョブで作成したファイルが消えてしまうことがあったので、忘れないようにメモしておこうと思います。
検証環境
UbuntuサーバにGitLab
とGitLab-Runner
をインストールしました。
Executor: shell
の「プロジェクトランナー」を1つ登録して検証を行いました。
各種バージョンは次の通りです。
- Ubuntu 22.04.5 LTS
- GitLab v17.8.6-ee
- GitLab-Runner 17.8.0
.gitlab-ci.yml
.gitlab-ci.yml
の中身は次の通りです。
build ジョブでhoge.txt
ファイルを作成できるのか? test ジョブでhoge.txt
を読み込めるのか?の検証となります。
予想される挙動
gitlab-runner のワーキングディレクトリは/home/gitlab-runner
を設定しているため、/home/gitlab-runner/
配下にhoge.txt
が作成され、test ジョブでhoge.txt
を読み込める、という挙動を予想しました。
stages:
- build
- test
build-job:
stage: build
script:
- echo "hoge" > hoge.txt
- sleep 30 # hoge.txtが作成されたことを確認するためにスリープする
test-job:
stage: test
script:
- HOGE_VARIABLE=$(cat hoge.txt)
- echo $HOGE_VARIABLE
パイプラインを動かす
パイプラインを動かしてみると、次のような結果となりました。
test ジョブが失敗したようです。
build ジョブ
hoge.txt
は想定とは違い$CI_PROJECT_DIR
配下に作成されました。
具体的には/home/gitlab-runner/builds/t3_C2xT9/0/user1/project2
配下となります。
$CI_PROJECT_DIR
は"定義済みのCI/CD変数"であり、公式ドキュメントによると「リポジトリのクローン先のフルパスと、ジョブの実行元」を表しているようです。
・定義済みCI/CD変数
https://docs.gitlab.com/ci/variables/predefined_variables/
上記のスクリーンショットを見ても、確かに、$CI_PROJECT_DIR
ディレクトリ配下に、リポジトリに登録しているファイル一式がクローン(コピー)されていることが分かります。
test ジョブ
エラーになった test ジョブの実行ログを確認します。
ジョブが失敗(エラー)した理由は、ログの15行目にある通り「hoge.txt No such file or directory」となります。
build ジョブにてhoge.txt
が作成されたことを確認済みですが、これはいったいどういう事でしょうか。
ログを上に見ていくと、11行目に思いっきり「Removing hoge.txt」のメッセージが表示されています。
さらに、ログの9行目を見ると、既存の$CI_PROJECT_DIR
配下を再初期化したようなメッセージが表示されています。
test ジョブ開始により$CI_PROJECT_DIR
配下が再初期化された結果、リポジトリに登録していない(Git管理していない)hoge.txt
は消えたのだと思われます。
そのため、$(cat hoge.txt)
の箇所でエラーが出てしまったようです。
ファイルが消えないようにするには?
「$CI_PROJECT_DIR
配下にhoge.txt
を作成しない」という方法があるかと思います。
例えば、/home/gitlab-runner/
配下にhoge.txt
を作成すると、test ジョブでもhoge.txt
の読み込みができます。
この方法だと、パイプラインが完了した後でもhoge.txt
が残り続けるため、hoge.txt
がパイプライン実行中にだけ"一時的に使用したい"テンポラリファイルなのであれば、パイプライン完了後に削除するような仕組みを実装した方が良いかも知れません。
※後始末用ジョブを設けてそこで削除する、など。
実用性がある検証かどうかはアレですが、ジョブでファイルを作成する際は「どこに作成するか?」を気を付けたいと思います。
まだ検証を始めたばかりで、公式ドキュメントを読み込めば他にも方法が見つかりそうですが、そこはこれからやってみようと思います。