如何捕获Astral ruff-action的命令输出并在GitHub Pull Request中添加评论
我明白你现在的困扰——Astral的ruff-action确实没给我们暴露ruff format和ruff 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 }}
关键改动说明:
换掉ruff-action,直接安装执行Ruff
既然官方action没提供输出,那我们就自己来:先用actions/setup-python搭好Python环境,再用pip install ruff装最新版Ruff,这样就能直接执行命令并捕获所有输出了,比绕action靠谱多了。用
tee捕获输出到文件
每个Ruff命令后面加了| tee 文件名,这个命令会把输出同时打印到工作流日志(方便你查错)和保存到本地文件,2>&1是把错误输出也合并到标准输出,确保所有内容都被抓下来,不会漏掉任何信息。处理空输出的友好提示
如果代码已经很规范,不需要格式化也没有lint问题,那输出文件会是空的。这时候我们在评论里加了提示语,不会出现空的代码块,看起来更专业。优化截断提示
原来的截断逻辑只砍内容,现在加了明确的⚠️提示,让PR提交者知道内容因为太长被截断了,不会一脸懵。保留原有的自动提交逻辑
你之前写的自动提交格式化、修复的代码完全保留,不影响现有的自动修复功能,只是把执行Ruff的方式换了而已。
如果你实在想坚持用ruff-action,目前官方确实没提供输出命令结果的参数,硬要做的话只能去爬工作流的日志API,不仅复杂还容易出问题,不如直接执行Ruff命令来得简单直接。
备注:内容来源于stack exchange,提问作者Laura Galera




