You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何捕获Astral ruff-action的命令输出并在GitHub Pull Request中添加评论

如何捕获Astral ruff-action的命令输出并在GitHub Pull Request中添加评论

我明白你现在的困扰——Astral的ruff-action确实没给我们暴露ruff formatruff check --fix的命令输出,只提供了Ruff版本的输出。不过没关系,我们可以调整下工作流,不用死磕action的输出,直接自己执行Ruff命令并捕获结果就好,这样照样能把内容写到PR评论里。下面是修改后的完整工作流配置,我会逐个给你讲关键改动:

name: ruff-lint-and-comment
on:
  pull_request:
    branches:
      - main
    types: [opened, reopened, synchronize]

jobs:
  lint:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    steps:
      - name: Check out Repository
        uses: actions/checkout@v4
        with:
          ref: ${{ github.head_ref }}

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11" # 你可以根据项目需求调整Python版本

      - name: Install Ruff
        run: pip install ruff

      - name: Format code and capture output
        id: format
        run: |
          # 执行ruff format,把标准输出和错误输出都存到文件里
          ruff format --show-fixes 2>&1 | tee ruff_format_output.txt
        continue-on-error: true

      - name: Commit format changes (if any)
        run: |
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          git add .
          git commit -m "Apply Ruff formatting" || exit 0
          git push origin HEAD:${{ github.head_ref }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Check code and capture output
        id: check
        run: |
          # 执行ruff check --fix,同样把输出存到文件
          ruff check --fix --show-fixes 2>&1 | tee ruff_check_output.txt
        continue-on-error: true  

      - name: Commit fixed lint errors (if any)
        run: |
          git config --global user.name "github-actions[bot]"
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
          git add .
          git commit -m "Apply Ruff lint fixes" || exit 0
          git push origin HEAD:${{ github.head_ref }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: 📬 Add output to PR comment
        run: |
          echo "#### Ruff Lint & Format Results" > ruff_output.txt

          # 插入Format的输出内容
          echo "<details><summary>Formatting Output</summary>" >> ruff_output.txt
          echo "" >> ruff_output.txt
          echo '```' >> ruff_output.txt
          # 处理空输出的情况,显示友好提示
          if [ -s ruff_format_output.txt ]; then
            cat ruff_format_output.txt >> ruff_output.txt
          else
            echo "No formatting changes needed." >> ruff_output.txt
          fi
          echo '```' >> ruff_output.txt
          echo "" >> ruff_output.txt
          echo "</details>" >> ruff_output.txt

          # 插入Check的输出内容
          echo "<details><summary>Lint Check & Fix Output</summary>" >> ruff_output.txt
          echo "" >> ruff_output.txt
          echo '```' >> ruff_output.txt
          if [ -s ruff_check_output.txt ]; then
            cat ruff_check_output.txt >> ruff_output.txt
          else
            echo "No lint issues found or fixed." >> ruff_output.txt
          fi
          echo '```' >> ruff_output.txt
          echo "" >> ruff_output.txt
          echo "</details>" >> ruff_output.txt

          # 如果内容太长就截断,避免超过GitHub评论的长度限制
          file_size=$(wc -m < ruff_output.txt)         
          if [ "$file_size" -gt 65000 ]; then
            head -c 65000 ruff_output.txt > temp_ruff_output.txt
            echo -e "\n\n⚠️ Output truncated due to size limit" >> temp_ruff_output.txt
            mv temp_ruff_output.txt ruff_output.txt
          fi
          
          # 把生成的内容作为评论发到PR里
          gh issue comment ${{ github.event.number }} --body-file ruff_output.txt
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GH_REPO: ${{ github.repository }}

关键改动说明:

  1. 换掉ruff-action,直接安装执行Ruff
    既然官方action没提供输出,那我们就自己来:先用actions/setup-python搭好Python环境,再用pip install ruff装最新版Ruff,这样就能直接执行命令并捕获所有输出了,比绕action靠谱多了。

  2. tee捕获输出到文件
    每个Ruff命令后面加了| tee 文件名,这个命令会把输出同时打印到工作流日志(方便你查错)和保存到本地文件,2>&1是把错误输出也合并到标准输出,确保所有内容都被抓下来,不会漏掉任何信息。

  3. 处理空输出的友好提示
    如果代码已经很规范,不需要格式化也没有lint问题,那输出文件会是空的。这时候我们在评论里加了提示语,不会出现空的代码块,看起来更专业。

  4. 优化截断提示
    原来的截断逻辑只砍内容,现在加了明确的⚠️提示,让PR提交者知道内容因为太长被截断了,不会一脸懵。

  5. 保留原有的自动提交逻辑
    你之前写的自动提交格式化、修复的代码完全保留,不影响现有的自动修复功能,只是把执行Ruff的方式换了而已。

如果你实在想坚持用ruff-action,目前官方确实没提供输出命令结果的参数,硬要做的话只能去爬工作流的日志API,不仅复杂还容易出问题,不如直接执行Ruff命令来得简单直接。

备注:内容来源于stack exchange,提问作者Laura Galera

火山引擎 最新活动