繁体   English   中英

Jenkins - 从 Docker 代理与其他 Docker 容器通信

[英]Jenkins - communicate from Docker agent to other Docker containers

我正在使用 buildkite/puppeteer Docker 代理运行 Jenkins 作业。 据我了解,这将从该图像创建一个容器并在其中运行作业。 该作业从各自的存储库中提取 React 前端和 Express 后端应用程序,安装它们的依赖项,启动它们并运行npm脚本以启动 CodeceptJS / Puppeteer 端到端测试,这些测试位于前端存储库中。

在运行测试之前,我需要用测试数据填充 MongoDB 实例(应删除旧测试数据)并索引 Elasticsearch 实例(应删除旧索引)。 为了在本地执行此操作,我运行了一个 MongoDB 和 Elasticsearch 容器,并且在我通过运行docker命令和curl请求运行测试之前,一个 bash 脚本完成了必要的工作; 但是,我很难理解如何在 Jenkins 中做到这一点。 Jenkins 主机有运行 Mongo 和 Elasticsearch 的 Docker 容器,但是 Jenkins 作业无法与它们通信 - 日志显示找不到 docker 命令,并且向 ES 容器发出 curl 请求失败。 这是我的 Jenkins 管道代码的样子 - 我不得不编辑一些信息:

pipeline {
    agent {
        docker {
            image 'buildkite/puppeteer'
            args '--net=[redacted]_ci --add-host=[redacted]:127.0.0.1'
        }
    }

    environment {
        HOME = "${env.WORKSPACE}"
        MONGO_HOST = "[redacted]_mongo"
        ELASTIC_HOST = "[redacted]_elastic"
        API_ROOT_URL = "http://[redacted]:9001"
    }

    stages {
        stage('Clone repositories') {
            parallel {
                stage('pull from [react repo]') {
                    steps {
                        dir('[react folder]') {
                            git url: '[redacted]', branch: [redacted], credentialsId: 'global_github'
                        }
                    }
                }

                stage('pull from [backend repo]') {
                    steps {
                        dir('[backend folder]') {
                            git url: '[redacted]', branch: [redacted], credentialsId: 'global_github'
                        }
                    }
                }
            }
        }

        stage('Install npm dependencies') {
            parallel {
                stage('npm ci (react app)') {
                    steps {
                        dir('[react folder]') {
                            sh 'npm ci' // clean-install
                            //sh 'npm install'
                        }
                    }
                }

                stage('npm ci (api app)') {
                    steps {
                        dir('[backend folder]') {
                            sh 'npm ci' // clean-install
                        }
                    }
                }
            }
        }

        stage('Start web servers') {
            parallel {
                stage('Start API server') {
                    steps {
                        dir('[backend folder]') {
                            sh 'cp server/config/environment/secrets.ci.js server/config/environment/secrets.js'
                            sh 'echo $PATH'
                            sh 'ls -la /usr/bin'
                            sh 'nohup npm run serve &' // Would run script here also to populate DB and create ES index
                        }
                    }
                }
                stage('Start React server') {
                    steps {
                        dir('[react folder]') {
                            sh 'nohup npm start &'
                        }
                    }
                }
            }
        }

        stage('Wait for servers to be ready') {
            options {
                timeout(time: 5, unit: 'MINUTES')
            }

            parallel {
                stage('Wait for API server') {
                    steps {
                        sh 'while ! curl http://[redacted]:9001; do sleep 1; done'
                    }
                }
                stage('Wait for React server') {
                    steps {
                        sh 'while ! curl http://[redacted]:3000; do sleep 1; done'
                    }
                }
            }
        }

        stage('Run acceptance tests') {
            steps {
                dir('[react folder]') {
                    //sh 'npm run e2e' // Script to run CodeceptJS / Puppeteer tests
                    sh 'docker ps' // Failure - docker command not found
                    sh 'echo skipping tests'
                }
            }
        }
    }
}

是否可以与主机 Docker 和其他容器进行通信以完成我需要做的事情,还是爬出兔子洞并以不同的方法重新开始会更好?

您可以为每个阶段指定不同的代理。 一个解决方案(或其中的一部分)是在阶段的步骤之前声明代理主节点('运行验收测试')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM