我最近开始为我的代码实现自动测试,我注意到 CI 没有捕获编译器的警告 - 即使有警告,测试也显示为成功。我最初为编译器添加了一个标志,将警告转换为错误 和allow_failure=True,但问题是编译器在第一个警告->错误时停止,并且不会完成整个编译。然后,我使用此处解释的技巧将警告写入文件中,然后测试该文件是否不为零:
- make 2> >(tee make.warnings)
- test ! -s make.warnings
Run Code Online (Sandbox Code Playgroud)
整个编译完成后,如果有警告写入文件,这将给出错误 - 并且使用allow_failure=True,这适用于我没有错误/警告的情况,但也适用于我有警告的情况。但是,如果我有真正的错误,这也会在 CI 中显示为警告,并且不会因为allow_failure=True.
我找不到一种方法来allow_failure=True依赖脚本中运行的内容(无需创建新阶段)或使用某些条件(即文件是否为空)。有没有一种简单的方法可以做到我所缺少的?
我正在尝试调试 CI 管道,并希望创建一个自定义logger阶段来转储有关管道运行环境的大量信息。
我尝试添加这个:
stages:
- logger
logger-commands:
stage: logger
allow_failure: true
script:
- echo 'Examining environment'
- echo PWD=$(pwd) Using image ${CI_JOB_IMAGE}
- git --version
- echo --------------------------------------------------------------------------------
- env
- echo --------------------------------------------------------------------------------
- npm --version
- node --version
- echo java -version
- mvn --version
- kanico --version
- echo --------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
问题是 Java 命令因java未安装而失败。错误说:
/bin/sh: eval: line 217: java: not found
Run Code Online (Sandbox Code Playgroud)
我知道我可以删除该行java -version,但我试图想出一个可以在所有 CI 管道中使用的固定记录器,因此它将包括:Java、Maven、Node、npm、python 以及我的其他任何内容想要包含,但我意识到其中一些命令将失败,因为某些命令未找到。
搜索上述解决方案让我很接近。
allow_failure: …这是我的 yml 文件:
stages:
- testing
- deploy
docker_job:
stage: testing
tags:
- docker
image: atools/chrome-headless:java11-node14-latest
before_script:
- npm ci
- npx playwright install
- npm install allure-commandline --save-dev
script:
- npm run BookingTestDEV --project=BookingTesting
- npx playwright test --project=BookEngineTests
- npm run BookingTestNEO --project=BookingTesting
after_script:
- npx allure generate allure-results --clean
rules:
- when: always
allow_failure: true
artifacts:
when: always
paths:
- ./allure-report
expire_in: 7 day
pages:
stage: deploy
script:
- mkdir public
- mv ./allure-report/* public
artifacts:
paths: …Run Code Online (Sandbox Code Playgroud)