如何在GitHub Workflow中仅对已提交推送文件执行ESLint检查?
实现GitHub Actions中仅对变更文件执行ESLint检查
当然可以实现,核心思路是先获取本次推送中变更的文件列表,再把这些文件传给ESLint做检查。下面是具体的yaml配置示例:
完整工作流配置
name: Lint Changed Files on: [push, pull_request] jobs: lint: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 # 拉取完整提交历史,方便对比变更 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - name: Install dependencies run: npm ci - name: Get changed files id: changed-files run: | # 获取与主分支对比的变更文件(如果是PR则对比base分支,否则对比上一次提交) if [ "${{ github.event_name }}" = "pull_request" ]; then BASE_REF="${{ github.base_ref }}" else BASE_REF="HEAD~1" fi # 筛选出.js/.jsx/.ts/.tsx类型的文件,根据你的项目调整后缀 CHANGED_FILES=$(git diff --name-only $BASE_REF HEAD | grep -E '\.(js|jsx|ts|tsx)$' | tr '\n' ' ') echo "files=$CHANGED_FILES" >> $GITHUB_OUTPUT - name: Run ESLint on changed files if: steps.changed-files.outputs.files != '' # 只有存在变更文件时才执行 run: npx eslint ${{ steps.changed-files.outputs.files }}
关键步骤说明
- 拉取完整历史:
fetch-depth: 0确保能获取到足够的提交历史来对比变更文件,避免因浅克隆无法获取之前的提交内容。 - 筛选变更文件:通过
git diff命令获取变更文件列表,再用grep过滤出需要ESLint检查的文件类型(可根据项目技术栈调整后缀,比如添加.vue等)。 - 条件执行检查:通过
if判断确保只有存在符合条件的变更文件时,才执行ESLint检查,避免无意义的空执行。
注意事项
- 如果你的项目默认分支不是
main,需要调整BASE_REF的默认值,比如改为对应分支名或者保持HEAD~1对比上一次提交。 - 确保项目的
package.json中已正确配置ESLint规则,且依赖安装命令(npm ci)能正确安装ESLint及相关插件。
内容的提问来源于stack exchange,提问作者Arseniy Shukhov
相关产品推荐
相关产品推荐

