如何让SwiftLint仅检查Git提交及修改的文件?
问题描述
我正在使用GitHub Action结合SwiftLint对Swift代码进行静态检查,希望SwiftLint仅检测项目中已提交和修改的文件。我尝试了多种方案但均未生效,恳请提供可行的建议或指导。以下是我的YAML配置文件:
name: SwiftLint on: push: branches: - 'cicd' pull_request: branches: - 'cicd' jobs: SwiftLint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: GitHub Action for SwiftLint uses: norio-nomura/action-swiftlint@3.2.1 - name: GitHub Action for SwiftLint with --strict uses: norio-nomura/action-swiftlint@3.2.1 with: args: --strict - name: GitHub Action for SwiftLint (Only files changed in the PR compared to 'main') uses: norio-nomura/action-swiftlint@3.2.1 env: DIFF_BASE: 'main' # Compare changes in 'cide-sonarqube' against 'main' - name: GitHub Action for SwiftLint (Different working directory) uses: norio-nomura/action-swiftlint@3.2.1 env: WORKING_DIRECTORY: Source
解决方案
你的配置存在几个核心问题:重复调用SwiftLint导致冗余、checkout版本过旧无法获取完整Git历史、差异对比的参数配置逻辑不对。下面是两种可行的修正方案:
方案一:手动筛选差异文件执行检查
直接通过Git命令提取变更的Swift文件,再喂给SwiftLint扫描,逻辑更清晰可控:
name: SwiftLint on: push: branches: ['cicd'] pull_request: branches: ['cicd'] jobs: swiftlint: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 # 获取完整Git历史,确保能对比分支差异 - name: Install SwiftLint run: | sudo apt-get update sudo apt-get install swiftlint - name: Run SwiftLint on changed files run: | # 根据事件类型获取变更的Swift文件 if [ "${{ github.event_name }}" = "pull_request" ]; then CHANGED_FILES=$(git diff --name-only ${{ github.base_ref }} ${{ github.head_ref }} | grep "\.swift$") else CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD | grep "\.swift$") fi # 有变更文件才执行检查,否则跳过 if [ -n "$CHANGED_FILES" ]; then swiftlint lint --strict $CHANGED_FILES else echo "No Swift files changed, skipping SwiftLint check." fi
方案二:优化原SwiftLint Action的配置
如果你想继续使用norio-nomura/action-swiftlint,调整配置如下:
name: SwiftLint on: push: branches: ['cicd'] pull_request: branches: ['cicd'] jobs: swiftlint: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Run SwiftLint on changed files uses: norio-nomura/action-swiftlint@3.2.1 env: # PR事件对比目标分支,push事件对比上一次提交 DIFF_BASE: ${{ github.event_name == 'pull_request' && github.base_ref || 'HEAD~1' }} with: args: --strict --cache
关键注意点
- 升级
actions/checkout到v4并设置fetch-depth: 0,这是获取完整Git历史、实现差异对比的前提。 - 动态设置
DIFF_BASE,适配push和pull_request两种不同场景的对比基准。 - 添加
--cache参数可以复用之前的检查缓存,提升执行速度。 - 移除冗余的SwiftLint调用步骤,只保留一个核心检查流程。
内容的提问来源于stack exchange,提问作者Umer Khan
相关产品推荐
相关产品推荐

