Jenkins管道:我无法从bash脚本中的连接命令添加变量

ulmd4ohb  于 2023-01-08  发布在  Jenkins
关注(0)|答案(1)|浏览(173)

我已经创建了几个在Linux shell中完美工作的bash脚本,但是当我尝试将它们合并到Jenkins管道中时,我得到了多个错误,我附上了我的管道的示例,我只想显示我的变量的值,管道工作正常,除了当我在第5行添加环境时,您可以看到Groovy不像Bash那样解释一些特殊字符。

pipeline {
    agent {
        label params.LABS == "any" ? "" : params.LABS 
    }
    environment{
        PORT_INSTANCE="${docker ps --format 'table {{ .Names }} \{{ .Ports }}' --filter expose=7000-8999/tcp | (read -r; printf "%s\n"; sort -k 3) | grep web | tail -1 | sed 's/.*0.0.0.0.0://g'|sed 's/->.*//g'}"
    }
    stages {
        stage('Setup parameters') {
            steps {
                script { 
                    properties([
                        parameters([
                            choice(
                                choices: ['LAB-2', 'LAB-3'], 
                                name: 'LABS'
                            ),
                            string(
                                defaultValue: 'cliente-1', 
                                name: 'INSTANCE_NAME', 
                                trim: true
                            ),
                            string(
                                defaultValue: '8888', 
                                name: 'PORT_NUMBER', 
                                trim: true
                            ),
                            string(
                                defaultValue: 'lab.domain.com', 
                                name: 'DOMAIN_NAME', 
                                trim: true
                            )
                        ])
                    ])
                }
                sh """
                  echo '${params.INSTANCE_NAME}'
                  echo '${params.PORT_NUMBER}'
                  echo '${params.DOMAIN_NAME}'
                  echo '${PORT_INSTANCE}
                """
            }
        }
    }   
}

我已经在sh部分"""命令"""中尝试了同样的操作,他们抛出了同样的错误。
有没有人能帮我知道如何运行在linux shell(bash)中工作的高级命令,也就是说,有没有办法把脚本从bash迁移到Jenkins?
非常感谢你的帮助,)
我希望能够通过Jenkins中的Pipeline中的bash脚本命令创建变量
端口示例="${docker ps--格式'表格{{.名称}} {{.端口}}'--过滤器暴露= 7000 - 8999/tcp|(读取-r;打印" % s\n";排序-k 3)|grep网页|尾部-1|第一个字符是"s/. * 0.0.0.0.0://g"| sed 's/-〉. *//g '}"

cyej8jka

cyej8jka1#

我相信您不能根据文档在环境步骤中执行bash脚本。
您可以使用sh步骤从bash脚本创建一个变量,并将returnStdout设置为true。声明性管道不允许您将返回值赋给变量,因此您需要在script中调用sh,如下所示:

stage('Calculate port') {
    steps {
        script {
            // When you don't use `def` in front of a variable, you implicitly create a global variable
            // This means that the variable will exist with a value, and can be used in any following line in your scipt 
            PORT_INSTANCE = sh returnStdout: true, script: "docker ps --format 'table {{ .Names }} \{{ .Ports }}' --filter expose=7000-8999/tcp | (read -r; printf \"%s\n\"; sort -k 3) | grep web | tail -1 | sed 's/.*0.0.0.0.0://g'|sed 's/->.*//g'"
            
            // Shell output will contain a new line character at the end, remove it 
            PORT_INSTANCE = PORT_INSTANCE.trim()
        }
    }
}

我会添加一个这样的阶段,作为我的管道中的第一个阶段。
请注意,在测试时,我没有运行与您相同的shell命令,因此我的命令可能存在诸如未转义引号之类的问题。

相关问题