所以-我正在编写一个脚本,用于根据项目中的更改运行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()
方法中也不会失败。在下面的图片中可见。
有什么想法为什么会这样?
答案 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"