Gitlab CI/CD问题:多容器应用仅构建推送变更镜像失败
问题解决:GitLab CI单仓库多容器变更检测触发构建失败
问题根源
你当前的配置中,rules里的changes使用了矩阵变量$SERVICE,但GitLab CI的规则评估是在流水线初始化阶段完成的,这时候parallel:matrix中的变量还未被实例化,./$SERVICE/**/*会被当作字面量路径处理,无法匹配任何实际的服务目录变更,导致任务始终不执行。
解决方案
方案一:为每个服务单独定义Job
直接拆分出对应每个服务的独立Job,明确指定changes的路径:
build_app_image: image: docker:20.10.16 services: - docker:20.10.16-dind variables: DOCKER_TLS_CERTDIR: "/certs" SERVICE: app before_script: - docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS script: - docker build -t $DOCKERHUB_USER/test:$SERVICE-$VERSION ./$SERVICE/ - docker push $DOCKERHUB_USER/test:$SERVICE-$VERSION rules: - if: $CI_COMMIT_BRANCH == "master" changes: - ./app/**/* build_db_image: image: docker:20.10.16 services: - docker:20.10.16-dind variables: DOCKER_TLS_CERTDIR: "/certs" SERVICE: db before_script: - docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS script: - docker build -t $DOCKERHUB_USER/test:$SERVICE-$VERSION ./$SERVICE/ - docker push $DOCKERHUB_USER/test:$SERVICE-$VERSION rules: - if: $CI_COMMIT_BRANCH == "master" changes: - ./db/**/*
方案二:使用模板复用公共配置
如果服务数量较多,用extends提取公共配置,减少重复代码:
# 定义公共模板 .docker_build_template: image: docker:20.10.16 services: - docker:20.10.16-dind variables: DOCKER_TLS_CERTDIR: "/certs" before_script: - docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS script: - docker build -t $DOCKERHUB_USER/test:$SERVICE-$VERSION ./$SERVICE/ - docker push $DOCKERHUB_USER/test:$SERVICE-$VERSION # 应用服务构建Job build_app_image: extends: .docker_build_template variables: SERVICE: app rules: - if: $CI_COMMIT_BRANCH == "master" changes: - ./app/**/* # 数据库服务构建Job build_db_image: extends: .docker_build_template variables: SERVICE: db rules: - if: $CI_COMMIT_BRANCH == "master" changes: - ./db/**/*
验证效果
修改app目录下的任意文件并推送到master分支,build_app_image任务会自动触发;修改db目录下的文件则触发build_db_image任务,未变更的服务不会执行构建,符合你的需求。
内容的提问来源于stack exchange,提问作者gbelo
相关产品推荐
相关产品推荐

