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

标签 docker elasticsearch jenkins

我正在使用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和其他容器进行通信以执行我需要做的事情,还是爬出兔子洞再用另一种方法重新开始更好?

最佳答案

您可以在每个阶段指定其他代理。一种解决方案(或部分解决方案)是在该阶段的步骤之前声明代理主控(“运行验收测试”)

关于docker - Jenkins-从Docker代理与其他Docker容器进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59967083/

相关文章:

具有分层类别、子类别的 Elasticsearch 聚合;限制水平

Elasticsearch:父/子缺失 85% 的索引关系

elasticsearch - 重新使用内置语言过滤器?

python - Jenkins 控制台注销顺序

jenkins - 泽西客户端 : Authentication fails at redirect by Jenkins

php - NGINX无法访问应用程序文件时的NGINX配置,以及php-fpm和docker

docker - 使用docker保留数据库内的数据

postgresql - 无法远程连接到PostGIS docker

postgresql - Gitlab CI with Docker images - Flask 微服务测试数据库

java - 外部 Maven repo 和 Jenkins