n.n*_*asa 0 groovy jenkins jenkins-plugins jenkins-pipeline
我试图在 jenkinsfile 中转义 json 字符串,但我在线检查的示例有点复杂。
sshagent(credentials: ['keypair']) {
sh """
ssh ansible@ansible-server \
'
# vars
src_env="${params.source_env}"
dest_env="${params.destination_env}"
src_prefix="${params.source_s3_prefix}"
dest_prefix="${params.destination_s3_prefix}"
region="${region}"
ch="${ch}"
aws_account="${aws_account}"
# Run ECS task
echo "---- Run ECS task ----"
task_id=$(aws ecs run-task \
--cluster cluster-\${ch}-\${dest_env} \
--task-definition \$td_id \
--region \${region} \
--overrides {\\\"containerOverrides\\\": [{\\\"name\\\": \\\"s3-sync\\\", \\\"environment\\\": [{\\\"name\\\": \\\"SRC_ENV\\\", \\\"value\\\": \\\"$${src_env}\\\"}, {\\\"name\\\": \\\"DEST_ENV\\\", \\\"value\\\": \\\"$${dest_env}\\\"}, {\\\"name\\\": \\\"SRC_PREFIX\\\", \\\"value\\\": \\\"$${src_prefix}\\\"}, {\\\"name\\\": \\\"DEST_PREFIX\\\", \\\"value\\\": \\\"$${dest_prefix}\\\"}]}], \\\"taskRoleArn\\\": \\\"arn:aws:iam::$${aws_account}:role/$${ch}-$${dest_env}\\\"} \
--query 'tasks[0].taskArn' \
--output text | cut -d'/' -f 2)
'
"""
}
Run Code Online (Sandbox Code Playgroud)
因此,问题是要转义以下 json 字符串:
--overrides {\\\"containerOverrides\\\": [{\\\"name\\\": \\\"s3-sync\\\", \\\"environment\\\": [{\\\"name\\\": \\\"SRC_ENV\\\", \\\"value\\\": \\\"$${src_env}\\\"}, {\\\"name\\\": \\\"DEST_ENV\\\", \\\"value\\\": \\\"$${dest_env}\\\"}, {\\\"name\\\": \\\"SRC_PREFIX\\\", \\\"value\\\": \\\"$${src_prefix}\\\"}, {\\\"name\\\": \\\"DEST_PREFIX\\\", \\\"value\\\": \\\"$${dest_prefix}\\\"}]}], \\\"taskRoleArn\\\": \\\"arn:aws:iam::$${aws_account}:role/$${ch}-$${dest_env}\\\"} \
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏?我尝试了很多不同的方法,但似乎没有任何效果。
根据Vasiliki Siakka的回答,我事先解析了 json 参数并转义了 json 字符串中的双引号,以避免它们在 ssh 命令中被剥离。因此,对我有用的解决方案如下:
sshagent(credentials: ['keypair']) {
// ch is defined is defined somewhere in the pipeline
// aws_account is also defined somewhere in the pipeline
def overrides = [
containerOverrides: [
[
environment: [
[
name: "SRC_ENV",
value: params.source_env
],
[
name: "DEST_ENV",
value: params.destination_env
],
[
name: "SRC_PREFIX",
value: params.source_s3_prefix
],
[
name: "DEST_PREFIX",
value: params.destination_s3_prefix
]
],
name: "s3-sync"
]
],
taskRoleArn: "arn:aws:iam::${aws_account}:role/${ch}-${params.destination_env}"
]
def parsed_overrides = groovy.json.JsonOutput.toJson(overrides).replace("\"", "\\\"")
sh """
ssh ansible@ansible-server \
'
# Run ECS task
echo "---- Run ECS task ----"
task_id=\$(aws ecs run-task \
--cluster cluster-${ch}-${params.destination_env} \
--task-definition \$td_id \
--region ${region} \
--overrides "${parsed_overrides}" \
--query 'tasks[0].taskArn' \
--output text | cut -d'/' -f 2)
'
"""
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3125 次 |
| 最近记录: |