You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在声明式Jenkins Pipeline中配置Sidecar MySQL用于PHP测试?

当然可以在Jenkins声明式流水线里用Sidecar模式运行MySQL,而且这是现在推荐的方式之一——只要你的Jenkins版本足够新(一般2.263.x及以上的版本对多容器agent支持比较完善)。下面我给你详细讲两种方案:一种是原生声明式语法的Sidecar实现,另一种是如果原生方案受限的替代方法。

方案一:用Jenkins声明式原生的Sidecar容器支持

Jenkins声明式流水线的docker agent支持通过additionalContainers块定义Sidecar容器,这样你的PHP构建容器和MySQL容器会共享同一个Docker网络,直接通过容器名就能互相访问。

下面是完整的流水线示例:

pipeline {
    agent {
        docker {
            // 你的自定义PHP构建镜像
            image 'your-custom-php-image:latest'
            args '-v $WORKSPACE:/app'
            // 定义MySQL Sidecar容器
            additionalContainers {
                container {
                    name 'mysql-sidecar'
                    image 'mysql:8.0' // 可以换成你需要的MySQL版本
                    envVars {
                        env 'MYSQL_ROOT_PASSWORD', 'testpass'
                        env 'MYSQL_DATABASE', 'testdb' // 预先创建测试库
                        env 'MYSQL_USER', 'testuser'
                        env 'MYSQL_PASSWORD', 'testpass'
                    }
                    // 健康检查:确保MySQL完全启动就绪
                    args '--health-cmd="mysqladmin ping -h localhost" --health-interval=5s --health-timeout=2s --health-retries=3'
                }
            }
        }
    }
    stages {
        stage('Wait for MySQL to be ready') {
            steps {
                script {
                    // 轮询等待MySQL可用,避免直接跑命令失败
                    sh 'until mysqladmin ping -h mysql-sidecar -u testuser -ptestpass --silent; do sleep 2; done'
                }
            }
        }
        stage('Run Database Migrations') {
            steps {
                // 替换成你实际的迁移命令,比如Laravel的artisan migrate或者Doctrine的migrations:migrate
                sh 'php artisan migrate --force'
            }
        }
        stage('Execute PHP Tests') {
            steps {
                // 执行你的测试框架命令,比如phpunit
                sh 'phpunit --configuration phpunit.xml'
            }
        }
    }
    post {
        always {
            // Jenkins会自动清理容器,但手动加一层保障也没问题
            sh 'docker stop mysql-sidecar || true'
        }
    }
}

关键细节说明:

  • additionalContainers块会自动把Sidecar容器和主PHP容器加入同一个Docker网络,所以你可以直接用容器名mysql-sidecar作为MySQL的主机名。
  • 健康检查和等待步骤很重要:MySQL启动需要初始化时间,直接执行迁移会因为连接失败报错。
方案二:原生Sidecar不可用时的替代方法

如果你的Jenkins版本比较旧,或者因为权限/配置限制无法使用additionalContainers,可以试试下面两种方法:

方法1:用Docker Compose管理测试环境

在项目根目录创建一个专门用于测试的docker-compose.test.yml,把PHP和MySQL服务定义在一起,然后在流水线里启动、执行命令、清理。

docker-compose.test.yml示例:

version: '3.8'
services:
  php-test:
    image: your-custom-php-image:latest
    volumes:
      - .:/app
    depends_on:
      mysql-test:
        condition: service_healthy # 等待MySQL健康检查通过
    command: tail -f /dev/null # 保持容器运行,方便后续exec执行命令

  mysql-test:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: testpass
      MYSQL_DATABASE: testdb
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpass
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 2s
      retries: 3

流水线示例:

pipeline {
    agent any // 确保Jenkins节点安装了Docker和Docker Compose
    stages {
        stage('Start Test Services') {
            steps {
                sh 'docker-compose -f docker-compose.test.yml up -d'
            }
        }
        stage('Run Migrations') {
            steps {
                sh 'docker-compose -f docker-compose.test.yml exec php-test php artisan migrate --force'
            }
        }
        stage('Run Tests') {
            steps {
                sh 'docker-compose -f docker-compose.test.yml exec php-test phpunit --configuration phpunit.xml'
            }
        }
    }
    post {
        always {
            // 清理容器和数据卷,避免残留
            sh 'docker-compose -f docker-compose.test.yml down -v'
        }
    }
}

方法2:手动管理Docker容器和网络

如果你不想用Docker Compose,也可以手动创建Docker网络、启动MySQL容器,让PHP容器加入同一个网络来访问。

流水线示例:

pipeline {
    agent {
        docker {
            image 'your-custom-php-image:latest'
            args '-v $WORKSPACE:/app --network=php-test-network'
        }
    }
    stages {
        stage('Create Docker Network') {
            steps {
                // 创建专用网络,避免和其他容器冲突
                sh 'docker network create php-test-network || true'
            }
        }
        stage('Start MySQL Container') {
            steps {
                sh 'docker run -d --name mysql-test --network=php-test-network \
                    -e MYSQL_ROOT_PASSWORD=testpass \
                    -e MYSQL_DATABASE=testdb \
                    -e MYSQL_USER=testuser \
                    -e MYSQL_PASSWORD=testpass \
                    --health-cmd="mysqladmin ping -h localhost" \
                    --health-interval=5s --health-timeout=2s --health-retries=3 \
                    mysql:8.0'
            }
        }
        stage('Wait for MySQL') {
            steps {
                sh 'until mysqladmin ping -h mysql-test -u testuser -ptestpass --silent; do sleep 2; done'
            }
        }
        stage('Migrations & Tests') {
            steps {
                sh 'php artisan migrate --force && phpunit --configuration phpunit.xml'
            }
        }
    }
    post {
        always {
            // 清理容器和网络
            sh 'docker stop mysql-test || true'
            sh 'docker rm mysql-test || true'
            sh 'docker network rm php-test-network || true'
        }
    }
}

总结

优先推荐用方案一的原生Sidecar支持,最符合声明式流水线的设计理念;如果受限,Docker Compose的方式更易维护,手动管理则更灵活。

内容的提问来源于stack exchange,提问作者Happy Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:02:22