0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitLab CI ジョブでファイルを作成したら消えていた話

Posted at

GitLab CICD に興味があって色々な検証作業を行っていたところ、ジョブで作成したファイルが消えてしまうことがあったので、忘れないようにメモしておこうと思います。

検証環境

UbuntuサーバにGitLabGitLab-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 ジョブ

image.png

hoge.txtは想定とは違い$CI_PROJECT_DIR配下に作成されました。
具体的には/home/gitlab-runner/builds/t3_C2xT9/0/user1/project2配下となります。

image.png

$CI_PROJECT_DIRは"定義済みのCI/CD変数"であり、公式ドキュメントによると「リポジトリのクローン先のフルパスと、ジョブの実行元」を表しているようです。

・定義済みCI/CD変数
https://docs.gitlab.com/ci/variables/predefined_variables/

image.png
image.png

上記のスクリーンショットを見ても、確かに、$CI_PROJECT_DIRディレクトリ配下に、リポジトリに登録しているファイル一式がクローン(コピー)されていることが分かります。

test ジョブ

エラーになった test ジョブの実行ログを確認します。

image.png

ジョブが失敗(エラー)した理由は、ログの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の読み込みができます。

image.png

この方法だと、パイプラインが完了した後でもhoge.txtが残り続けるため、hoge.txtがパイプライン実行中にだけ"一時的に使用したい"テンポラリファイルなのであれば、パイプライン完了後に削除するような仕組みを実装した方が良いかも知れません。
※後始末用ジョブを設けてそこで削除する、など。

実用性がある検証かどうかはアレですが、ジョブでファイルを作成する際は「どこに作成するか?」を気を付けたいと思います。

まだ検証を始めたばかりで、公式ドキュメントを読み込めば他にも方法が見つかりそうですが、そこはこれからやってみようと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?