You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Action的YAML中传递变量给detekt的CLI参数?

解决GitHub Action中Detekt仅扫描变更文件的配置问题

问题根源

你当前的配置里,changed_files步骤中用export定义的CHANGED_FILES变量只在当前shell会话中有效,无法传递到后续的detekt-all步骤,导致Detekt收到的是未解析的$CHANGED_FILES字符串,而非实际的文件路径,所以报错路径不存在。

修正后的配置方案

以下是调整后的完整YAML配置,关键修改点已标注:

# This workflow performs a static analysis of your Kotlin source code using
# Detekt.
#
# Scans are triggered:
# 1. On every push to the main branch
# 2. On every Pull Request targeting the main branch
name: detekt
on:
  workflow_dispatch:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  detekt:
    runs-on: ubuntu-latest
    steps:
      - name: "checkout"
        uses: actions/checkout@v3
        # 拉取所有历史,确保diff能正确对比分支
        with:
          fetch-depth: 0

      - name: "获取变更文件"
        run: |
          # PR场景对比base分支,push场景对比main分支
          if [ "${{ github.event_name }}" = "pull_request" ]; then
            TARGET_BRANCH="${{ github.base_ref }}"
          else
            TARGET_BRANCH="main"
          fi
          # 获取变更的Kotlin文件(可选:只过滤.kt/.kts文件,避免非代码文件)
          CHANGED_FILES=$(git diff --name-only origin/$TARGET_BRANCH HEAD | grep -E "\.kt$|\.kts$" | tr '\n' ',')
          # 移除末尾多余的逗号(如果有的话)
          CHANGED_FILES=${CHANGED_FILES%,}
          echo "CHANGED_FILES=$CHANGED_FILES" >> $GITHUB_ENV
          echo "待扫描的变更文件:$CHANGED_FILES"

      - name: "运行Detekt"
        uses: natiginfo/action-detekt-all@1.21.0
        with:
          args: --fail-fast --config detekt-config.yml --plugins detekt/detekt-formatting-1.21.0.jar --input ${{ env.CHANGED_FILES }}

关键修改说明

  • 持久化环境变量:用echo "CHANGED_FILES=$CHANGED_FILES" >> $GITHUB_ENV替代export,让变量能跨步骤传递。
  • 分支对比优化:区分PR和push场景,自动选择对比分支,避免硬编码。
  • 过滤代码文件:用grep只保留Kotlin相关文件,避免传递非代码路径给Detekt。
  • 修正路径格式:Detekt的--input参数接受逗号分隔的路径,直接用tr '\n' ','转换即可,无需转成空格。

替代实现方案

如果不想手动处理变更文件,可以使用tj-actions/changed-files action简化步骤,示例如下:

# ... 省略前面的on和jobs配置 ...
      - name: "获取变更文件"
        id: changed-files
        uses: tj-actions/changed-files@v41
        with:
          base: ${{ github.base_ref || 'main' }}
          files: |
            **/*.kt
            **/*.kts

      - name: "运行Detekt"
        uses: natiginfo/action-detekt-all@1.21.0
        with:
          args: --fail-fast --config detekt-config.yml --plugins detekt/detekt-formatting-1.21.0.jar --input ${{ steps.changed-files.outputs.all_changed_files }}

这个action会自动处理分支对比和文件过滤,输出直接符合Detekt的输入格式。

内容的提问来源于stack exchange,提问作者Joc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:27:44