1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-09 19:36:10 +02:00

githubci: add a workflow for creating GitHub release notes

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@gmail.com>
This commit is contained in:
Mahdi Hosseinzadeh 2021-11-24 17:41:46 +03:30
parent 5f439a0ecf
commit e2cf34363d
2 changed files with 61 additions and 0 deletions

View File

@ -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")

40
.github/workflows/create-release.yml vendored Normal file
View File

@ -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