私はJenkinsの2つのフリースタイルジョブをGroovyでパイプラインジョブとして動作させるために翻訳作業を行っていますが、Groovyでの経験はほとんどありません。 Groovyの内部で実行する引数を取得する方法を解説します。ここにスクリプトの重要な部分があります。引数を使ってGroovyでシェルスクリプトを実行する方法
stage ('Clean') {
try {
notifyBuild('STARTED')
dir("cloudformation") {
def list = sh(script: "ls -1 *.template", returnStdout: true)
for (i in list) {
sh "aws s3 cp $i s3://URLHERE —expires 1 —cache-control 1"
}
} } catch (e) {
// If there was an exception thrown, the build failed
currentBuild.result = "FAILED"
throw e
} finally {
// Success or failure, always send notifications
notifyBuild(currentBuild.result)
} }
関連ビットはsh "aws s3 cp $i s3://URLHERE —expires 1 —cache-control 1"
です。これを実行しようとすると、次のエラーが返されます。
Googleは、Groovyの内部で引数を持つシェルスクリプトをほとんど作りませんでした。明らかに、それはそれぞれのスペース区切りチャンクをそれ自身のビットとして扱うことを試みています。どのように私はその行動を停止するのですか?
追加する編集: 私は、同じエラーを返すsh "aws s3 cp $i s3://URLHERE '—expires 1' '—cache-control 1'"
を試してみましたが、Unknown options: —expires 1,—cache-control 1
と私は、私は適切に引用して、スペースを含むことができることを得るが、それはまだ根本的な問題を残します。
これを試してみると、勘違いがあります。 "sh 'aws s3 cp $ i s3:// URLHERE" --expires 1 "" --cache-control 1 "''で終了しました(二重ダッシュ修正と同様に、私は現在、 '' cloudform''を実行しています。 + aws s3 cp s3:// URLHERE --expires 1 --cache-control 1 不明なオプション:--cache-control 1' 認識されるのは現在のところ期限切れですが、キャッシュ制御はありませんか?他のアイデア? – Alex
はい。オプショングループの前後に二重引用符を使用しないでください。これは、引用符で囲まれた各文字列をシェルの1つの引数のように見せます。また、コマンドライン文字列全体の一重引用符も二重引用符で囲む必要があり、Groovyの変数補間が機能します。オプションの二重ダッシュ付きのオリジナルのコマンドラインは、このトリックを行う必要があります。 – BalRog