使用Jenkinsfile在{sidecar“模式下运行两个docker容器

时间:2018-08-03 11:21:38

标签: python selenium docker jenkins jenkins-pipeline

我必须在sidecar模式下运行两个docker容器。我花了几天的时间来尝试实现正确的管道,但是现在我感到绝望,因为我的想法都没有真正起作用。

首先,我已阅读此块Running sidecar containers

它在 node {}块内实现该方法。这是我的管道现在的样子:

pipeline {
agent any

options {
    disableConcurrentBuilds()
}

stages {
    stage("Obtain images") {
        steps {
            script {
                    writeFile(file: './ui-tests/env.yaml', text: "environment:\n  # dev or stage\n  type: dev\n  lang: en\n")
                    withDockerRegistry([credentialsId: 'my-hub', url: 'https://myhub.hub']) {
                        def selena = docker.image('myhub.hub/selenium-dev:latest')
                        def uirun = docker.image('myhub.hub/ui-shell-runner:latest')
                        selena.pull()
                        uirun.pull()
                    }

            }
        }
    }

    stage("Run tests") {
       steps {
        node('pyrunner') { 
                docker.image('myhub.hub/selenium-dev').withRun('-e JAVA_OPTS=-Xmx1024m') { test ->
                    docker.image('myhub.hub/selenium-dev').inside("--link ${test.id}:se") {
                        sh 'pwd'
                    }

                    docker.image('myhub.hub/ui-shell-runner:latest').inside("--link ${test.id}:se") {
                            sh 'cd ui-tests ; pwd ; nose2 -v --attribute desktop-site,type=smoke'
                        }
                }
        }
        }
        }
    }
}

这是主意。第一个带有硒myhub.hub / selenium-dev的容器-在后台运行,第二个容器myhub.hub / ui-shell-runner包含 nose2 实用程序,该实用程序利用了第一个。我尝试实现 node ,试图将其完全删除并将代码移至 steps 中,我尝试删除所有内容并通过 sh'docker container run运行容器...'(虽然不好)。我的想法实际上都没有达到我的预期。并且列出的管道因

崩溃
    WorkflowScript: 28: Expected a symbol @ line 28, column 6.
                    docker.image('myhub.hub/selenium-dev').withRun('-e JAVA_OPTS=-Xmx1024m') { test ->

WorkflowScript: 28: Arguments to "error" must be explicitly named. @ line 28, column 6.
                    docker.image('myhub.hub/selenium-dev').withRun('-e JAVA_OPTS=-Xmx1024m') { test ->

我没主意了。我接下来要做什么?

1 个答案:

答案 0 :(得分:1)

这是对我有用的代码。感谢Denis Khokhryakov的帮助和建议!在此示例中,“ se”-是第一个硒容器的dns名称,我们也可以在第二个客户端容器中使用dns名称进行连接。

pipeline {
agent any

options {
    disableConcurrentBuilds()
}

stages {
    stage("Obtain images") {
        steps {
            script {
                writeFile(file: './ui-tests/env.yaml', text: "environment:\n  # dev or stage\n  type: dev\n  lang: en\n")
                withDockerRegistry([credentialsId: 'my-hub', url: 'https://myhub.hub']) {
                    def selena = docker.image('myhub.hub/selenium-dev:latest')
                    def uirun = docker.image('myhub.hub/ui-shell-runner:latest')
                    selena.pull()
                    uirun.pull()
                }
            }
        }
    }

    stage("Run tests") {
        steps {
            script { 
                docker.image('myhub.hub/selenium-dev').withRun('-e JAVA_OPTS=-Xmx1024m') { test ->
                    docker.image('myhub.hub/selenium-dev').inside("--link ${test.id}:se") {
                        sh 'pwd'
                    }

                    docker.image('myhub.hub/ui-shell-runner:latest').inside("--link ${test.id}:se") {
                        sh 'cd ui-tests ; pwd ; nose2 -v --attribute desktop-site,type=smoke'
                    }
                }
            }
        }
    }
}

}