ある日、circle CIのジョブでエラーが出たんですよ。数千のファイルを削除するコミットで走ったジョブでした。
(EDITED)/root.sh: line 2: /usr/bin/dirname: Argument list too long
そりゃあ仕事ですからね、億劫ですがすぐにrerun job with SSH
しましたよ。といっても例の如く10分ぐらい待たされるんですが。で、ログインしてジョブを手動で動かしても同じエラーが出る。スクリプトを見てみましたがなーんの変哲もないスクリプトなんですよ。ただレポジトリのルートディレクトリをとっているだけ。
repository_root() {
local cwd=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)
echo "${cwd}/../../.."
}
このdirname ${BASH_SOURCE[0]}
でArgument list too long
エラーになるらしいんです。そりゃあすぐにecho ${BASH_SOURCE[0]}
してみましたよ。でも(EDITED)/root.sh
と出るだけです。
いやだな、こわいなと思いつつ、仕事ですからね、set -x
いれてどういう引数を受け取っているか見ようとしたんですよ。
自分の目が信じられませんでした。
+++ repository_root
++++ dirname (EDITED)/root.sh
(EDITED)/root.sh: line 5: /usr/bin/dirname: Argument list too long
+++ echo /../../..
しかもそのすぐ上に同じくこの関数を呼び出していたんです。
+++ repository_root
++++ dirname (EDITED)/root.sh
+++ echo (EDITED)/../../..
もう気がおかしくなりそうになりながらroot.shを修正しました。shell parameter expansionすれば流石に大丈夫だろうと思いましてね。
repository_root() {
echo "${BASH_SOURCE[0]%/*}/../../.."
}
もう一度ジョブを走らせるとdirnameの部分はパスしたようです。ほっと一息ついたのも束の間でした。
次の瞬間私の目に飛び込んできたのは
+++ echo
+++ grep git
(EDITED)/git.sh: line 6: /bin/grep: Argument list too long
++ '[' '!' -z '' ']'
++ source ci.sh
+++ ENV1=
++++ echo
++++ grep ci
(EDITED)/ci.sh: line 4: /bin/grep: Argument list too long
+++ '[' '!' -z '' ']'
+++ ENV2=
++++ echo
++++ grep job
(EDITED)/ci.sh: line 8: /bin/grep: Argument list too long
+++ '[' '!' -z '' ']'
+++ '[' '!' -z '' ']'
+++ GIT_USER_NAME=username
+++ GIT_USER_MAIL=mail@addre.ss
+++ git config user.name $GIT_USER_NAME
(EDITED)/ci.sh: line 32: /usr/bin/git: Argument list too long
うわあああああああああ!!!!!
too longなリストはこのコミットで消された数千のファイル達でしょうか。誰か助けてください。そしてビルドを通してく
テープはここで終わっている。
やれやれ。失踪した前任者の行方とビルドが失敗する原因の手がかりはたったこれだけか。
しかししょうがない。これも仕事だからな。俺は早速この問題に取りかかった。
後編に続く