circleciのworking_directoryにルートディレクトリを指定したらcheckoutで失敗するようになった
概要
タイトルのとおり、circleciのworking_directoryにルートディレクトリ以下のパスを指定したらcheckoutで失敗するようになった
経緯
自分はもともとはworking_directoryに以下のように設定していた
working_directory: /go/src/github.com/ludwig125/
これで何も問題なく毎日ジョブが起動できていたのだが、2020/8/5のジョブで突然以下のエラーが出て失敗するようになった
mkdir: can't create directory '/go/': Permission denied
調査
circleciのcheckout stepでは以下のようなスクリプトが内部で実行されている
- 仕様は後述の参考のリンクに載っている
自分のジョブのcheckout 実行内容
(略) # use git+ssh instead of https git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true git config --global gc.auto 0 || true if [ -e /go/src/github.com/ludwig125/my-repository/.git ] then cd /go/src/github.com/ludwig125/my-repository git remote set-url origin "$CIRCLE_REPOSITORY_URL" || true else mkdir -p /go/src/github.com/ludwig125/ cd /go/src/github.com/ludwig125/ git clone "$CIRCLE_REPOSITORY_URL" . fi if [ -n "$CIRCLE_TAG" ] then git fetch --force origin "refs/tags/${CIRCLE_TAG}" else git fetch --force origin "master:remotes/origin/master" fi if [ -n "$CIRCLE_TAG" ] then git reset --hard "$CIRCLE_SHA1" git checkout -q "$CIRCLE_TAG" elif [ -n "$CIRCLE_BRANCH" ] then git reset --hard "$CIRCLE_SHA1" git checkout -q -B "$CIRCLE_BRANCH" fi git reset --hard "$CIRCLE_SHA1"
今回ここの「/go/src/github.com/ludwig125/」がcircleciで設定していたworking_directoryだった
my_job: working_directory: /go/src/github.com/ludwig125 # この設定によって、stepsのcheckout時にworking_directory以下にgitのリポジトリがgit cloneされる docker: - image: google/cloud-sdk:alpine steps: - checkout 以下略
circleciのジョブは再実行して失敗した時点でその仮想機にsshして確認できるという素晴らしい機能があるのでそれで再実行してみる
ー> 「Rerun Job with SSH」を押す
sshして仮想機に入って mkdir -p /go/src/github.com/ludwig125/
をしてみるとやっぱり同じエラーが出た
mkdir: can't create directory '/go/': Permission denied
ためしに作るディレクトリをホームディレクトリ以下に変えてみるとこれは成功
mkdir -p ~/go/src/github.com/ludwig125/
参考
https://circleci.com/docs/ja/2.0/configuration-reference/
この例の checkout ステップは、プロジェクトのソース コードをジョブの working_directory にチェックアウトします。
https://circleci.com/docs/ja/2.0/configuration-reference/#jobs
working_directory ステップを実行するディレクトリ。 デフォルトは ~/project となります (この project は特定のプロジェクトの名前ではなく、リテラル文字列)。 ジョブ内で実行するプロセスでは、$CIRCLE_WORKING_DIRECTORY 環境変数を介してこのディレクトリを参照できます。 メモ: YAML 設定ファイルに記述したパスは展開されません。
対応
ということで、やったことは以下だけ
- 修正前
working_directory: /go/src/github.com/ludwig125/
- 修正後
working_directory: ~/go/src/github.com/ludwig125/
これでなんの問題もなくcheckoutができるようになった