我正在使用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/