ludwig125のブログ

頑張りすぎずに頑張る父

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して確認できるという素晴らしい機能があるのでそれで再実行してみる

image

ー> 「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ができるようになった