如何在Docker集装箱外执行Jenkins管道阶段的一部分?

laximzn5  于 2023-03-01  发布在  Jenkins
关注(0)|答案(1)|浏览(133)

我们有一个集装箱化的Jenkins管道,对于其中一个阶段(阶段的某个部分),我们希望在集装箱上执行,而另一些阶段则在Jenkins主机(在我们的示例中是Windows)上执行-

pipeline {
    agent {
        docker {
            label "<node-name>"
            image "<docker-image-path>"
        }
    }
    stages {
        stage('Testing') {
            steps {
                script {
                    //This below part will be executed on container
                    println "This below part will be executed on container"
                    sh '''pwd
                        hostname -i     
                    '''

                    // Now want to execute below code on master which is Windows
                    println "Now want to execute below code on master which is Windows"
                    node('master') {
                        bat 'dir'
                    }
                }
            }
        }
    }
}

在容器上执行的部件成功执行,但在Windows Jenkins master上执行的代码失败-

Cannot run program "docker" (in directory "C:\Jenkins\workspace\TestDocker"): CreateProcess error=2, The system cannot find the file specified
    • 编辑**

当我在Windows机器上安装了Docker时,上述错误不会被抛出,而是永远停留在那里。
你能告诉我如何按需在节点或容器上执行代码吗?

enyaitl3

enyaitl31#

我也有同样的问题,也是目前为止我能想出的最好的办法,可以在不同的阶段运行它。我知道这与最初的问题相悖,但可能会帮助一些人。这也使管道变得相当庞大和复杂。

pipeline {
    agent { label 'whatever' }

    stages {
        stage('Something directly on the node') {
            steps {
                sh '''
                    echo "I am running outside docker!"
                '''
            }
         }

        stage('Something in the container') {
            agent {
                docker {
                    image 'mycontainer:1.0.0'
                    reuseNode true
                }
            }
            steps {

                sh '''
                    echo "We are inside a docker container now!"
                '''
            }
         }
    }
}

reuseNode选项很重要(jenkins doc):
当reuseNode设置为true时:不创建新的工作区,当前代理的当前工作区将被挂载到container中,container将在同一节点启动,因此整个数据将同步。
ps:这个管道只有2个阶段,但当然你可以有你需要的那么多,一次又一次地跑进跑出容器。

相关问题