当 python 脚本中发生故障时,管道不会失败

Posted

技术标签:

【中文标题】当 python 脚本中发生故障时,管道不会失败【英文标题】:Pipeline is not failing when fail occurs inside python script 【发布时间】:2019-06-03 14:28:37 【问题描述】:

所以 - 我正在编写一个脚本来根据项目的变化运行 ios 测试(可能对主题并不重要)。

在脚本中,有一个命令将运行测试:

cmd = "xcodebuild -workspace xxx.xcworkspace -scheme xxx -destination 'platform=iOS Simulator,name=0,OS=latest' -configuration Debug -derivedDataPath 1 test-without-building 2 -parallel-testing-enabled NO -enableCodeCoverage YES | xcpretty".format(os.environ['TEST_SIMULATOR_NAME'], os.environ['PWD'], result)

并像这样执行:

do(cmd)

do() 方法定义为 (source):

def do(command):
  return_code = call([ '/bin/bash', '-c', 'set -o pipefail; ' + command ])

Gitlab 作业设置:

manualUiTestsBasedOnChanges:
  stage: uiTests
  only: ...some conditions...
  before_script: 
    - set -o pipefail
  script:
    - ../scripts/ci/run_UI_tests_based_on_changes.py

这样做的问题是,如果在此脚本中发生故障,它不会使作业失败,即使在脚本之前和 do() 方法中设置了set -o pipefail。在下图中可见。

你知道为什么会这样吗?

【问题讨论】:

【参考方案1】:

好的,我发现唯一可行的解​​决方案是将带有命令的字符串发送回 gitlab 的 shell 并在那里执行它。 像这样:

在 Python 中:

cmd = "
xcodebuild 
   -workspace xxx.xcworkspace 
   -scheme xxx 
   -destination 'platform=iOS Simulator,name=0,OS=latest' 
   -configuration Debug 
   -derivedDataPath 1 test-without-building 2 
   -parallel-testing-enabled NO 
   -enableCodeCoverage YES | xcpretty"
.format(os.environ['TEST_SIMULATOR_NAME'], os.environ['PWD'], result)

print(cmd)

YAML:

manualUiTestsBasedOnChanges:
  stage: uiTests
  only: ...some conditions...
  before_script: 
    - set -o pipefail
  script:
    - result=`../scripts/ci/run_UI_tests_based_on_changes.py`
    - eval "$result"

【讨论】:

以上是关于当 python 脚本中发生故障时,管道不会失败的主要内容,如果未能解决你的问题,请参考以下文章

当所有数据节点在hadoop中失败时会发生啥?

通过管道失败将结构写入孩子

pipeline 解析

当 Spark master 失败时会发生啥?

告知左侧故障管道的右侧?

SonarQube 中的质量门故障不会导致 Teamcity 中的构建失败