cargo-semver-checks report<\/summary>/);
+ assert.match(comment.body, //);
+ assert.match(comment.body, /<breaking> runtime API/);
+ assert.match(comment.body, /<\/code><\/pre>/);
+ assert.doesNotMatch(comment.body, /workflow run|actions\/runs/);
+ assert.ok(calls.some(([name]) => name === "addLabels"));
+ assert.ok(!calls.some(([name]) => name === "getLabel"));
+ assert.ok(!calls.some(([name]) => name === "createLabel"));
+});
diff --git a/.github/workflows/ci_check_breaking.yml b/.github/workflows/ci_check_breaking.yml
new file mode 100644
index 000000000..8bdea42aa
--- /dev/null
+++ b/.github/workflows/ci_check_breaking.yml
@@ -0,0 +1,42 @@
+name: Check Breaking Changes
+
+on:
+ pull_request:
+ types: [opened, reopened, synchronize]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
+ cancel-in-progress: true
+
+jobs:
+ check-breaking:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ fetch-depth: 0
+ persist-credentials: false
+ - name: Setup Rust Toolchain
+ run: rustup default stable
+ - uses: taiki-e/install-action@cargo-semver-checks
+ - name: Check Public API Compatibility
+ id: semver
+ uses: actions/github-script@v8
+ env:
+ BASELINE_REV: ${{ github.event.pull_request.base.sha }}
+ BREAKING_REPORT_PATH: ${{ runner.temp }}/breaking-change/report.json
+ CARGO_INCREMENTAL: 0
+ with:
+ script: |
+ const { check } = require("./.github/scripts/check-breaking.cjs");
+ await check({ core, exec });
+ - name: Save Breaking Change Report
+ uses: actions/upload-artifact@v7
+ with:
+ name: breaking-change-report
+ path: ${{ runner.temp }}/breaking-change/report.json
+ if-no-files-found: error
+ retention-days: 1
+
diff --git a/.github/workflows/ci_report_breaking.yml b/.github/workflows/ci_report_breaking.yml
new file mode 100644
index 000000000..f5c653293
--- /dev/null
+++ b/.github/workflows/ci_report_breaking.yml
@@ -0,0 +1,48 @@
+name: Report Breaking Changes
+
+on:
+ workflow_run:
+ workflows: [Check Breaking Changes]
+ types: [completed]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.workflow_run.id }}
+ cancel-in-progress: true
+
+jobs:
+ report-breaking:
+ if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.pull_requests[0].number }}
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+ contents: read
+ issues: write
+ pull-requests: write
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ ref: ${{ github.event.repository.default_branch }}
+ persist-credentials: false
+ - name: Load Breaking Change Report
+ uses: actions/download-artifact@v8
+ with:
+ name: breaking-change-report
+ path: ${{ runner.temp }}/breaking-change
+ repository: ${{ github.repository }}
+ run-id: ${{ github.event.workflow_run.id }}
+ github-token: ${{ github.token }}
+ - name: Label PR and Report Breaking Changes
+ uses: actions/github-script@v8
+ env:
+ BREAKING_REPORT_PATH: ${{ runner.temp }}/breaking-change/report.json
+ PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }}
+ with:
+ script: |
+ const { reportFromFile } = require("./.github/scripts/check-breaking.cjs");
+ await reportFromFile({
+ core,
+ github,
+ context,
+ issueNumber: Number(process.env.PR_NUMBER),
+ reportPath: process.env.BREAKING_REPORT_PATH,
+ });