【问题标题】:How to mark stage as unstable if Powershell condition results into true?如果 Powershell 条件为真,如何将阶段标记为不稳定?
【发布时间】:2021-09-24 11:22:34
【问题描述】:

我有一个 .Net 5 解决方案,并使用代码样式分析构建项目。每个违反规则都会导致警告。但是构建命令以代码 0 退出。

我创建了一个.gitlab-ci.yml 文件,如果出现任何构建警告,该文件应将管道标记为不稳定。

image: mcr.microsoft.com/dotnet/sdk:5.0

stages:
  - build
  - unit-tests

build:
  stage: build
  script:
      - |-
        dotnet build --output build -consoleloggerparameters:"Summary;Verbosity=normal" -m -p:"WarnLevel=5;EnforceCodeStyleInBuild=true" -t:"clean,build" -fl1 "/flp1:warningsonly";

        if ((!$LASTEXITCODE) -and (Get-Content "msbuild1.log"))
        {
          # >>> mark stage as unstable here <<<
        }
  artifacts:
    paths:
      - build

unit-tests:
  stage: unit-tests
  script:
    - dotnet test --no-build --output build
  dependencies:
    - build

舞台本身通过了,但我希望它以不稳定的状态通过(因为警告),不幸的是它是绿色的。

不好的解决方案是为构建命令添加-warnaserror 标志,并为舞台使用allow_failure: true。这会将阶段设置为不稳定状态,但由于缺少构建,下一阶段将失败。

那么检查构建命令是否以警告结束以将阶段标记为不稳定的正确方法是什么?

【问题讨论】:

    标签: c# .net powershell continuous-integration gitlab-ci


    【解决方案1】:

    我尝试添加一个额外的阶段code-quality,这对我来说非常好

    image: mcr.microsoft.com/dotnet/sdk:5.0
    
    stages:
      - build
      - code-quality
      - unit-tests
    
    build:
      stage: build
      script:
        - dotnet build --output build
      artifacts:
        paths:
          - build
    
    code-quality:
      stage: code-quality
      script:
        - |-
          dotnet tool install -g dotnet-format;
          dotnet format -wsa --check --verbosity diagnostic;
    
          if ($LASTEXITCODE) 
          {
            exit 1;
          }
      allow_failure: true
      dependencies:
        - build
    
    unit-tests:
      stage: unit-tests
      script:
        - dotnet test --no-build --output build
      dependencies:
        - build
    

    我唯一想知道的是为什么我必须检查退出代码。如果 dotnet 格式失败,它会以代码 2 退出。但 Gitlab 似乎只检查退出代码 0 或 1?因为错误代码2导致成功。这就是为什么我必须手动检查它。

    如果有人知道如何改进,请告诉我!

    【讨论】:

    • gitlab powershell 默认似乎不返回任何代码。它要求您在每次运行 cmd 时附加此代码: if(!$?) { Exit $LASTEXITCODE }
    【解决方案2】:

    不太确定这是否是您要查找的内容,但我的理解是您的 unit-tests 取决于前面的 code-qualitybuild 步骤(或两者)? 在这种情况下,您将 unit-tests 步骤修改为:

    unit-tests:
      stage: unit-tests
      script:
        - dotnet test --no-build --output build
      # replace 'dependencies' with 'needs'
      needs:
        - job: build
          artifacts: true
        - job: code-quality
    

    后果将是,如果构建失败,您的管道将失败,如果code-quality 步骤失败,它仍然能够运行unit-tests,除非测试步骤将依赖于代码质量步骤中的工件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2012-07-23
      • 2021-07-09
      • 2013-08-14
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多