覚えておいてください: gitlab ci runner & pipefail == 痛い


gitlab-ci.yaml スクリプトで意味をなさない奇妙なエラーはありますか?多分それらはパイプを使用していますか?ガチャ.

Gitlab にはデフォルトでかなりの 'anal' pipefail bash モードが失敗しますが、これは通常 "set -e"を使用しても通常は見られません ...

たとえば、CI 内の特定のファイルを特定のバイトサイズに切り捨て、次のスクリプト パターンを使用したいと考えました.

 - cat /path/to/largefile | head -c 131200 > /path/to/truncfile


興味深いことに、大きなファイルがヘッド カットオフよりも大幅に大きくなると、このコマンドは常に CI スクリプトに失敗していました.

完全なラージファイルが完了する前にダウンストリーム プロセスが終了するため、cat は実際に失敗することが判明しました.

自分で試してみてください:

$ $ dd if=/dev/random of=/tmp/largefile bs=1M count=3
3+0 records in
3+0 records out
3145728 bytes (3,1 MB, 3,0 MiB) copied, 0,0467213 s, 67,3 MB/s

# here how it works nicely, with return code 0
$ cat /tmp/largefile | head 1024 > /tmp/truncfile
$ echo $?
0

# ... now set pipefail mode it fails ...
$ set -o pipefail
$ cat /tmp/largefile | head -c 1024 > /tmp/smallfile
$ echo $?
141