feat: add api compatibility check workflow #99
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |