Экранирование параметров с пробелами в команде docker .withRun в декларативном конвейере Jenkins - PullRequest
0 голосов
/ 07 мая 2019

В настоящее время не могу понять, как правильно передать мои параметры из Jenkins в функцию docker .withRun в плагине Jenkins Docker (особенно в декларативных конвейерах), который содержит пробелы.

Пробовал неизвестное количество методов, чтобы заставить это работать и в настоящее время в растерянности. Смотрите код ниже

        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"

                    }
                }
            }
        }

В настоящее время, если я просто использую метод командной оболочки, он работает отлично. Однако, используя метод плагина 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.

Любой совет мог бы помочь, просто пытаясь создавать уведомления, которые получают строки из других конвейеров. Таким образом, я могу отправлять сообщения различным формам общения (в настоящее время работаю на слабину).

РЕДАКТИРОВАТЬ: добавил это в и только что выдал другую ошибку. Я пытаюсь добиться передачи параметров в аргументы, которые будут строками текста (сообщение пользователю о неудачной сборке из другого задания).

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 Ответ

1 голос
/ 07 мая 2019

Скриптам запрещается использовать метод groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.jenkinsci.plugins.docker.workflow.Docker $ Изображение с запуском org.codehaus.groovy.runtime.GStringImpl). Администраторы могут решить утвердить или отклонить эту подпись.

Вы можете просто зайти в панель администрирования Дженкинса и утвердить эти . enter image description here

EDIT:

Что касается вашей другой проблемы. Правильное использование withRun

node {
    checkout scm

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

Обратите внимание, что withRun arguments - это параметры для контейнера, с которого он должен начинаться, он ожидает выполнения предложения с выражениями. Что для вашего случая будет означать

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"'
            }
        }
    }
}
...