Improve summary comments #428
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: Buf action CI | |
on: | |
push: | |
pull_request: | |
branches: | |
- main | |
permissions: | |
contents: read | |
pull-requests: write | |
env: | |
BUF_VERSION: "1.34.0" | |
BUF_MODULE: ${{ vars.BUF_MODULE }} | |
jobs: | |
build: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '20' | |
- name: Build | |
run: | | |
make build | |
- name: Generate | |
run: | | |
make generate | |
- name: Check diff | |
run: | | |
make checkgenerate | |
test-setup: | |
runs-on: ubuntu-latest | |
needs: build | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./ | |
with: | |
setup_only: true | |
- run: buf --version | grep $BUF_VERSION | |
test-setup-latest: | |
runs-on: ubuntu-latest | |
needs: test-setup | |
env: | |
BUF_VERSION: "" # Use the latest version | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./ | |
with: | |
setup_only: true | |
- run: buf --version | |
test-setup-macos: | |
needs: test-setup | |
if: github.event_name == 'push' | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./ | |
with: | |
setup_only: true | |
- run: buf --version | grep $BUF_VERSION | |
test-setup-windows: | |
needs: test-setup | |
if: github.event_name == 'push' | |
runs-on: windows-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./ | |
with: | |
setup_only: true | |
- run: buf --version | Select-String -Pattern $env:BUF_VERSION -CaseSensitive -SimpleMatch | |
test-setup-self-hosted: | |
needs: test-setup | |
# Disable this job, only for testing. | |
if: false | |
runs-on: self-hosted | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./ | |
with: | |
setup_only: true | |
- run: buf --version | grep $BUF_VERSION | |
test-lint: | |
runs-on: ubuntu-latest | |
needs: build | |
steps: | |
- uses: actions/checkout@v4 | |
- run: | | |
mkdir -p proto/test/v1 | |
printf 'version: v2\nmodules:\n - path: proto' > buf.yaml | |
printf 'syntax = "proto3"; package test.v1; message A { string a = 1; }' > proto/test/v1/test.proto | |
- uses: ./ | |
with: | |
lint: true | |
format: false | |
breaking: false | |
push: false | |
archive: false | |
pr_comment: false | |
test-format: | |
runs-on: ubuntu-latest | |
needs: build | |
steps: | |
- uses: actions/checkout@v4 | |
- run: | | |
mkdir -p proto | |
printf 'version: v2\nmodules:\n - path: proto' > buf.yaml | |
printf 'syntax = "proto3";\n\nmessage A {\n string a = 1;\n}\n' > proto/test.proto | |
- uses: ./ | |
with: | |
lint: false | |
format: true | |
breaking: false | |
push: false | |
archive: false | |
pr_comment: false | |
test-breaking: | |
runs-on: ubuntu-latest | |
needs: build | |
steps: | |
- uses: actions/checkout@v4 | |
- run: | | |
mkdir -p proto | |
printf 'version: v2\nmodules:\n - path: proto' > buf.yaml | |
printf 'syntax = "proto3"; message A { string a = 1; }' > proto/test.proto | |
- uses: ./ | |
with: | |
lint: false | |
format: false | |
breaking: true | |
breaking_against: . | |
push: false | |
archive: false | |
pr_comment: false | |
test-comment: | |
runs-on: ubuntu-latest | |
if: github.event_name == 'pull_request' | |
needs: | |
- test-lint | |
- test-format | |
- test-breaking | |
steps: | |
- uses: actions/checkout@v4 | |
- env: | |
BUF_USERNAME: ${{ secrets.BUF_USERNAME }} | |
run: | | |
# Lint skipped, format fails, breaking succeeds | |
mkdir -p proto | |
printf 'version: v2\nmodules:\n - path: proto' > buf.yaml | |
printf 'syntax = "proto3"; message A { string a = 1; }' > proto/test.proto | |
- uses: ./ | |
continue-on-error: true # format fails | |
with: | |
username: ${{ secrets.BUF_USERNAME }} | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false # lint skipped | |
format: true | |
breaking: true | |
breaking_against: . | |
push: false | |
archive: false | |
pr_comment: true | |
- uses: actions/github-script@v7 | |
if: false | |
with: | |
script: | | |
const expectedComment = `The latest Buf updates on your PR. | |
<table><tr><th>Name</th><th>Status</th></tr><tr><td>build</td><td>✅ passed</td></tr><tr><td>lint</td><td>⏩ skipped</td></tr><tr><td>format</td><td>❌ failed</td></tr><tr><td>breaking</td><td>✅ passed</td></tr></table> | |
<!-- Buf results -->` | |
const commentTag = "<!-- Buf results -->"; | |
const { owner, repo } = context.repo; | |
const prNumber = context.payload.pull_request?.number; | |
if (!prNumber) { | |
core.setFailed('No pull request number found.'); | |
return; | |
} | |
const comments = await github.paginate(github.rest.issues.listComments, { | |
owner: owner, | |
repo: repo, | |
issue_number: prNumber, | |
}); | |
const previousComment = comments.find((comment) => | |
comment.body?.includes(commentTag), | |
); | |
if (!previousComment) { | |
core.setFailed('Missing comment on pull request.'); | |
return; | |
} | |
if (!previousComment.body?.includes(expectedComment)) { | |
core.setFailed('Comment does not match expected.'); | |
core.info(`Expected: ${expectedComment}`); | |
core.info(`Comment: ${previousComment.body}`); | |
return; | |
} | |
await github.rest.issues.updateComment({ | |
owner: owner, | |
repo: repo, | |
comment_id: previousComment.id, | |
body: `${previousComment.body}\nNB: This is a test comment.`, | |
}); | |
console.log(await github.graphql(` | |
mutation { | |
minimizeComment(input:{subjectId:"${previousComment.node_id}",classifier:RESOLVED}) { | |
clientMutationId | |
minimizedComment { | |
isMinimized | |
minimizedReason | |
viewerCanMinimize | |
} | |
} | |
} | |
`)) | |
core.info('Updated comment.'); | |
test-push: | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name == 'push' }} # --git-metadata is only available on push | |
needs: build | |
steps: | |
- uses: actions/checkout@v4 | |
- env: | |
BUF_USERNAME: ${{ secrets.BUF_USERNAME }} | |
run: | | |
mkdir -p proto/foo/v1 | |
printf "version: v2\nmodules:\n - path: proto\n name: ${BUF_MODULE}\n" > buf.yaml | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > proto/foo/v1/bar.proto | |
- uses: ./ | |
with: | |
username: ${{ secrets.BUF_USERNAME }} | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: true | |
archive: false | |
pr_comment: false | |
test-push-token-only: | |
needs: build | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name == 'push' }} # --git-metadata is only available on push | |
steps: | |
- uses: actions/checkout@v4 | |
- env: | |
BUF_USERNAME: ${{ secrets.BUF_USERNAME }} | |
run: | | |
mkdir -p proto/foo/v1 | |
printf "version: v2\nmodules:\n - path: proto\n name: ${BUF_MODULE}\n" > buf.yaml | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > proto/foo/v1/bar.proto | |
- uses: ./ | |
with: | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: true | |
archive: false | |
pr_comment: false | |
test-push-unnamed: | |
needs: build | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name == 'push' }} # --git-metadata is only available on push | |
steps: | |
- uses: actions/checkout@v4 | |
# Test v2 buf.yaml config. | |
- run: | | |
mkdir -p proto/foo/v1 | |
printf "version: v2\nmodules:\n - path: proto\n" > buf.yaml | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > proto/foo/v1/bar.proto | |
- uses: ./ | |
with: | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: true | |
archive: false | |
pr_comment: false | |
# Test v1 buf.yaml config. | |
- run: | | |
rm -rf proto | |
mkdir -p proto/foo/v1 | |
printf "version: v1\n" > proto/buf.yaml | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > proto/foo/v1/bar.proto | |
- uses: ./ | |
with: | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: true | |
archive: false | |
pr_comment: false | |
input: proto | |
# Test v2 with multiple modules, one without a name. | |
- env: | |
BUF_USERNAME: ${{ secrets.BUF_USERNAME }} | |
run: | | |
mkdir -p foo/foo/v1 bar/bar/v1 | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > foo/foo/v1/bar.proto | |
printf "syntax = \"proto3\";\npackage bar.v1;\nmessage Foo {}\n" > bar/bar/v1/foo.proto | |
printf "version: v2\nmodules:\n - path: foo\n name: ${BUF_MODULE}\n - path: bar\n" > buf.yaml | |
- uses: ./ | |
with: | |
username: ${{ secrets.BUF_USERNAME }} | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: true | |
archive: false | |
pr_comment: false | |
test-archive: | |
if: github.event_name == 'push' && github.ref_name != github.event.repository.default_branch | |
runs-on: ubuntu-latest | |
needs: | |
- test-push | |
- test-push-token-only | |
- test-push-unnamed | |
steps: | |
- uses: actions/checkout@v4 | |
- env: | |
BUF_USERNAME: ${{ secrets.BUF_USERNAME }} | |
run: | | |
mkdir -p proto/foo/v1 | |
printf "version: v2\nmodules:\n - path: proto\n name: ${BUF_MODULE}\n" > buf.yaml | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > proto/foo/v1/bar.proto | |
- uses: ./ | |
with: | |
username: ${{ secrets.BUF_USERNAME }} | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: false | |
archive: true | |
pr_comment: false | |
test-archive-unnamed: | |
if: github.event_name == 'push' | |
runs-on: ubuntu-latest | |
needs: | |
- test-push | |
- test-push-token-only | |
- test-push-unnamed | |
steps: | |
- uses: actions/checkout@v4 | |
- run: | | |
mkdir -p proto/foo/v1 | |
printf "version: v2\nmodules:\n - path: proto\n" > buf.yaml | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > proto/foo/v1/bar.proto | |
- uses: ./ | |
with: | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: false | |
archive: true | |
pr_comment: false | |
- run: | | |
rm -rf proto | |
mkdir -p proto/foo/v1 | |
printf "version: v1\n" > proto/buf.yaml | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > proto/foo/v1/bar.proto | |
- uses: ./ | |
with: | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: false | |
archive: true | |
pr_comment: false | |
input: proto | |
test-archive-root: | |
# Check the archive command parses non-module names. | |
runs-on: ubuntu-latest | |
needs: | |
- test-archive | |
steps: | |
- uses: actions/checkout@v4 | |
- env: | |
BUF_USERNAME: ${{ secrets.BUF_USERNAME }} | |
run: | | |
mkdir -p foo/v1 | |
printf "version: v2\nname: ${BUF_MODULE}\n" > buf.yaml | |
printf "syntax = \"proto3\";\npackage foo.v1;\nmessage Bar {}\n" > foo/v1/bar.proto | |
- uses: ./ | |
with: | |
username: ${{ secrets.BUF_USERNAME }} | |
token: ${{ secrets.BUF_TOKEN }} | |
lint: false | |
format: false | |
breaking: false | |
push: true # Push to re-create. | |
archive: true # Archive the pushed module. | |
comment: false |