Я выполняю задание Дженкинса с использованием агента 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 и другими контейнерами, чтобы сделать то, что мне нужно, или это будет лучше вылезти из кроличьей норы и начать заново с другого подхода?