From: Mahdi Hosseinzadeh <mdihosseinzadeh@xxxxxxxxx> GitHub now allows users to subscribe only to "release" notifications of a repository. So, users can be notified of new releases and their changelog/release notes automatically. This workflow works whenever: a new version tag (with the format following the regex "v\d+\..*") is pushed to the repository AND the commit that the tag points to, created/modified a release notes file from Doumentation/RelNotes/ directory. The script for generating the temporary changelog file is written in Kotlin language which can be a much better alternative to shell scripts in terms of features and readability (it is like a python script but with static typing support). The Kotlin runner is pre-installed in GitHub Actions environments; for more information see https://github.com/actions/virtual-environments/ https://stackoverflow.com/a/69116750/8583692 The "Release Notes (yyyy-MM-dd)" link in https://git-scm.com/ website can also link to these GitHub release pages instead of to the raw .txt release note file in the repository. See the issue related to GitHub release notifications: https://github.com/isaacs/github/issues/410 Also see GitHub announcement for this feature: https://github.blog/changelog/2018-11-27-watch-releases/ Signed-off-by: Mahdi Hosseinzadeh <mdihosseinzadeh@xxxxxxxxx> --- Add a workflow for creating GitHub release notes Because this is not directly the git code and is related to GitHub CI, I post it here. This pull request adds a new GitHub Actions workflow that automatically creates releases on GitHub repository when pushing a new tag to the repository. GitHub now allows users to subscribe only to "release" notifications of a repository. So, users can be notified of new releases and their changelog/release notes automatically. This workflow works whenever: a new version tag (with the format following the regex v\d+\..*) is pushed to the repository AND the commit that the tag points to, created/modified a release notes file from Doumentation/RelNotes/ directory. The script for generating the temporary changelog file is written in Kotlin language [https://kotlinlang.org/] which can be a better alternative to shell scripts in terms of features and readability (it is like a python script but with static typing support). The Kotlin runner is pre-installed in GitHub Actions environments; for more information see https://github.com/actions/virtual-environments/ https://stackoverflow.com/a/69116750/8583692 The Release Notes (yyyy-MM-dd) link in https://git-scm.com/ website can also link to these GitHub release pages instead of to the raw .txt release note file in the repository. See the issue related to GitHub release notifications: https://github.com/isaacs/github/issues/410 Also see GitHub announcement for this feature: https://github.blog/changelog/2018-11-27-watch-releases/ Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1146%2Fmahozad%2Fadd-github-releases-workflow-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1146/mahozad/add-github-releases-workflow-v1 Pull-Request: https://github.com/git/git/pull/1146 .../generate-github-changelog.main.kts | 21 ++++++++++ .github/workflows/create-release.yml | 40 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 .github/scripts/generate-github-changelog.main.kts create mode 100644 .github/workflows/create-release.yml diff --git a/.github/scripts/generate-github-changelog.main.kts b/.github/scripts/generate-github-changelog.main.kts new file mode 100644 index 00000000000..e57fd2a6ae5 --- /dev/null +++ b/.github/scripts/generate-github-changelog.main.kts @@ -0,0 +1,21 @@ +#!/usr/bin/env kotlin + +/** + * Copies contents of the release notes file created/modified + * in this commit to a new file to be used by the workflow. + */ + +import java.io.File + +println("Files modified in this commit:") +args.forEachIndexed { index, name -> + println("\t${index + 1}- $name") +} + +val notesFile = args + .map(::File) + .singleOrNull { "RelNotes" in it.parent } + +notesFile + ?.copyTo(File("changelog.txt")) + ?: println("No release notes file modified in this commit") diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 00000000000..711ba105e42 --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,40 @@ +name: Create GH release + +# Create a GitHub release for each new tag. +# The release notes are taken from the release notes file +# modified in that commit located in Documentation/RelNotes directory. + +on: + push: + tags: + - v[0-9]+.* + +permissions: + contents: write + +jobs: + create-gh-release: + name: Create a new release or update an existing release in the GitHub repository + runs-on: ubuntu-latest + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + with: + fetch-depth: 2 # OR '0' To retrieve all preceding commit. + - name: Get changed files + uses: tj-actions/changed-files@v11.7 + id: changed-files + with: + separator: ' ' + - name: Generate the changelog + run: kotlin .github/scripts/generate-github-changelog.main.kts ${{ steps.changed-files.outputs.all_changed_and_modified_files }} + - name: Create the release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref_name }} + release_name: ${{ github.ref_name }} + body_path: changelog.txt + draft: false + prerelease: false base-commit: 5f439a0ecfb4657100ec1e56ef9c6eca963b5a94 -- gitgitgadget