web-dev-qa-db-ja.com

どのようにして実行されたShellコマンドの出力をJenkinsfile(groovy)からの変数に取り込むのですか?

私はJenkinsファイル(Groovy)でこのようなものを持っていて、後で情報を使用するために標準出力と終了コードを変数に記録したいと思います。

sh "ls -l"

特にJenkinsfileの中ではどんな種類のグルーヴィーなコードも実行できないようですが、どうすればこれを行うことができますか?

140
sorin

最新バージョンのパイプラインshステップでは、以下のことを行うことができます。

// Git committer email
GIT_COMMIT_EMAIL = sh (
    script: 'git --no-pager show -s --format=\'%ae\'',
    returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"

別の機能はreturnStatusオプションです。

// Test commit message for flags
BUILD_FULL = sh (
    script: "git log -1 --pretty=%B | grep '\\[jenkins-full]'",
    returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"

これらのオプションは this issueに基づいて追加されています。

shコマンドについては、公式の ドキュメント を参照してください。

254
G. Roggemans

簡単な答えはこれです:

sh "ls -l > commandResult"
result = readFile('commandResult').trim()

Sh stepの結果を得ることができるという機能要求があると思いますが、私が知る限り、現在他に選択肢はありません。

編集: JENKINS-26133

EDIT2:どのバージョンなのかよくわからないが、sh/batの手順でstdの出力を返すことができるようになった。

def output = sh returnStdout: true, script: 'ls -l'
38
vehovmar

現在のPipelineバージョンはreturnStdoutreturnStatusをネイティブにサポートしています。これらはsh/batステップから出力またはステータスを取得することを可能にします。

例:

def ret = sh(script: 'uname', returnStdout: true)
println ret

公式の ドキュメント

34
luka5z

これはサンプルケースです。

node('master'){
    stage('stage1'){
    def commit = sh (returnStdout: true, script: '''echo hi
    echo bye | grep -o "e"
    date
    echo lol''').split()


    echo "${commit[-1]} "

    }
}
9
Bibek Mantree

標準出力を取得し、コマンドが成功したかどうかを知りたい場合は、returnStdoutを使用して例外ハンドラでラップしてください。

スクリプトパイプライン

try {
    // Fails with non-zero exit if dir1 does not exist
    def dir1 = sh(script:'ls -la dir1', returnStdout:true).trim()
} catch (Exception ex) {
    println("Unable to read dir1: ${ex}")
}

出力

[Pipeline] sh
[Test-Pipeline] Running Shell script
+ ls -la dir1
ls: cannot access dir1: No such file or directory
[Pipeline] echo
unable to read dir1: hudson.AbortException: script returned exit code 2

残念ながらhudson.AbortExceptionには、その終了ステータスを取得するための便利なメソッドがないため、実際の値が必要な場合はメッセージから解析する必要があります(ugh!)

Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html に反して、ビルドはnotこの例外がキャッチされた場合は失敗しました。notの場合は失敗します。 _キャッチ!

更新:ShellコマンドからのSTDERR出力も必要な場合は、2つの方法が考えられます。

a)STDERRをSTDOUT 2>&1にリダイレクトします。ただし、メイン出力から解析するのはユーザー次第です。ただし、コマンドが失敗した場合は、出力は取得されません。例外ハンドラー内にあるためです。

b)STDERRを一時ファイル(先に準備した名前)2>filenameにリダイレクトします(ただし、その後ファイルをクリーンアップすることを忘れないでください)。メインコードは次のようになります。

def stderrfile = 'stderr.out'
try {
    def dir1 = sh(script:"ls -la dir1 2>${stderrfile}", returnStdout:true).trim()
} catch (Exception ex) {
    def errmsg = readFile(stderrfile)
    println("Unable to read dir1: ${ex} - ${errmsg}")
}

c)反対に、代わりにreturnStatus=trueを設定し、例外ハンドラを省略し、常に出力をファイルにキャプチャします。

def outfile = 'stdout.out'
def status = sh(script:"ls -la dir1 >${outfile} 2>&1", returnStatus:true)
def output = readFile(outfile).trim()
if (status == 0) {
    // output is directory listing from stdout
} else {
    // output is error message from stderr
}

警告:上記のコードはUnix/Linux固有のものです - Windowsでは完全に異なるシェルコマンドが必要です。

6
Ed Randall