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

GitLab CI/CD三种状态(通过、失败、警告)配置不生效求助

GitLab CI构建任务状态显示异常排查与解决

问题描述

我有一个C#构建应用,运行后返回三种退出码对应状态:

  • 成功:退出码0
  • 失败:退出码-1
  • 警告:退出码137

使用如下GitLab CI YAML配置运行该应用:

Build:
    stage: Build
    <<: 
      - *prefix_build_stage_conf
      - script:
          - {MY_RUN_LINE}
      - allow_failure: 
          exit_codes:
            - 137
      - *post_build_stage_conf   

根据GitLab文档,预期各退出码对应任务标识:

  • 0:成功标识(✓)
  • -1:失败标识(X)
  • 137:警告标识(!)

但实际运行后不符合预期:

  • 退出码0:显示成功标识(正常)
  • 退出码-1:显示失败标识(正常)
  • 退出码137:未显示警告标识,仍标记为失败

问题原因

  1. YAML语法错误:将script、allow_failure等Job核心配置放在了锚点合并(<<:)的数组中,导致GitLab CI无法正确解析这些配置,allow_failure.exit_codes规则未生效。
  2. 负退出码兼容问题:Linux系统中进程退出码范围为0-255,负数值会被自动转换为对应正整数(如-1会转为255),可能导致后续状态判断出现偏差。

解决方案

1. 修正YAML配置结构

将script、allow_failure作为Job的直接属性,锚点合并仅用于复用通用配置:

Build:
  stage: Build
  <<: [*prefix_build_stage_conf, *post_build_stage_conf]
  script:
    - {MY_RUN_LINE}
  allow_failure:
    exit_codes:
      - 137

2. 统一退出码为非负整数

修改C#应用的退出逻辑,将失败状态的退出码从-1改为255(Linux系统中代表通用失败),避免负数值带来的兼容问题:

// 示例:修改退出逻辑
if (构建失败)
{
    Environment.Exit(255); // 替代原有的-1
}
else if (存在警告)
{
    Environment.Exit(137);
}
else
{
    Environment.Exit(0);
}

3. 验证配置

提交修改后的YAML和应用代码,重新触发构建:

  • 退出码0:显示成功标识
  • 退出码255:显示失败标识
  • 退出码137:显示警告标识(!),且流水线不会因该任务失败而终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:06:05