パイプラインスクリプトのシェルコマンドのgrep

パイプラインスクリプトのシェルコマンドのgrep

複数のシェルコマンドを実行したい場合スクリプトパイプラインパイプラインを実行せずに最初のコマンドに対する応答を返します。私の状況は次のとおりです。 HTMLページから特定のコンテンツを取得したいです。だから私はページをカールしてからgrepを実行し、ついにawkを実行しました。

def checkState(hostUri, check) {
  node('master') {
    def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}'
    println result
}

私のパイプのコンソールリターンだけがgrepとawkを実行せずにカールコマンドを実行するだけです。

Running on Jenkins in /var/lib/jenkins/workspace/Clearcase@8
[Pipeline] {
[Pipeline] sh
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
...
</html>
[Pipeline] }
[Pipeline] // node

スクリプトされたパイプラインに存在しないコマンドを使用するなど、さまざまなアプローチを試しました'''new BuildProcess

答え1

表示されたJenkinsfileでは、変数の割り当てにはシェルステップが含まれています。

def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F \'"\' {\'print $2\'}'

Jenkinsはシェルを呼び出して次のコマンドを渡します。

curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} && grep ${check} && awk -F '"' {'print $2'}

演算子は&&ANDのリストを表します。この場合、curlコマンドが成功するとgrepコマンドが実行され、成功するとawkコマンドが実行されます。これらのコマンドの標準入力/出力/エラーストリームは互いに接続されていません。

ここでの目的は、andステートメントをcurl使用して出力を解析することであるため、演算子の代わりにパイプを使用する必要があります。grepawk&&

def result = sh 'curl -Lsd "login=username&password=password&button=Login" -c cookie ${hostUri} | grep ${check} | awk -F \'"\' {\'print $2\'}'

また、これらのフィールドに特殊文字が表示される場合は、引用符hostUriと変数を考慮してください。check

最後の注意:&コマンドは、filename引数や何らかの入力なしでgrep ${check}技術的に不完全です。awk -F '"' {'print $2'}シェルターミナルでそのまま実行すると停止します。ただし、Jenkinsはビルドプロセスを非対話型で実行するため、標準入力ストリームがゼロ以外のエラーコードのために失敗すると仮定します/dev/nullgrep

関連情報