我試圖在我的 Jenkins 管道的 shell 塊中運行以下命令:
jq '.Resources[].TargetService.Properties.TaskDefinition = "'"arn:aws:ecs:us-east-1:${ACCOUNT_NUMBER}:task-definition/${TASK_NAME}:${NEW_REVISION}"'"'
當我直接在 shell 中的 Jenkins 節點上運行此命令時,它運行得非常好。
當我像這樣將它插入管道時:
stage('process json') {
steps {
dir('mydir') {
sh """
NEW_REVISION=\$(cat revision.txt)
jq '.Resources[].TargetService.Properties.TaskDefinition = "'"arn:aws:ecs:us-east-1:\${env.AWS_ACCOUNT_NUMBER}:task-definition/\${env.TASK_NAME}:\${NEW_REVISION}"'"'
"""
}
}
}
我收到一個Bad substitution錯誤,沒有更多資訊。據我所知,我正在正確地轉義變數和參考。如果我洗掉這樣的雙引號,我可以繞過錯誤:
jq '.Resources[].TargetService.Properties.TaskDefinition = "arn:aws:ecs:us-east-1:${ACCOUNT_NUMBER}:task-definition/${TASK_NAME}:${NEW_REVISION}"'
但這最終會從字面上處理變數。
注意:我通過不通過jq --arg并準備在我可以使更簡單的格式正常作業后修改我的命令來意識到安全問題。revision.txt 包含一個數值。變數在env.*前面宣告為管道環境的一部分。
uj5u.com熱心網友回復:
env是一個 Jenkins 物件,你似乎env.*也在轉義變數。如果您已經將這些變數匯出為環境變數,那么您應該可以在 shell 環境中使用它們。因此,只需env從變數中洗掉部分或從這些變數中洗掉轉義字符,然后讓 Jenkins 對它們進行插值。
stage('process json') {
steps {
dir('mydir') {
sh """
NEW_REVISION=\$(cat revision.txt)
jq '.Resources[].TargetService.Properties.TaskDefinition = "'"arn:aws:ecs:us-east-1:\${AWS_ACCOUNT_NUMBER}:task-definition/\${TASK_NAME}:\${NEW_REVISION}"'"'
"""
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/511672.html
標籤:詹金斯詹金斯管道
