Jenkins管道步骤如何从Groovy闭包中获取语句

因此docker管道步骤的工作原理如下

docker.image('maven:3.3.3-jdk-8').inside {
  sh "git clone .."
  sh 'mvn -B clean install'
}

其中每个闭包语句在docker exec包裹的运行容器上执行

我希望使用相同的技术,但是在docker-compose运行的容器上。

我想创建一个步骤(除非那里已经有一个步骤了)。

假设在早期,我有一组使用docker-compose运行的服务。我知道要在其中运行一些詹金斯步骤的容器的容器ID。步骤将如下所示:

withContainer(<id_of_the_container>) {
    sh "date"
    sh "cat mydog"
}

闭包中的每个语句都将在容器上执行,就像我正在有效地执行以下操作一样:

docker exec <id_of_the_container> sh "date"
docker exec <id_of_the_container> sh "cat mydog"

我可以开始定义类似的步骤

def withContainer(containerId,Closure cl) {
   // I know I need to do something like
   // docker exec $containerId ...
}

如何访问闭包中的语句?还是我以错误的方式进行操作?

gangan123321 回答:Jenkins管道步骤如何从Groovy闭包中获取语句

我相信这与您的问题有关:

  

能够从工作流中运行docker-exec等

     

https://issues.jenkins-ci.org/browse/JENKINS-26178

和分辨率:Won't Do

您不能在闭包内部获取命令,但是可以将闭包作为变量传递给某个类。我不能在管道和下面的代码上仅仅为了显示方法而验证

//this funstion just for test purpose in a usual groovyconsole
//def sh(a){println "sh $a"}

class DockerHelper{
    Object delegate
    String containerId

    def withContainer(id,Closure cl){
        this.containerId=id
        this.with(cl)
        return this
    }

    def exec(command){
        delegate.sh(script: "docker exec -it $containerId /bin/bash -c '$command'")
    }
}

new DockerHelper(delegate:this).withContainer('my-running-mvn'){
    exec "date"
    exec "cat mydog"
}
本文链接:https://www.f2er.com/3157890.html

大家都在问