python脚本内部发生故障时,管道不会失败

时间:2019-06-03 14:28:37

标签: python ios continuous-integration gitlab

所以-我正在编写一个脚本,用于根据项目中的更改运行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

此问题是,即使此脚本内发生故障,即使将set -o pipefail设置为脚本前的AND且位于do()方法中也不会失败。在下面的图片中可见。

有什么想法为什么会这样?

enter image description here

1 个答案:

答案 0 :(得分:0)

好吧,我发现的唯一可行的解​​决方案是将带有命令的字符串发送回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"