我有以下.gitlab-ci.yml檔案”:
stages:
- check-code
before_script:
- C:\Users\9279\Documents\WindowsPowerShell\profile.ps1
- conda activate temp
run_tests:
stage: check-code
script:
- pytest test.py
type_checker:
stage: check-code
script:
- (ls -recurse *.py).fullname | foreach-object {echo "`n$_`n";mypy --strict $_}
該check-code階段按預期運行。然而,type_checker即使我當前目錄中的許多 python 腳本實際上未通過型別檢查,該階段仍會通過 GitLab 管道。
我懷疑這可能是因為(ls -recurse *.py).fullname | foreach-object {echo "n$_n";mypy --strict $_}以某種方式回傳零退出代碼。這個對嗎?當代碼輸入不正確時,如何確保我的管道失敗?
謝謝
編輯
我認為退出代碼畢竟可能不為零。我使用以下內容創建了一個臨時腳本并在相同條件下運行它:
(ls -recurse *.py).fullname | foreach-object {echo "`n$_`n";mypy --strict $_}
exit $LASTEXITCODE
當我回應$LASTEXITCODE它時,它包含的值為 1。所以現在我很困惑......
uj5u.com熱心網友回復:
據推測,出現問題是因為 GitLab CI/CD 管道通過PowerShell CLI的-Command( -c) 引數執行您的 PowerShell 代碼(對于 Windows PowerShell,對于 PowerShell (Core) 7 ):powershell.exepwsh
執行的最后一條陳述句決定了 CLI 呼叫的退出代碼。
在您的情況下,這轉化為對
Get-ChildItem和ForEach-Object(%)的呼叫:僅當一個或兩個呼叫作為一個整體被認為遇到錯誤時 - 正如包含在自動$?變數中所反映的那樣$false- 被1報告為退出代碼;否則,它是0。
換句話說:外部程式,如呼叫mypy 內部腳本塊傳遞給ForEach-Object有沒有對整體退出代碼的影響。
要更改它,請跟蹤失敗的外部程式呼叫并使用顯式exit陳述句作為最后一個陳述句(代碼跨多行以提高可讀性 -;只有在重新格式化為單行時才需要):
$overallExitCode = 0;
(ls -recurse *.py).fullname | foreach-object {
echo "`n$_`n"; mypy --strict $_;
if ($LASTEXITCODE -ne 0) { $overallExitCode = $LASTEXITCODE }
};
exit $overallExitCode
如果你只關心第一次失敗:
(ls -recurse *.py).fullname | foreach-object {
echo "`n$_`n"; mypy --strict $_;
if ($LASTEXITCODE -ne 0) { break }
};
exit $LASTEXITCODE
有關 PowerShell 中退出代碼的更多資訊,請參閱此答案。
uj5u.com熱心網友回復:
默認情況下,Powershell 腳本不會因錯誤而停止。要更改此行為,請設定 CI/CD 變數ErrorActionPreference: STOP(對于命令列開關失敗)和/或檢查$LASTEXITCODE,然后檢查throw它是否為非零。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399957.html
上一篇:WriteConsole不適用于PowerShellISE?
下一篇:CSV多重過濾器
