ci: 添加 Ruff 代码格式检查和自动修复的 GitHub Actions 工作流
This commit is contained in:
parent
82bc35a501
commit
704954ba96
169
.github/workflows/ruff.yml
vendored
Normal file
169
.github/workflows/ruff.yml
vendored
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
# GitHub Actions workflow for Ruff code formatting and linting
|
||||||
|
# 自动运行 Ruff 格式检查和修复
|
||||||
|
#
|
||||||
|
# 触发条件:
|
||||||
|
# 1. Push 到 main 分支时:自动格式化并提交
|
||||||
|
# 2. Pull Request 时:检查格式并标记问题(不自动提交)
|
||||||
|
|
||||||
|
name: Ruff Format Check
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- '**.py'
|
||||||
|
- 'pyproject.toml'
|
||||||
|
- 'Makefile'
|
||||||
|
- '.github/workflows/ruff.yml'
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- '**.py'
|
||||||
|
- 'pyproject.toml'
|
||||||
|
- 'Makefile'
|
||||||
|
|
||||||
|
# 设置写入权限,允许自动提交格式化代码
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ruff:
|
||||||
|
name: Ruff Format & Lint
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# 1. 检出代码
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# 2. 安装 uv(项目使用 uv 作为包管理器)
|
||||||
|
- name: Install uv
|
||||||
|
uses: astral-sh/setup-uv@v4
|
||||||
|
with:
|
||||||
|
version: "0.7.2"
|
||||||
|
|
||||||
|
# 3. 设置 Python 环境
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.12'
|
||||||
|
|
||||||
|
# 4. 安装 ruff 依赖(根据项目配置,ruff 在 dev 依赖组中)
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
uv sync --group dev
|
||||||
|
|
||||||
|
# 5. 运行 Ruff 格式检查(与项目的 make lint 命令一致)
|
||||||
|
- name: Run Ruff format check
|
||||||
|
id: ruff-format
|
||||||
|
run: |
|
||||||
|
echo "Running ruff check (uv run python -m ruff check .)..."
|
||||||
|
uv run python -m ruff check .
|
||||||
|
|
||||||
|
echo "Running ruff format diff check (uv run python -m ruff format src --diff)..."
|
||||||
|
uv run python -m ruff format src --diff
|
||||||
|
|
||||||
|
echo "Running import sorting check (uv run python -m ruff check --select I src)..."
|
||||||
|
uv run python -m ruff check --select I src
|
||||||
|
|
||||||
|
# 保存检查结果状态
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "ruff_format_passed=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "✅ Ruff format check passed"
|
||||||
|
else
|
||||||
|
echo "ruff_format_passed=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "❌ Ruff format check failed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 6. 针对不同事件类型执行不同操作
|
||||||
|
- name: Process Ruff Results
|
||||||
|
if: ${{ github.event_name == 'push' }}
|
||||||
|
run: |
|
||||||
|
echo "Processing push event to main branch..."
|
||||||
|
|
||||||
|
# 自动应用格式修复(与项目的 make format 命令一致)
|
||||||
|
echo "Running uv run ruff format ."
|
||||||
|
uv run ruff format .
|
||||||
|
|
||||||
|
echo "Running uv run ruff check . --fix"
|
||||||
|
uv run ruff check . --fix
|
||||||
|
|
||||||
|
echo "Running uv run python -m ruff check --select I src --fix"
|
||||||
|
uv run python -m ruff check --select I src --fix
|
||||||
|
|
||||||
|
# 检查是否有格式变更
|
||||||
|
git diff --exit-code --name-only || (
|
||||||
|
echo "Formatting changes detected"
|
||||||
|
git config user.name "GitHub Actions"
|
||||||
|
git config user.email "actions@github.com"
|
||||||
|
git add .
|
||||||
|
git commit -m "style: auto-format with ruff [skip ci]"
|
||||||
|
git push
|
||||||
|
echo "✅ Formatting changes committed and pushed"
|
||||||
|
)
|
||||||
|
|
||||||
|
- name: Create PR Comment on Failure
|
||||||
|
if: ${{ github.event_name == 'pull_request' && steps.ruff-format.outputs.ruff_format_passed == 'false' }}
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
const issue_number = context.issue.number;
|
||||||
|
const repo = context.repo;
|
||||||
|
|
||||||
|
const commentBody = `## ⚠️ Ruff Format Check Failed
|
||||||
|
|
||||||
|
The Ruff format check failed on this pull request. Please run the following commands locally to fix formatting issues:
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
# Format code using project make command
|
||||||
|
make format
|
||||||
|
|
||||||
|
# Or manually run ruff commands with uv (same as make lint)
|
||||||
|
uv run ruff check .
|
||||||
|
uv run python -m ruff format src --diff
|
||||||
|
uv run python -m ruff check --select I src
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
To fix formatting issues:
|
||||||
|
\`\`\`bash
|
||||||
|
uv run ruff format .
|
||||||
|
uv run ruff check . --fix
|
||||||
|
uv run python -m ruff check --select I src --fix
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
Once formatting issues are resolved, commit and push your changes.`;
|
||||||
|
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
owner: repo.owner,
|
||||||
|
repo: repo.repo,
|
||||||
|
issue_number: issue_number,
|
||||||
|
body: commentBody
|
||||||
|
});
|
||||||
|
|
||||||
|
- name: Create PR Comment on Success
|
||||||
|
if: ${{ github.event_name == 'pull_request' && steps.ruff-format.outputs.ruff_format_passed == 'true' }}
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
const issue_number = context.issue.number;
|
||||||
|
const repo = context.repo;
|
||||||
|
|
||||||
|
const commentBody = `## ✅ Ruff Format Check Passed
|
||||||
|
|
||||||
|
All Python files follow the required formatting standards. Great work!`;
|
||||||
|
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
owner: repo.owner,
|
||||||
|
repo: repo.repo,
|
||||||
|
issue_number: issue_number,
|
||||||
|
body: commentBody
|
||||||
|
});
|
||||||
Loading…
Reference in New Issue
Block a user