複数のシェルコマンドを実行したい場合スクリプトパイプラインパイプラインを実行せずに最初のコマンドに対する応答を返します。私の状況は次のとおりです。 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
使用して出力を解析することであるため、演算子の代わりにパイプを使用する必要があります。grep
awk
&&
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/null
。grep