Jenkinsfile から bash の機能を使う

Jenkins の設定ファイル(jenkinsfile)からコマンドを実行してその標準出力を受け取る時、sh() を使うと思います。下記のプラグインで提供されている機能ですね。

Pipeline: Nodes and Processes
Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

これは上記のサイトの説明に「Runs a Bourne shell script」とかいてあるとおり、bash の機能は使えません。たとえば下記のようにプロセス置換を使うとエラーとなります。

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

エラーメッセージは下記のようになるはず。

syntax error near unexpected token `<'

これは下記のように /bin/sh を bash に向けていてもエラーになりました。


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

困ったなと思って回避方法を調べました。方法は簡単で、エイヤッとシェバンをつければOKです。これで動作しました。

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

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

コメント