如何在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
相关产品推荐
相关产品推荐

