![](/img/trans.png)
[英]How to fail a gitlab CI pipeline if the python script throws error code 1?
[英]How to use Variables in GitLab CI pipeline without AttributeError?
我正在使用一个变量在我的 .gitlab-ci.yml 中定义 ROOT_DIR
variables:
ROOT_DIR: "/builds/company/projects/projectname/"
在工作中我调用 test.py 函数:
ut-job:
stage: test
script:
- echo "Unit testing ..."
- python3 tests/test_file.py "$ROOT_DIR"
在 test_file.py 我调用命令行 inout 如下:
if __name__ == "__main__":
if sys.platform == "Darwin" or sys.platform == "Windows":
load_dotenv()
ROOT_DIR = os.getenv("ROOT_DIR")
else:
ROOT_DIR=sys.argv[1]
print("PLatform: " + sys.platform)
print("ROOT_DIR: " + ROOT_DIR)
unittest.main()
管道输出中的 printstatement 正确打印了 ROOT_DIR,因此 sys.argv 正确获取了变量。
但是,管道失败了
AttributeError: module '__main__' has no attribute '/builds/company/projects/projectname/'
意思是, test_file.py main 获取变量,但以某种方式尝试将其也用作属性。
有人可以提示我我做错了什么吗?
这里的问题是,当您调用unittest.main
时,它会检查sys.argv
的内容以获取参数,在本例中是测试名称。 它将尝试使用提供的参数通过在当前模块上使用 getattr 来运行测试。 在这种情况下,导致属性错误。
例如,假设您有一个像这样的测试文件 ( t.py
):
import unittest
class Foo(unittest.TestCase):
def test_foo(self):
...
class Bar(unittest.TestCase):
def test_bar(self):
...
unittest.main()
向此文件添加参数时观察不同的结果:
不带参数运行 2 个测试:
$ python3 ./t.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
使用参数Foo
只有一个测试( Foo
)运行:
$ python3 ./t.py Foo
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
如果您提供不存在测试的参数(例如Baz
),您将收到传递参数的属性错误:
$ python3 ./t.py Baz
E
======================================================================
ERROR: Baz (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute 'Baz'
----------------------------------------------------------------------
Ran 1 test in 0.000s
要解决此问题,您可以 (1) 不为脚本传递任何参数或 (2) 在调用unittest.main
之前修改sys.argv
if __name__ == "__main__":
if sys.platform == "Darwin" or sys.platform == "Windows":
load_dotenv()
ROOT_DIR = os.getenv("ROOT_DIR")
else:
ROOT_DIR=sys.argv[1]
sys.argv.pop(1) # remove rootdir from cli arguments
print("PLatform: " + sys.platform)
print("ROOT_DIR: " + ROOT_DIR)
unittest.main()
调用test_file.py
时无需传递参数。 我相信这是导致错误的原因。
ut-job:
stage: test
script:
- echo "Unit testing ..."
- python3 tests/test_file.py
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.