From 69b4b4331b25bcdeca8c71dab825b403f0505de7 Mon Sep 17 00:00:00 2001 From: Adam Bovill Date: Wed, 13 Sep 2023 22:08:03 +0000 Subject: [PATCH] fix(release-notes-preview): add breaking changes doc check This adds a new check that enforces that a breaking changes document has been created. --- .github/workflows/ci.yaml | 2 +- README.md | 6 +- .../README.md | 2 +- lint-release-notes/action.yaml | 162 ++++++++++++++++++ release-notes-preview/action.yaml | 78 --------- 5 files changed, 167 insertions(+), 83 deletions(-) rename {release-notes-preview => lint-release-notes}/README.md (97%) create mode 100644 lint-release-notes/action.yaml delete mode 100644 release-notes-preview/action.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index aff3e8c..c4e53fe 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,7 +11,7 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - - uses: ./release-notes-preview + - uses: ./lint-release-notes with: github-token: ${{ secrets.GITHUB_TOKEN }} lint: diff --git a/README.md b/README.md index 6c45ab1..4143a00 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,13 @@ GitHub Actions for handling releases. ## Actions -### action: [`release-notes-preview`](./release-notes-preview) +### action: [`release-notes-preview`](./lint-release-notes) Automatically generate release notes using semantic-release and post them as a comment in a pull request with the changes that would be included in the next version of the codebase if the pull request is merged. -See usage [here](./release-notes-preview/README.md#usage). +See usage [here](lint-release-notes/README.md#usage). -Documentation is found [here](./release-notes-preview/README.md). +Documentation is found [here](lint-release-notes/README.md). ## Get Help diff --git a/release-notes-preview/README.md b/lint-release-notes/README.md similarity index 97% rename from release-notes-preview/README.md rename to lint-release-notes/README.md index cab9a1a..8e25f44 100644 --- a/release-notes-preview/README.md +++ b/lint-release-notes/README.md @@ -25,7 +25,7 @@ jobs: release-notes: name: Release notes preview steps: - - uses: open-turo/actions-release/release-notes-preview@v1 + - uses: open-turo/actions-release/lint-release-notes@v1 with: github-token: ${{ secrets.GITHUB_TOKEN }} ``` diff --git a/lint-release-notes/action.yaml b/lint-release-notes/action.yaml new file mode 100644 index 0000000..e089869 --- /dev/null +++ b/lint-release-notes/action.yaml @@ -0,0 +1,162 @@ +name: GitHub Action Release Notes Preview +description: GitHub Action that publishes a new release. +inputs: + github-token: + required: true + description: GitHub token that can checkout the repository as well as create tags/releases against it. e.g. 'secrets.GITHUB_TOKEN' + default: ${{ github.token }} + enforce-breaking-changes-docs: + required: false + description: Ensure that an appropriate `v.md` doc has been created if there are breaking changes in the PR. + default: "true" + extra-plugins: + required: false + description: Extra plugins for pre-install. You can also specify specifying version range for the extra plugins if you prefer. Defaults to install @open-turo/semantic-release-config. + default: | + @open-turo/semantic-release-config + semantic-version: + required: false + description: Specify what version of semantic release to use +runs: + using: composite + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Setup tools + uses: open-turo/action-setup-tools@v1 + with: + node: 18.16.1 + - uses: jwalton/gh-find-current-pr@v1 + id: find-pull-request + with: + state: open + - name: Generate release notes + id: release-notes-preview + uses: open-turo/actions-release/semantic-release@add-prerelease-support + env: + GITHUB_TOKEN: ${{ inputs.github-token }} + with: + branches: ${{ github.ref_name }} + dry-run: true + extra-plugins: ${{ inputs.extra-plugins }} + semantic-version: ${{ inputs.semantic-version }} + + # Add release notes preview to PR + - name: Check for release notes comment + uses: peter-evans/find-comment@v2 + id: fc-release-notes + if: steps.find-pull-request.outputs.number != '' + with: + issue-number: ${{ steps.find-pull-request.outputs.number }} + comment-author: "github-actions[bot]" + body-includes: "" + - name: Delete previous release note + if: steps.fc-release-notes.outputs.comment-id != '' + uses: jungwinter/comment@v1 + with: + type: delete + comment_id: ${{ steps.fc-release-notes.outputs.comment-id }} + token: ${{ inputs.github-token }} + - name: Comment release notes preview + uses: peter-evans/create-or-update-comment@v1 + if: steps.release-notes-preview.outputs.new-release-notes != '' && steps.find-pull-request.outputs.number != '' + with: + issue-number: ${{ steps.find-pull-request.outputs.number }} + body: | + ## Release notes preview + Below is a preview of the release notes if your PR gets merged. + + --- + + ${{ steps.release-notes-preview.outputs.new-release-notes }} + - name: Create no release created + uses: peter-evans/create-or-update-comment@v1 + if: steps.release-notes-preview.outputs.new-release-notes == '' && steps.find-pull-request.outputs.number != '' + with: + issue-number: ${{ steps.find-pull-request.outputs.number }} + body: | + + ## Release notes preview + **_No_ new release will be created.** + + If you are expecting a release, you will need to either fix a bug or add a feature. + Chores, CI, docs, refactoring, style and other changes will not trigger a release. + + # Ensure that a breaking changes doc has been created + - name: Check for breaking changes comment + uses: peter-evans/find-comment@v2 + id: fc-breaking-changes + if: steps.find-pull-request.outputs.number != '' + with: + issue-number: ${{ steps.find-pull-request.outputs.number }} + comment-author: "github-actions[bot]" + body-includes: "" + - name: Delete previous breaking changes comment + if: steps.fc-breaking-changes.outputs.comment-id != '' + uses: jungwinter/comment@v1 + with: + type: delete + comment_id: ${{ steps.fc-breaking-changes.outputs.comment-id }} + token: ${{ inputs.github-token }} + - name: "Check File Existence" + id: breaking-changes-file + shell: bash + run: | + set -e + breaking_changes_file_missing=false + if [ "${{ steps.release-notes-preview.outputs.new-release-published }}" = "true" ]; then + echo "new release published" + if [ "${{ steps.release-notes-preview.outputs.new-release-type }}" = "major" ]; then + echo "braking change" + file_path="docs/breaking-changes/v${{ steps.release-notes-preview.outputs.new-release-major-version }}.md" + # Check if the file exists + if [ -e "$file_path" ]; then + echo "breaking change doc $file_path exists." + else + breaking change doc "File $file_path does not exist." + breaking_changes_file_missing=true + fi + fi + fi + echo "required=${breaking_changes_file_missing}" >> $GITHUB_OUTPUT + - name: Comment missing breaking changes doc + uses: peter-evans/create-or-update-comment@v1 + if: steps.breaking-changes-file.outputs.required && inputs.enforce-breaking-changes-docs && steps.find-pull-request.outputs.number != '' + with: + issue-number: ${{ steps.find-pull-request.outputs.number }} + body: | + steps.breaking-changes-file.outputs.required = ${{ steps.breaking-changes-file.outputs.required }} + + ## Error: missing breaking changes documentation + This pull request contains breaking changes, but no documentation has been added to `docs/breaking-changes/v${{ steps.release-notes-preview.outputs.new-release-major-version }}.md`. + +
+ Instructions for creating breaking changes document: + + ```shell + mkdir -p docs/breaking-changes + cat < docs/breaking-changes/v${{ steps.release-notes-preview.outputs.new-release-major-version }}.md + # Breaking changes in v${{ steps.release-notes-preview.outputs.new-release-major-version }} + + [//]: # "Brief description of current major version release scope" + + ## Description of changes + + [//]: # "Elaborate and add context to help the developer understand the changes." + + ## Upgrade instructions + + [//]: # "Required and suggested prerequisites, example code, etc." + + EOF + ``` +
+ + --- + + - name: Fail if we are checking for the breaking changes doc and it is missing + if: steps.breaking-changes-file.outputs.required && inputs.enforce-breaking-changes-docs + shell: bash + run: | + echo "::error::Breaking changes document is missing. Expected: ``docs/breaking-changes/v${{ steps.release-notes-preview.outputs.new-release-major-version }}.md``" diff --git a/release-notes-preview/action.yaml b/release-notes-preview/action.yaml deleted file mode 100644 index d80b929..0000000 --- a/release-notes-preview/action.yaml +++ /dev/null @@ -1,78 +0,0 @@ -name: GitHub Action Release Notes Preview -description: GitHub Action that publishes a new release. -inputs: - github-token: - required: true - description: GitHub token that can checkout the repository as well as create tags/releases against it. e.g. 'secrets.GITHUB_TOKEN' - default: ${{ github.token }} - extra-plugins: - required: false - description: Extra plugins for pre-install. You can also specify specifying version range for the extra plugins if you prefer. Defaults to install @open-turo/semantic-release-config. - default: | - @open-turo/semantic-release-config - semantic-version: - required: false - description: Specify what version of semantic release to use -runs: - using: composite - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Setup tools - uses: open-turo/action-setup-tools@v1 - with: - node: 18.16.1 - - uses: jwalton/gh-find-current-pr@v1 - id: find-pull-request - with: - state: open - - name: Generate release notes - id: release-notes-preview - uses: open-turo/actions-release/semantic-release@v2 - env: - GITHUB_TOKEN: ${{ inputs.github-token }} - with: - branches: ${{ github.ref_name }} - dry-run: true - extra-plugins: ${{ inputs.extra-plugins }} - semantic-version: ${{ inputs.semantic-version }} - - name: Check for release notes comment - uses: peter-evans/find-comment@v2 - id: fc - if: steps.find-pull-request.outputs.number != '' - with: - issue-number: ${{ steps.find-pull-request.outputs.number }} - comment-author: "github-actions[bot]" - body-includes: "" - - name: Delete previous release note - if: steps.fc.outputs.comment-id != '' - uses: jungwinter/comment@v1 - with: - type: delete - comment_id: ${{ steps.fc.outputs.comment-id }} - token: ${{ inputs.github-token }} - - name: Comment release notes preview - uses: peter-evans/create-or-update-comment@v1 - if: steps.release-notes-preview.outputs.new-release-notes != '' && steps.find-pull-request.outputs.number != '' - with: - issue-number: ${{ steps.find-pull-request.outputs.number }} - body: | - ## Release notes preview - Below is a preview of the release notes if your PR gets merged. - - --- - - ${{ steps.release-notes-preview.outputs.new-release-notes }} - - name: Create no release created - uses: peter-evans/create-or-update-comment@v1 - if: steps.release-notes-preview.outputs.new-release-notes == '' && steps.find-pull-request.outputs.number != '' - with: - issue-number: ${{ steps.find-pull-request.outputs.number }} - body: | - - ## Release notes preview - **_No_ new release will be created.** - - If you are expecting a release, you will need to either fix a bug or add a feature. - Chores, CI, docs, refactoring, style and other changes will not trigger a release.