在Jenkins声明性管道中的docker .withRun命令中使用空格转义参数

时间:2019-05-07 12:43:47

标签: jenkins groovy jenkins-pipeline

当前无法理解如何正确地将参数从Jenkins传递到包含空格的Jenkins Docker插件(特别是声明性管道)中的docker .withRun函数。

尝试了未知数量的方法来使该方法正常工作,但目前不知所措。参见下面的代码

        stage('Send Notifications')
        {
            steps
            {
            // Send a notification based on the parameters passed
                script
                {
                    docker.withRegistry(registry, registryCredentials)
                    {
                        // echo "${TITLE}"
                        docker.image("notifications:latest").withRun("--rm -e TITLE=\"${TITLE}\" -e MESSAGE=\"${MESSAGE}\" -e MESSAGE_FORMAT=\"${MESSAGE_TYPE}\" -e EMAIL=\"${EMAILS}\" --name notifications notifications")
                        // sh "docker run --rm -e TITLE=\"${TITLE}\" -e MESSAGE=\"${MESSAGE}\" -e MESSAGE_FORMAT=\"${MESSAGE_TYPE}\" -e EMAIL=\"${EMAILS}\" --name notifications notifications"

                    }
                }
            }
        }

当前,如果我仅使用shell命令方法,它会完美运行。但是,使用Docker插件方法我无法使其正常工作。

Login Succeeded
[Pipeline] {
Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.jenkinsci.plugins.docker.workflow.Docker$Image withRun org.codehaus.groovy.runtime.GStringImpl). Administrators can decide whether to approve or reject this signature.

任何建议都会对您有所帮助,只是尝试创建从其他管道接收字符串的通知。因此,我可以将消息发送到其他形式的通信(当前工作在松弛状态)。

编辑:在此添加了内容,并且刚刚产生了另一个错误。我要实现的目标是将参数传递到args中,这些参数将是文本行(向另一作业的构建失败的用户发送消息)。

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static org.jenkinsci.plugins.docker.workflow.Docker.withRun() is applicable for argument types: (java.lang.String) values
docker.withRegistry(registry, registryCredentials)
                    {
                        def args = "--rm -e TITLE=\"This is a message\" -e MESSAGE=\"a message\" -e MESSAGE_FORMAT=\"s\" -e EMAIL=\"asdf@email.com\" --name notifications notifications"
                        echo args
                        docker.image("notifications:latest").withRun(args)
                        //sh "docker run --rm -e TITLE=\"${TITLE}\" -e MESSAGE=\"${MESSAGE}\" -e MESSAGE_FORMAT=\"${MESSAGE_TYPE}\" -e EMAIL=\"${EMAILS}\" --name notifications notifications"
                    }

1 个答案:

答案 0 :(得分:1)

  

不允许脚本使用groovy.lang.GroovyObject方法   invokeMethod java.lang.String java.lang.Object   (org.jenkinsci.plugins.docker.workflow.Docker $ Image withRun   org.codehaus.groovy.runtime.GStringImpl)。管理员可以决定   是批准还是拒绝此签名。

您可以直接去詹金斯(Jenkins)的administration panel and approve thoseenter image description here

编辑:

关于您的其他问题。 withRun

的正确用法
node {
    checkout scm

    docker.withServer('tcp://swarm.example.com:2376', 'swarm-certs') {
        docker.image('mysql:5').withRun('-p 3306:3306') {
            /* do things */
        }
    }
}

请注意,withRun参数是容器开头的参数,它期望执行带有表达式的子句。对您而言,这意味着什么

docker.image("notifications:latest").withRun() {
    sh "docker run --rm -e TITLE=\"${TITLE}\" -e MESSAGE=\"${MESSAGE}\" -e MESSAGE_FORMAT=\"${MESSAGE_TYPE}\" -e EMAIL=\"${EMAILS}\" --name notifications notifications"
}

或更简单

    docker.image('notifications:latest').inside {
        sh "docker run --rm -e TITLE=\"${TITLE}\" -e MESSAGE=\"${MESSAGE}\" -e MESSAGE_FORMAT=\"${MESSAGE_TYPE}\" -e EMAIL=\"${EMAILS}\" --name notifications notifications"
    }

EDIT2:

要将这些参数仅用作容器参数,请执行以下操作:

docker.image("notifications:latest").withRun("-e TITLE=\"${TITLE}\" -e MESSAGE=\"${MESSAGE}\" -e MESSAGE_FORMAT=\"${MESSAGE_TYPE}\" -e EMAIL=\"${EMAILS}\" --name notifications notifications") {}

EDIT3:

或者,您可以将其作为给定阶段的代理启动

pipeline {
    agent none
    stages {
        agent {
            docker {
                image 'notifications:latest'
                registryUrl 'registry'
                registryCredentialsId 'registryCredentials'
                args "-e TITLE=\"This is a message\" -e MESSAGE=\"a message\" -e MESSAGE_FORMAT=\"s\" -e EMAIL=\"asdf@email.com\" --name notifications notifications"
            }
        }
        stage('Build') {
            steps {
                sh 'echo "I'm in container"'
            }
        }
    }
}