配置GitHub Action仅针对PR中.py文件运行并解决检查阻塞问题
解决GitHub Action非Python文件PR检查挂起问题
问题核心:当前配置仅在PR包含.py文件变更时触发工作流,无Python文件变更时工作流处于skipped状态,而分支保护规则要求状态检查必须通过,skipped状态不满足要求导致无法合并。
解决方案:让工作流对所有PR事件都触发,然后在job内部判断是否有Python文件变更——有则执行lint检查,无则直接标记为成功,确保状态检查始终为passed。
修改后的配置方案一(使用GitHub CLI)
name: Linter on: push: branches: [main] pull_request: # 移除paths限制,让所有PR都触发工作流 workflow_dispatch: jobs: linter: runs-on: windows-latest steps: - name: 检测Python文件变更 id: check_python run: | # 获取PR中所有变更的文件 CHANGED_FILES=$(gh pr view ${{ github.event.pull_request.number }} --json files --jq '.files[].path') # 判断是否存在.py文件 if echo "$CHANGED_FILES" | grep -q "\.py$"; then echo "has_python_changes=true" >> $GITHUB_OUTPUT else echo "has_python_changes=false" >> $GITHUB_OUTPUT fi env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 拉取代码仓库 if: steps.check_python.outputs.has_python_changes == 'true' uses: actions/checkout@v2 with: fetch-depth: 0 - name: 安装依赖 if: steps.check_python.outputs.has_python_changes == 'true' run: | python -m pip install --upgrade pip pip install flake8 - name: 执行Flake8检查 if: steps.check_python.outputs.has_python_changes == 'true' run: | flake8 $(git diff origin/main --name-only --diff-filter=d) - name: 无Python变更时标记任务成功 if: steps.check_python.outputs.has_python_changes == 'false' run: echo "未检测到Python文件变更,直接标记任务成功"
修改后的配置方案二(使用Git Diff)
如果不想依赖GitHub CLI,可采用更简洁的Git对比方式:
name: Linter on: push: branches: [main] pull_request: workflow_dispatch: jobs: linter: runs-on: windows-latest steps: - name: 拉取代码仓库 uses: actions/checkout@v2 with: fetch-depth: 0 - name: 检测Python文件变更 id: check_python run: | # 对比当前分支与main分支的变更文件 CHANGED_FILES=$(git diff origin/main --name-only --diff-filter=d) if echo "$CHANGED_FILES" | grep -q "\.py$"; then echo "has_python_changes=true" >> $GITHUB_OUTPUT else echo "has_python_changes=false" >> $GITHUB_OUTPUT fi shell: bash - name: 安装依赖 if: steps.check_python.outputs.has_python_changes == 'true' run: | python -m pip install --upgrade pip pip install flake8 - name: 执行Flake8检查 if: steps.check_python.outputs.has_python_changes == 'true' run: | flake8 $(git diff origin/main --name-only --diff-filter=d)
关键说明
- 移除
pull_request下的paths配置,确保所有PR都能触发工作流 - 通过条件判断控制后续步骤:仅当有Python文件变更时,才执行拉取代码、安装依赖、lint检查;无变更时任务自动标记为成功
- 无论PR是否包含Python文件变更,工作流状态都会是
passed,满足分支保护规则的要求,不影响合并
内容的提问来源于stack exchange,提问作者Deepmoy Banerjee
相关产品推荐
相关产品推荐

