当前无法理解如何正确地将参数从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"
}
答案 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 those。
编辑:
关于您的其他问题。 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"'
}
}
}
}