jenkins管道sh添加新线

时间:2018-02-05 20:15:39

标签: jenkins groovy sh jenkins-pipeline terraform

我的管道阻止:

 sh "set +e; /terraform/terraform plan -var aws_access_key=${aws_access_key} -
 var aws_secret_key=${aws_secret_key} -var aws_ami=${ami_id} -var 
 aws_instance_type=${instance_type} -var aws_elb_security_group=${elb_sg} -var 
 aws_ec2_security_group=${ec2_sg} -detailed-exitcode; echo \$? > status"
              exitCode = readFile('status').trim()
              echo "Terraform Plan Exit Code: ${exitCode}"

输出:

+ set +e
+ /terraform/terraform plan -var aws_access_key=**** -var aws_secret_key=**** -var aws_ami=ami-xxxxxxx
+ -var aws_instance_type=t2.medium -var aws_elb_security_group=sg-xxxx
/terraform/selectdev/int/mp-frontend@tmp/durable-6c57c14c/script.sh: line 3: -var: command not found
+ -var aws_ec2_security_group=sg-axxx
 /terraform/selectdev/int/mp-frontend@tmp/durable-6c57c14c/script.sh: line 4: -var: command not found
+ -detailed-exitcode
/terraform/selectdev/int/mp-frontend@tmp/durable-6c57c14c/script.sh: line 5: 
 -detailed-exitcode: command not found
+ echo 127

我不确定为什么要在命令中添加新行,如果我单引号如sh'',则变量为空。我做错了什么?

我试着像下面这样做,但它也添加新行

def command = $/....../$
res = sh(returnStdout: true, script: command)

2 个答案:

答案 0 :(得分:3)

首先,仅供参考:single quotes skip variable interpolation in groovy

如果要在字符串中包含多行脚本,则需要在多行变量中转义结束符。

你需要三件事:

  1. Use triple double strings """。这允许你有插值的多行字符串(三个单引号字符串'''让你做同样的事情而不插值)。
  2. 使用\转发结束日期。这允许您插入换行符以格式化长命令。
  3. 用双引号包装变量(在三重双引号内有效,但你也可以转义双引号:\"
  4. 例如如下:(每行一个参数以便于阅读)

    sh("""set +e; /terraform/terraform plan \
    -var aws_access_key="${aws_access_key}" \
    -var aws_secret_key="${aws_secret_key}" \
    -var aws_ami="${ami_id}" \
    -var aws_instance_type="${instance_type}" \
    -var aws_elb_security_group="${elb_sg}" \
    -var aws_ec2_security_group="${ec2_sg}" \
    -detailed-exitcode; echo \$? > status""")
    

答案 1 :(得分:1)

我使用的变量来自其他阶段且有新行..必须使用.trim()