如何让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阶段未完成,后续所有阶段的任务都会默认阻塞
- 你当前配置中
- 如果提示「无可用匹配runner」:
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
相关产品推荐
相关产品推荐

