为何使用if & contain时GitHub Actions任务被跳过?
GitHub Workflow 单包测试条件失效问题解决
问题根源
你误解了github.event.pull_request.changed_files的字段含义——它是PR中变更文件的总数量(数字类型),并非变更文件的路径列表。用它判断是否包含特定路径字符串,逻辑永远不成立,所以所有PR的任务都会被跳过。
正确实现方式
方案1:用内置paths过滤(推荐)
GitHub Workflow支持直接用paths字段在job级别过滤,自动检测PR是否有目标路径下的文件变更,语法简洁且可靠:
jobs: test-front-end-customer: runs-on: ubuntu-latest # 直接通过paths指定需要监听的文件路径 paths: - 'packages/front-end-customer/**' steps: - uses: actions/checkout@v4 - run: yarn install - run: yarn workspace front-end-customer test
如果需要结合其他条件,也可以在if中使用paths()函数:
if: ${{ github.event_name == 'pull_request' && paths('packages/front-end-customer/**') }}
方案2:脚本获取变更文件判断(灵活场景)
如果需要更复杂的判断逻辑,比如排除某些子目录,可以用actions/github-script拉取PR的变更文件列表,再做自定义判断:
jobs: test-front-end-customer: runs-on: ubuntu-latest steps: - id: check-changes uses: actions/github-script@v7 with: script: | const files = await github.rest.pulls.listFiles({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.issue.number }); // 判断是否有目标包下的文件变更 return files.data.some(file => file.filename.startsWith('packages/front-end-customer/')); result-encoding: string - name: 执行测试任务 if: steps.check-changes.outputs.result == 'true' run: | yarn install yarn workspace front-end-customer test
内容的提问来源于stack exchange,提问作者nayounsang
相关产品推荐
相关产品推荐

