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