jenkinsfile の sh()は素のshなのでbashizmの機能が使えません。 そこでshではなくbashを使う方法を説明します。


Jenkinsfile の sh()は、サイトの Pipeline: Nodes and Processes - sh: Shell Script の説明にあるとおり「Runs a Bourne shell script」です。つまり bash ではありません。 なので、たとえば下記のようにbashismなプロセス置換機能を使うとエラーとなります。

1
2
String hoge = sh(returnStdout: true,
                 script: "while read v; do echo \$v; done < <(cat fugafile)")

おそらく syntax error near unexpected token '<'のようなエラーメッセージが出力されると思います。 下記のように /bin/shbash に向けていても同じエラーになるようです。

1
2
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4  3月 10 00:31 /bin/sh -> bash

bash を使う方法は簡単で、下記のようにエイヤッとシェバンをつければOKです。これで動作しました。

1
2
String hoge = sh(returnStdout: true,
                 script:"#!/bin/bash \n" + "while read v; do echo \$v; done < <(cat fugafile)")

言われてみればそりゃそうかと思いますが、ちょっとハマったのでメモしておきます。もし参考になれば幸いです。