GitHub Actions构建后执行测试与Mypy并关联提交检查问题
问题原因
你当前用workflow_run触发Tests和Mypy工作流的方式,会导致这两个工作流的状态不关联到提交的检查状态中。GitHub只会追踪直接由提交触发的工作流状态,异步触发的workflow_run工作流不属于这个范围,所以即便它们失败,提交检查仍会显示通过。
解决方案
有两种可行的调整方式,都能让Tests和Mypy的失败状态同步到提交检查中:
方式一:合并为单个CI工作流
将Build、Tests、Mypy合并到同一个工作流文件中,用needs关键字指定依赖顺序,确保Build完成后再运行Tests和Mypy。这样所有任务都属于同一个提交触发的工作流,任何一步失败都会直接导致提交检查失败。
合并后的CI.yml配置示例:
name: CI on: push jobs: build: runs-on: "ubuntu-20.04" steps: - uses: actions/checkout@v3 - name: Build image run: docker build . --tag ghcr.io/kryseyt/mailing_service - name: Login to ghcr run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - name: Push image run: docker push ghcr.io/kryseyt/mailing_service:latest tests: runs-on: ubuntu-latest needs: build # 等待Build任务完成后执行 env: OS: ubuntu-latest PYTHON: '3.11' steps: - uses: actions/checkout@v3 - name: Run tests run: docker compose -f docker-compose.yml -f tests.yml up --abort-on-container-exit - name: Copy coverage data from container run: docker compose cp mailing_service:/mailing_service/coverage.xml ./ - name: Upload coverage to Codecov uses: codecov/codecov-action@v2 with: directory: ./ env_vars: OS,PYTHON fail_ci_if_error: true files: ./coverage.xml flags: unit-tests name: codecov-umbrella path_to_write_report: ./coverage/codecov_report.txt verbose: true mypy: runs-on: ubuntu-latest needs: build # 等待Build任务完成后执行 steps: - uses: actions/checkout@v3 - name: Run mypy run: docker compose run mailing_service mypy src/ --strict
方式二:使用工作流调用(workflow_call)
保留三个独立的工作流文件,修改Build工作流,让它在完成后主动调用Tests和Mypy工作流。这种方式下,被调用的工作流状态会关联到原提交的检查中。
1. 修改Build工作流(Build.yml)
在原有任务后添加调用Tests和Mypy的任务:
name: Build on: push jobs: docker_publish: runs-on: "ubuntu-20.04" steps: - uses: actions/checkout@v3 - name: Build image run: docker build . --tag ghcr.io/kryseyt/mailing_service - name: Login to ghcr run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - name: Push image run: docker push ghcr.io/kryseyt/mailing_service:latest trigger_tests: needs: docker_publish uses: ./.github/workflows/Tests.yml # 调用Tests工作流 secrets: inherit # 继承当前工作流的密钥 trigger_mypy: needs: docker_publish uses: ./.github/workflows/Mypy.yml # 调用Mypy工作流 secrets: inherit
2. 修改Tests工作流(Tests.yml)
替换原有的workflow_run触发器为workflow_call,允许被其他工作流调用:
name: Tests on: workflow_call: # 启用工作流调用功能 jobs: run: runs-on: ubuntu-latest env: OS: ubuntu-latest PYTHON: '3.11' steps: - uses: actions/checkout@v3 - name: Run tests run: docker compose -f docker-compose.yml -f tests.yml up --abort-on-container-exit - name: Copy coverage data from container run: docker compose cp mailing_service:/mailing_service/coverage.xml ./ - name: Upload coverage to Codecov uses: codecov/codecov-action@v2 with: directory: ./ env_vars: OS,PYTHON fail_ci_if_error: true files: ./coverage.xml flags: unit-tests name: codecov-umbrella path_to_write_report: ./coverage/codecov_report.txt verbose: true
3. 修改Mypy工作流(Mypy.yml)
同样替换触发器为workflow_call:
name: Mypy on: workflow_call: # 启用工作流调用功能 jobs: build: runs-on: ubuntu-latest name: Mypy steps: - uses: actions/checkout@v3 - name: Run mypy run: docker compose run mailing_service mypy src/ --strict
说明
两种方式都能实现你的需求:Build完成后运行Tests和Mypy,且它们的失败状态会同步到提交检查中。如果希望工作流结构更简洁,推荐方式一;如果需要保留工作流的独立性,方式二更合适。
内容的提问来源于stack exchange,提问作者KrySeyt
相关产品推荐
相关产品推荐

