name: JSON Data Validation on: pull_request_target: types: [opened, synchronize, reopened, edited] branches: - main paths: - 'repo/pathing/**/*.json' workflow_dispatch: inputs: path: description: '要验证的路径' required: true default: 'repo/pathing' type: string auto_fix: description: '是否自动修复问题' required: false default: true type: boolean pr_number: description: '关联的 PR 号' required: false type: string jobs: validate-json: runs-on: ubuntu-latest permissions: contents: write pull-requests: write steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha || github.sha }} token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.10' - name: Install dependencies run: | pip install packaging semver - name: Get PR information if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.pr_number != '' }} id: pr_info uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | try { const pr = await github.rest.pulls.get({ owner: context.repo.owner, repo: context.repo.repo, pull_number: parseInt(${{ github.event.inputs.pr_number }}) }); core.setOutput('head_sha', pr.data.head.sha); core.setOutput('head_ref', pr.data.head.ref); core.setOutput('head_repo', pr.data.head.repo.full_name); core.setOutput('found', 'true'); console.log(`找到 PR #${{ github.event.inputs.pr_number }}`); console.log(`Head SHA: ${pr.data.head.sha}`); console.log(`Head Ref: ${pr.data.head.ref}`); console.log(`Head Repo: ${pr.data.head.repo.full_name}`); } catch (error) { console.log(`获取 PR #${{ github.event.inputs.pr_number }} 信息失败: ${error.message}`); core.setOutput('found', 'false'); } - name: Run validation and correction env: GITHUB_ACTOR: ${{ github.actor }} PR_NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} HEAD_REF: ${{ github.event.pull_request.head.ref || steps.pr_info.outputs.head_ref || '' }} PR_REPO: ${{ github.event.pull_request.head.repo.full_name || steps.pr_info.outputs.head_repo || github.repository }} VALIDATE_PATH: ${{ github.event.inputs.path || 'repo/pathing' }} AUTO_FIX: ${{ github.event.inputs.auto_fix || 'true' }} run: | # 根据触发方式决定验证路径和是否自动修复 if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then echo "手动触发模式,验证路径: ${VALIDATE_PATH}" python ./bulid/validate.py ${VALIDATE_PATH} $([[ "${AUTO_FIX}" == "true" ]] && echo "--fix") else echo "PR 触发模式,验证修改的 JSON 文件" python ./bulid/validate.py repo/pathing --fix fi - name: Add PR comment if: ${{ github.event_name == 'pull_request_target' || (github.event_name == 'workflow_dispatch' && github.event.inputs.pr_number != '' && steps.pr_info.outputs.found == 'true') }} continue-on-error: true uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const fs = require('fs'); const pr_number = ${{ github.event.pull_request.number || github.event.inputs.pr_number }}; if (fs.existsSync('validation_notes.md')) { const message = fs.readFileSync('validation_notes.md', 'utf8'); await github.rest.issues.createComment({ issue_number: pr_number, owner: context.repo.owner, repo: context.repo.repo, body: message }); } else { console.log("没有发现 validation_notes.md 文件"); await github.rest.issues.createComment({ issue_number: pr_number, owner: context.repo.owner, repo: context.repo.repo, body: "✅ 校验完成,没有发现问题" }); }