name: PR Check
on:
pull_request:
types: [opened, synchronize, reopened, labeled]
permissions:
contents: read
pull-requests: write
jobs:
semver-check:
name: Semver Compliance
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Install cargo-semver-checks
run: cargo install cargo-semver-checks --locked
- name: Check semver compliance
run: cargo semver-checks check-release
label-check:
name: Version Label
runs-on: ubuntu-latest
steps:
- name: Check for version label
uses: actions/github-script@v7
with:
script: |
const validLabels = ['patch', 'minor', 'major'];
const prLabels = context.payload.pull_request.labels.map(l => l.name);
const hasVersionLabel = prLabels.some(l => validLabels.includes(l));
if (!hasVersionLabel) {
const marker = '<!-- version-label-check -->';
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
if (!comments.some(c => c.body.includes(marker))) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `${marker}\n⚠️ **Version label missing.** Please add one of: \`patch\`, \`minor\`, \`major\`.\n\nThis determines the next release version.`,
});
}
core.setFailed('Missing version label.');
}
test-summary:
name: Test Summary
runs-on: ubuntu-latest
needs: []
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Run tests and capture output
id: tests
run: |
cargo test --all-features 2>&1 | tee test-output.txt
echo "test_count=$(grep -oP '\d+ passed' test-output.txt | head -1)" >> $GITHUB_OUTPUT
- name: Post test summary
if: always()
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const output = fs.readFileSync('test-output.txt', 'utf8');
const lines = output.split('\n');
const resultLine = lines.find(l => l.includes('test result:')) || 'No test results found';
const marker = '<!-- test-summary -->';
const body = `${marker}\n### 🧪 Test Results\n\`\`\`\n${resultLine}\n\`\`\``;
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const existing = comments.find(c => c.body.includes(marker));
if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id,
body,
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body,
});
}