繁体   English   中英

如何在没有 AttributeError 的情况下在 GitLab CI 管道中使用变量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM