GitHub Actions按特定文件变更触发/跳过步骤配置失效求助
GitHub Actions 路径过滤失效问题修复
问题根源分析
你的流水线出现所有步骤都执行的情况,主要由以下几个原因导致:
重复且不完整的代码检出:连续使用两次
actions/checkout,且未配置完整历史拉取。GitHub Actions 默认只拉取最新一次提交(fetch-depth:1),dorny/paths-filter需要对比历史提交才能检测路径变更,缺少完整历史会导致过滤逻辑失效。路径匹配错误:配置中写的路径(如
foo/js/bc-global.js)与实际隐藏文件名(.bc-global.js)不符,少了开头的.,导致路径过滤规则无法正确匹配文件变更。自动提交范围过宽:
git-auto-commit-action的file_pattern设为*.js会提交所有JS文件,包括未修改的项目产物,可能引发不必要的提交。
修正后的完整配置
name: Upload to S3 on: push: branches: - test-s3 paths: - "foo/js/.bc-global.js" - "foo/js/scripts/**.js" - "foo2/js/.lc-global.js" - "foo2/js/scripts/**.js" jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code with full history uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取完整历史,确保路径过滤能对比变更 - uses: dorny/paths-filter@v2 id: changes with: filters: | foo: - 'foo/js/.bc-global.js' - 'foo/js/scripts/**.js' foo2: - 'foo2/js/.lc-global.js' - 'foo2/js/scripts/**.js' - name: Install Node.js uses: actions/setup-node@v3 with: node-version: 16.13.0 - name: Install uglify-js run: npm install uglify-js -g # 按项目执行压缩步骤 - name: Minify script files for foo if: steps.changes.outputs.foo == 'true' run: uglifyjs foo/js/scripts/**.js -o foo/js/live/scripts-bundle.js - name: Minify global file for foo if: steps.changes.outputs.foo == 'true' run: uglifyjs foo/js/.bc-global.js -o foo/js/live/global-bundle.js - name: Minify script files for foo2 if: steps.changes.outputs.foo2 == 'true' run: uglifyjs foo2/js/scripts/**.js -o foo2/js/live/scripts-bundle.js - name: Minify global file for foo2 if: steps.changes.outputs.foo2 == 'true' run: uglifyjs foo2/js/.lc-global.js -o foo2/js/live/global-bundle.js # 仅提交变更的项目产物 - name: Auto commit minified files uses: stefanzweifel/git-auto-commit-action@v4 with: file_pattern: "foo/js/live/*.js foo2/js/live/*.js" commit_message: "Github Action: Auto Minified JS files" branch: ${{ github.ref }} # 部署foo项目(仅当foo路径有变更时执行) - name: Deploy to S3 for foo if: steps.changes.outputs.foo == 'true' uses: jakejarvis/s3-sync-action@master with: args: --follow-symlinks --cache-control max-age=600 env: AWS_S3_BUCKET: ${{ secrets.AWS_BUCKET_NAME }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_REGION: ${{ secrets.AWS_REGION }} SOURCE_DIR: "foo/js/live" DEST_DIR: "foo/pages/assets/js/test/" # 部署foo2项目(仅当foo2路径有变更时执行) - name: Deploy to S3 for foo2 if: steps.changes.outputs.foo2 == 'true' uses: jakejarvis/s3-sync-action@master with: args: --follow-symlinks --cache-control max-age=600 env: AWS_S3_BUCKET: ${{ secrets.AWS_BUCKET_NAME }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_REGION: ${{ secrets.AWS_REGION }} SOURCE_DIR: "foo2/js/live" DEST_DIR: "foo2/pages/assets/js/test/"
关键修改说明
修复代码检出:移除重复的
actions/checkout,改用最新的v4版本并设置fetch-depth:0,确保拉取完整Git历史,让路径过滤能正确对比前后提交的文件变更。修正路径匹配:将配置中所有文件路径补全开头的
.(如foo/js/.bc-global.js),保证与实际隐藏文件名一致,让过滤规则能准确匹配变更。缩小自动提交范围:把
file_pattern改为仅匹配两个项目的live目录下的JS文件,避免提交未修改的文件。清理冗余配置:移除了不必要的
registry-url配置(仅当发布npm包时需要),简化配置结构。
内容的提问来源于stack exchange,提问作者ffcabbar
相关产品推荐
相关产品推荐

