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

GitLab CI本地include规则仅生效最后一条问题求助

GitLab CI分支特定include配置失效问题解决思路

我按照GitLab CI文档配置了分支特定的include规则,意图在dev分支加载.gitlab-ci-dev.yml,main分支加载.gitlab-ci-master.yml,配置如下:

include:
    - local: .gitlab-ci-dev.yml
      rules:
          - if: $CI_COMMIT_BRANCH == "dev"
    - local: .gitlab-ci-master.yml
      rules:
          - if: $CI_COMMIT_BRANCH == "main"

但实际执行时,无论当前分支是dev还是main,始终只加载.gitlab-ci-master.yml中的变量。完整CI配置文件如下:

完整配置文件

.gitlab-ci.yml

include:
    - local: .gitlab-ci-dev.yml
      rules:
          - if: $CI_COMMIT_BRANCH == "dev"
    - local: .gitlab-ci-master.yml
      rules:
          - if: $CI_COMMIT_BRANCH == "main"
stages:
    - build
    - tests
    - deploy
before_script:
    - echo $iis_application_path
    - echo $application_pool_name
    - echo $CI_COMMIT_BRANCH
    - echo $CI_COMMIT_BRANCH == "AjmanTaxi"
build:
    stage: build
    script:
        - dotnet restore
        - dotnet build --no-restore
        - dotnet publish .\apicicdtest\apicicdtest.csproj -c Release -o $publish_path
    artifacts:
        paths:
            - $publish_path
        expire_in: '1 hrs'
    tags:
        - windows
    only:
        - branches

deploy:
    stage: deploy
    script:
        - |
            if((Get-WebAppPoolState -Name $application_pool_name).Value -ne 'Stopped'){
                 Write-Output ('Stopping Application Pool: {0}' -f $application_pool_name)
                 Stop-WebAppPool -Name $application_pool_name
                 New-Item -Path $iis_application_path -Name "app_offline.htm" -ItemType "file"
            }

        - Start-Sleep -s 5
        - Copy-Item ($publish_path + "*") -Destination $iis_application_path -recurse
        - |
            if((Get-WebAppPoolState -Name $application_pool_name).Value -ne 'Started'){
                Write-Output ('Starting Application Pool: {0}' -f $application_pool_name)
                if(Test-Path $iis_application_path\app_offline.htm){
                    Remove-Item -Path $iis_application_path\app_offline.htm
                }
                Start-WebAppPool -Name $application_pool_name
            }
    only:
        - branches
    tags:
        - windows
    dependencies:
        - build

.gitlab-ci-dev.yml

variables:
    publish_path: 'bin\Release\net7.0\publish\'
    application_pool_name: 'testcicddev'
    application_name: 'testcicddev'
    iis_application_path: 'E:\temp_files\cicdtestpublishdev'

.gitlab-ci-master.yml

variables:
    publish_path: 'bin\Release\net7.0\publish\'
    application_pool_name: 'testcicdmaster'
    application_name: 'testcicdmaster'
    iis_application_path: 'E:\temp_files\cicdtestpublishmaster'

解决思路

  • 校验分支名称匹配度:查看流水线输出的$CI_COMMIT_BRANCH值,确认是否与规则中的分支名完全一致(注意大小写、拼写,比如是否是Dev而非dev,Main而非main)。从你的before_script输出可以看到有echo $CI_COMMIT_BRANCH == "AjmanTaxi",需确认实际分支名是否为规则中指定的dev或main。
  • 明确规则默认行为:为每个include的rules添加默认不加载的逻辑,避免潜在的规则匹配异常:
    include:
      - local: .gitlab-ci-dev.yml
        rules:
          - if: $CI_COMMIT_BRANCH == "dev"
            when: always
          - when: never
      - local: .gitlab-ci-master.yml
        rules:
          - if: $CI_COMMIT_BRANCH == "main"
            when: always
          - when: never
    
  • 检查变量优先级:确认项目级、群组级或实例级变量中是否存在同名变量,这类变量优先级高于include文件中定义的变量,会覆盖后者。
  • 验证include加载情况:在流水线页面的「CI/CD configuration」选项中,查看实际加载的配置文件列表,确认对应分支的include是否生效,定位是规则未匹配还是变量被覆盖。
  • GitLab版本兼容性:如果使用的GitLab版本较旧,可能存在include规则的bug,建议升级到支持include rules的稳定版本(GitLab 12.0+开始支持该特性,但部分细节在后续版本完善)。

内容的提问来源于stack exchange,提问作者Askarc Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:03:14