groovy 如何将包含空格的字符串从Jenkinsfile传递到bash?

wswtfjt7  于 9个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(73)

我有一个bash文件,它有多个参数,确切的数量是在运行时确定的。这个文件是由Jenkins中的管道调用的。我在传递参数时遇到了麻烦,仍然可以在bash脚本中使用。这将在后面变得更清楚。
bash脚本看起来像这样:

#!/bin/bash
java myApp.$1.com $2

字符串
相应的(极度简化的)Jenkinsfile如下:

def subdom= 'example'
def opts= ''
opts += '-test ' 
opts += '-comment=\\"' + "test comment" + '\\"'

pipeline {
    agent any 
    options {
        disableConcurrentBuilds()
    }
    environment {
        SUBDOM="${subdom}"
        OPTS= "${opts}"
    }
    stages {
        stage('Run') {
            steps('Prepare') {
                script {
                    sh "bash -x /usr/share/jenkins/ref/runApp.sh $SUBDOM \"$OPTS\""
                }
            }
        }
    }
}


注解中的空格导致错误。我必须找到一种方法通过Jenkins中的shell命令传递opts。
我试过将opts放入一个数组中,看起来似乎可以工作,但在bash脚本中显示为example '[-test,' '-comment="test comment"]'。一般来说,无论我尝试什么,我都会看到这些单引号在bash脚本中弹出,我不知道它们来自哪里,也不知道如何防止它们。查看日志,它们不存在于Jenkins调用中,但是在脚本中突然出现。或者它们在Jenkins调用中,但不在控制台输出中?我记得Jenkins有点奇怪。
尝试在Jenkins中将opts转换为bash数组并没有取得成果,并导致了groovy中大量的语法错误,似乎没有多少转义可以解决。
有没有办法把opts传递到bash脚本中?这真的让我头疼。
编辑:来自评论的建议

#!/bin/bash
subdom=$1
shift
java myApp.$subdom.com $@


又出现了引用。

#!/bin/bash
subdom=$1
shift
java myApp.$subdom.com << EOF
$@
EOF


没有导致任何参数传递到Java应用程序。
在groovy中用"""封装shell调用对神秘的引号没有影响。

mklgxw1f

mklgxw1f1#

摘要

问题不在于jenkins,而是bash如何解释jenkins的参数。
没有简单的方法,但步骤最少的方法可能是用base64编码参数

script {
  sh "bash runApp.sh aaaa "+'"'+params.foo+'"'
}

字符串
那么在你的剧本里

#!/bin/bash

echo "param1: $1"
echo "param2: $2"


第二个参数是
x1c 0d1x的数据
我会告诉你其他的选择。从最简单的到高级的

参数的工作原理

如果你的剧本是

#!/bin/bash

echo "param1: $1"
echo "param2: $2"
echo "all-params: $@"


如果参数中有空格,则应该用双引号将其括起来



您还可以使用**$@**来访问所有参数

Base64

使用base64对变量进行编码

pipeline {
    agent any
    stages {
        stage('write') {
               steps {
                   script {
                       
def script = '''
#!/bin/bash

variable=$(echo "$1" | base64 --decode)
echo "variable inside bash script: $variable"
'''                       
                       
//just to simulate your deploy.sh file
writeFile(file: 'runApp.sh', text: script)
sh "ls -l"
sh "chmod +x runApp.sh"
sh "cat runApp.sh"
                   }
               }
        }
        
        stage('send params') {
               steps {
                 script {
                    println "received parameter: "+params.foo
                    def encoded = sh(script:"echo $foo | base64", returnStdout:true)
                    println "encoded parameter: "+encoded
                    sh "\$(pwd)/runApp.sh $encoded"
                 }
               }
        }        
    }
}


结果



这也可以帮助您处理复杂的参数,如文件或证书或带有特殊字符的字符串

环境变量

bash脚本不应该从参数中获取值,而应该使用环境变量

#!/bin/bash

echo "param1: $VARIABLE_1"
echo "param2: $VARIABLE_2"


然后你的管道应该注入变量:

stage('set variables') {
        steps {
            script {
                env.VARIABLE_1 = "hello"
                env.VARIABLE_2 = "hello world"
                sh '$(pwd)/deploy.sh'
            } 
        }
}

相关问题