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

如何让GitLab CI不同Runner的任务独立运行并解决部署阶段Pending问题

问题解答

1. 解决Deploy阶段pending问题

按以下优先级排查:

  • 先点击pending状态的Deploy任务进入详情页,查看Gitlab给出的具体pending原因提示,优先按照提示处理:
    • 如果提示「无可用匹配runner」:
      • 确认对应标签的runner处于在线运行状态,且已绑定到当前项目(如果是项目专属runner)/拥有当前项目的运行权限(如果是组共享runner)
      • 确认runner配置的执行器符合作业要求:如果作业需要执行docker命令,runner需为docker执行器,或shell执行器所在服务器已安装docker并配置了gitlab-runner用户的docker权限
      • 检查runner并发配置:打开runner服务器上的/etc/gitlab-runner/config.toml文件,确认全局concurrent参数和对应runner的limit参数没有设置过小,导致作业排队
    • 如果提示「等待前序阶段完成」:
      • 你当前配置中test阶段的两个任务均设置了when: manual为手动触发,若未手动触发对应环境的test任务,整个test阶段未完成,后续所有阶段的任务都会默认阻塞

2. 实现不同标签对应任务流独立运行

Gitlab CI默认按阶段全局串行执行,同一个阶段的所有任务全部执行完成才会进入下一个阶段,要实现staging和production两条任务流完全独立,只需给每个任务添加needs关键字,明确指定仅依赖同环境的前置任务即可,不需要等待同阶段其他环境的任务执行完成。
修改后的核心配置示例:

stages:
  - test
  - build
  - deploy

cache:
  untracked: true
  key:
    files:
      - yarn.lock
  paths:
    - node_modules/
    - .yarn

dashboard:test:staging:
  stage: test
  tags:
    - dashboard_staging
  when: manual
  before_script:
    - echo "do sth"
  only:
    - staging
  except:
    changes:
      - 'docker/**/*'
      - '*.md'
  script:
    - echo "do sth"

dashboard:test:production:
  stage: test
  tags:
    - dashboard_production
  when: manual
  before_script:
    - echo "do sth"
  only:
    - staging
  except:
    changes:
      - 'docker/**/*'
      - '*.md'
  script:
    - echo "do sth"

dashboard:build:staging:
  stage: build
  tags:
    - dashboard_staging
  only:
    - staging
  # 仅依赖同环境的test任务,不需要等production的test完成
  needs:
    - job: dashboard:test:staging
      optional: true # 如果test任务不需要执行也能跑build,可添加这个参数
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY  
  script:
    - echo "do sth"

dashboard:build:production:
  stage: build
  tags:
    - dashboard_production
  only:
    - staging
  needs:
    - job: dashboard:test:production
      optional: true
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY  
  script:
    - echo "do sth"


dashboard:deploy:staging:
  stage: deploy
  tags:
    - dashboard_staging
  except:
    changes:
      - 'docker/**/*'
      - '*.md'
  only:
    - staging
  # 仅依赖同环境的build任务,不需要等production的build完成
  needs:
    - dashboard:build:staging
  before_script:
    - echo "do sth"
  script:
    - echo "do sth"


dashboard:deploy:production:
  stage: deploy
  tags:
    - dashboard_production
  except:
    changes:
      - 'docker/**/*'
      - '*.md'
  only:
    - staging
  needs:
    - dashboard:build:production
  before_script:
    - echo "do sth"
  script:
    - echo "do sth"

如果需要更高程度的隔离,也可以使用Gitlab CI的父子流水线特性,为每个环境单独定义独立的子流水线配置,两条流水线的运行状态完全互不影响。


内容的提问来源于stack exchange,提问作者Mostafa Ghadimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:36:01