Laravel+Docker Compose项目GitLab CI/CD配置及分支触发问题咨询
问题解决与配置优化方案
一、核心问题修复:阻止非main分支代码流入生产服务器
你遇到的非main分支代码流入生产服务器的根源是所有分支的流水线都在生产服务器的Runner上执行,Runner会自动拉取对应分支代码到本地工作目录。结合你的需求,给出两种解决方案:
方案1:拆分Runner(推荐)
给测试和部署阶段分配不同的Runner,彻底隔离测试与生产环境:
- 在开发机器/非生产服务器上部署一个新的GitLab Runner,给它添加标签
test-runner - 给生产服务器上的Runner添加标签
deploy-runner - 修改
gitlab-ci.yml,指定各阶段的Runner标签:
stages: - build - test - deploy_production cache: paths: - vendor/ build_composer: stage: build script: - composer install -n artifacts: paths: - ./vendor tags: - test-runner rules: - if: $CI_COMMIT_BRANCH != "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" pest_test: stage: test script: - ./vendor/bin/pest tags: - test-runner larastan_test: stage: test script: - ./vendor/bin/phpstan analyse --memory-limit=2G --no-progress tags: - test-runner deploy_production: stage: deploy_production script: - docker compose up -d # 注意:原命令多打了一个e,需修正为compose tags: - deploy-runner rules: - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" when: on_success
方案2:不新增Runner,限制非main分支流水线的执行范围
如果暂时无法新增Runner,可通过规则限制非main分支的流水线仅执行测试,同时在测试阶段结束后清理工作目录(可靠性略低):
stages: - build - test - deploy_production cache: paths: - vendor/ build_composer: stage: build script: - composer install -n artifacts: paths: - ./vendor rules: - if: $CI_COMMIT_BRANCH != "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" pest_test: stage: test script: - ./vendor/bin/pest - rm -rf ./* # 测试完成后清理当前分支代码 rules: - if: $CI_COMMIT_BRANCH != "main" larastan_test: stage: test script: - ./vendor/bin/phpstan analyse --memory-limit=2G --no-progress rules: - if: $CI_COMMIT_BRANCH != "main" deploy_production: stage: deploy_production script: - docker compose up -d rules: - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" when: on_success
二、满足流水线需求的关键配置调整
- 非main分支仅运行测试:通过
rules限制测试阶段仅在非main分支执行,同时让build_composer在所有需要测试/部署的分支执行(确保测试依赖正常) - main分支仅通过合并请求部署:将部署阶段的规则从
$CI_COMMIT_BRANCH == "main"改为$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main",这样只有合并请求到main时才会触发部署,直接提交到main的操作不会触发部署
三、关于你的其他疑问
1. 是否需要新增Runner?
推荐新增测试专用Runner,这是隔离测试与生产环境最稳妥的方式,既避免非生产代码接触生产服务器,也能避免测试过程占用生产服务器资源。
2. 每次提交都执行测试是否有必要?
非常有必要。小团队更需要尽早发现代码问题:
- 每次提交后跑测试,能快速定位问题出在当前提交的代码中,修复成本远低于合并到main后再排查
- 避免将有问题的代码合并到main分支,减少生产环境出问题的风险
- 作为团队协作的基础保障,确保每个人的代码都符合质量标准
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

