Jenkins - общение от Docker агента с другими Docker контейнерами - PullRequest
1 голос
/ 29 января 2020

Я выполняю задание Дженкинса с использованием агента buildkite / puppeteer Docker. Насколько я понимаю, это создает контейнер из этого изображения и запускает работу внутри него. Задание извлекает веб-интерфейс React и приложение Express из соответствующих репозиториев, устанавливает их зависимости, запускает их и запускает сценарий npm, запускающий сквозные тесты Codecept JS / Puppeteer, которые находятся во внешнем интерфейсе. repo.

Перед запуском тестов мне нужно заполнить экземпляр MongoDB тестовыми данными (старые тестовые данные должны быть удалены) и проиндексировать экземпляр Elasticsearch (старый индекс должен быть удален). Чтобы сделать это локально, у меня запущен контейнер MongoDB и Elasticsearch, и сценарий bash выполняет необходимые операции перед тем, как запустить тесты, выполнив команды docker и curl запросов; Однако мне трудно понять, как я могу сделать это в Дженкинс. На хосте Jenkins есть контейнеры Docker для Mon go и запущен Elasticsearch, но задание Jenkins не может связаться с ними - журналы показывают, что команда docker не найдена, и запросы curl к контейнеру ES не выполняются. Вот как выглядит мой конвейерный код 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 и другими контейнерами, чтобы сделать то, что мне нужно, или это будет лучше вылезти из кроличьей норы и начать заново с другого подхода?

1 Ответ

1 голос
/ 29 января 2020

Вы можете указать другого агента для каждой стадии. Решение (или его часть) состояло бы в том, чтобы объявить мастер агента непосредственно перед этапами этапа («Выполнить приемочные тесты»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...