Skip to content

feat: add api compatibility check workflow #95

feat: add api compatibility check workflow

feat: add api compatibility check workflow #95

Workflow file for this run

name: EinoTests
on:
pull_request:
push:
branches:
- main
env:
DEFAULT_GO_VERSION: "1.18"
jobs:
unit-test:
name: eino-unit-test
runs-on: ubuntu-latest
env:
COVERAGE_FILE: coverage.out
BREAKDOWN_FILE: main.breakdown
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.DEFAULT_GO_VERSION }}
- name: Exec Go Test
run: |
modules=`find . -name "go.mod" -exec dirname {} \;`
echo $modules
list=""
coverpkg=""
if [[ ! -f "go.work" ]];then go work init;fi
for module in $modules; do go work use $module; list=$module"/... "$list; coverpkg=$module"/...,"$coverpkg; done
go work sync
go test -race -v -coverprofile=${{ env.COVERAGE_FILE }} -gcflags="all=-l -N" -coverpkg=$coverpkg $list
- name: Download Artifact (main.breakdown)
id: download-main-breakdown
uses: actions/download-artifact@v4
continue-on-error: true
with:
name: ${{ env.BREAKDOWN_FILE }}
- name: Create main.breakdown If Not Exist
run: |
if [ ! -f ${{ env.BREAKDOWN_FILE }} ]; then
echo "${{ env.BREAKDOWN_FILE }} not found. Creating an empty file."
touch ${{ env.BREAKDOWN_FILE }}
else
echo "${{ env.BREAKDOWN_FILE }} found."
fi
- name: Calculate Coverage
id: coverage
uses: vladopajic/go-test-coverage@v2
with:
config: ./.testcoverage.yml
profile: ${{ env.COVERAGE_FILE}}
breakdown-file-name: ${{ github.ref_name == 'main' && env.BREAKDOWN_FILE || '' }}
diff-base-breakdown-file-name: ${{ env.BREAKDOWN_FILE }}
# to generate and embed coverage badges in markdown files
git-token: ${{ github.ref_name == 'main' && secrets.GITHUB_TOKEN || '' }}
git-branch: badges
- name: Upload Artifact (main.breakdown)
uses: actions/upload-artifact@v4
if: github.ref_name == 'main'
with:
name: ${{ env.BREAKDOWN_FILE }}
path: ${{ env.BREAKDOWN_FILE }}
if-no-files-found: error
- name: Find If coverage Report Exist
if: ${{ github.event.pull_request.number != null }}
uses: peter-evans/find-comment@v3
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: '📊 Coverage Report'
- name: Send Coverage Report
if: ${{ github.event.pull_request.number != null }}
uses: peter-evans/create-or-update-comment@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.fc.outputs.comment-id || '' }}
edit-mode: replace
body: |
## 📊 Coverage Report:
```
${{ steps.coverage.outputs.report && fromJSON(steps.coverage.outputs.report) || 'No coverage report available' }}
```
- name: Check Coverage
if: steps.coverage.outcome == 'failure'
shell: bash
run: echo "coverage check failed" && exit 1
benchmark-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.DEFAULT_GO_VERSION }}
- name: Run Benchmark Tests
run: go test -bench=. -benchmem -run=none ./...
compatibility-test:
strategy:
matrix:
go: [ "1.19", "1.20", "1.21", "1.22" ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go }}
cache: true
- name: Compatibility Test
run: |
# just basic unit test, no coverage report
go test -race ./...
api-compatibility:
name: api-compatibility-check
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 需要完整的 git history
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.22"
- name: Install go-apidiff
run: go install github.com/joelanford/go-apidiff@latest
- name: Check API compatibility
id: apidiff
run: |
BASE_SHA=${{ github.event.pull_request.base.sha }}
HEAD_SHA=${{ github.event.pull_request.head.sha }}
echo "Checking API compatibility between $BASE_SHA and $HEAD_SHA"
go mod tidy
if ! DIFF_OUTPUT=$(go-apidiff --print-compatible $BASE_SHA $HEAD_SHA 2>&1); then
echo "go-apidiff output\n: $DIFF_OUTPUT"
DIFF_OUTPUT="uncompatible api changes found: $DIFF_OUTPUT"
fi
echo "diff_output<<EOF" >> $GITHUB_ENV
echo "$DIFF_OUTPUT" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
if echo "$DIFF_OUTPUT" | grep -q "Incompatible changes:"; then
echo "has_breaking_changes=true" >> $GITHUB_OUTPUT
else
echo "has_breaking_changes=false" >> $GITHUB_OUTPUT
fi
- name: Find Previous Comment
if: steps.apidiff.outputs.has_breaking_changes == 'true'
uses: peter-evans/find-comment@v3
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: '⚠️ Breaking API Changes Detected'
- name: Comment PR
if: steps.apidiff.outputs.has_breaking_changes == 'true'
uses: peter-evans/create-or-update-comment@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.fc.outputs.comment-id || '' }}
edit-mode: replace
body: |
## ⚠️ Breaking API Changes Detected
This pull request contains breaking API changes that may affect compatibility:
```
${{ env.diff_output }}
```
### Required Actions:
1. Please review these changes carefully
2. Update the user documentation to reflect these API changes
3. Add a note in the changelog about these breaking changes
- name: Create Review
if: steps.apidiff.outputs.has_breaking_changes == 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
await github.rest.pulls.createReview({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number,
event: 'REQUEST_CHANGES',
comments: [{
path: 'README.md',
position: 1,
body: '⚠️ Breaking API changes detected. Please complete the required actions listed in the comment above.'
}],
body: '⚠️ Breaking API changes detected. Please complete the required actions listed in the comment above before merging.'
});