簡體   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