基本工作示例:
操作工作流程:
name: Manual_Run
on:
workflow_dispatch:
inputs:
mark:
description: 'Which tests are executed'
default: ''
required: false
type: string
workflow_call:
inputs:
env:
description: 'Environment on which the tests are executed'
default: 'Prod'
required: true
type: string
permissions:
id-token: write
contents: read
jobs:
build:
runs-on: ubuntu-latest
env:
INPUT_MARK: ${{ github.event.inputs.mark }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup python 3.10
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: Install python requirements
run: pip install -r requirements.txt
- name: Run Pytest
run: python run_tests.py
run_tests.py 是
import subprocess
if __name__ == "__main__":
cmd = ['pytest', '-m', 'sum']
subprocess.Popen(cmd, text=True, shell=True)
有针对性的测试(存储库中唯一的测试,test_feats.py)
import pytest
@pytest.mark.sum
def test_sum():
assert 1 + 1 == 2
@pytest.mark.minus
def test_minus():
assert 1 - 1 == 0
如果我在 Windows 操作系统上本地运行 run_tests.py,一切都会按预期工作:
collected 2 items / 1 deselected / 1 selected
.
.
.
================= 1 passed, 1 deselected, 2 warnings in 0.15s =================
但是在远程/操作工作流程/ ubuntu 最新操作系统上:
collected 2 items
.
.
.
======================== 2 passed, 2 warnings in 0.03s =========================
如果有人知道为什么会发生这种情况,请帮我一把,我合法地完成了我能找到的所有内容,但没有任何合乎逻辑的理由让它表现得如此
问题与 Windows 和 Posix 上对
subprocess.Popen
参数的不同处理有关(如果您使用 shell=True
)。
来自文档:
在 shell=True 的 POSIX 上,shell 默认为 /bin/sh。如果 args 是字符串,则该字符串指定要通过 shell 执行的命令。这意味着字符串的格式必须与在 shell 提示符下键入时完全相同。例如,这包括引用或反斜杠转义其中包含空格的文件名。如果 args 是一个序列,则第一项指定命令字符串,任何其他项将被视为 shell 本身的附加参数。也就是说,Popen 所做的相当于:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
这意味着您要么不应该使用
shell=False
(这是默认值),或者,如果您出于某种原因需要它,则需要在 Windows 和 Posix 中以不同的方式处理它:
import sys
if __name__ == "__main__":
cmd = ['pytest', '-m', 'sum']
if sys.platform != "win32":
cmd = [" ".join(cmd)]
subprocess.Popen(cmd, text=True, shell=True)