GitlabのCIが動かない!
バイト先でdockerを使ってrailsアプリケーションを管理していましたが,
自動テストをするために以下のサイトを参照してGitlab-CIの設定をしました.
https://www.insight-tec.com/tech-blog/20201222_gitlab_runner/
一通りの設定をして動いたので喜んでいたのもつかの間
気が付いたらこんなエラーが発生していた.
Reinitialized existing Git repository in /home/gitlab-runner/builds/*****/0/*****/*****/.git
Checking out 0cff3126 as master...
warning: failed to remove tmp/***: 許可がありません
ざっくりまとめると,
テストをするためにローカルにデプロイしたいから不要なファイルを削除しようとしたら
許可が無くて削除できないよ!
って感じでした.
なぜこのようなことが起きたか
調査の過程などを省いて結論に飛びますが,
docker-composeを動かす上で,コンテナ内で処理をする際にroot権限で処理されるように設定していました.
その結果,dockerコンテナ内で作成されたファイルやフォルダには管理者権限が付与されるようになっていました.
そのため1回目のテストでは問題なく動きますが,2回目以降では1回目でコンテナ内で作成されたファイルが,
権限の問題で操作ができなくなってしまったと考えています.
解決方法
権限の問題なので方法に関してはいくらでもあると思います.
やり方としては、
- CIの最後に特定のファイルを削除する処理を追加
- CIをrootユーザーで実行,または管理者権限のあるユーザーで実行
- テスト毎に権限の書き換えを事項
今回は3つ目の方法を行いました.
具体的な方法としては
gitlab-runnerにCIを登録する際に,--pre-clone-script
を追加する方法です.
sudo gitlab-runner register -n --executor shell --tag-list "blog-sandbox" --url https://gitlab.com/ --registration-token $GITLAB_SPECIFIC_RUNNER_TOKEN --description "shell executor for sandbox" --pre-clone-script "sudo chown -R gitlab-runner:gitlab-runner ."
これによってクローンの前に権限の書き換えを行うようになります.
またこのままだと管理者の書き換えの際にパスワードを求められたりするので,ユーザーの権限を変更します.
以下のコマンドで/etc/sudoers
を開きます.
sudo visudo
そして最後の行に以下の一文を書き加えます.
gitlab-runner ALL=(ALL) NOPASSWD:ALL
これによりgilab-runnerのユーザーがsudoを実行してもパスワードを求められることがなくなり,
CIが動くようになりました.