git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Mahdi Hosseinzadeh via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Mahdi Hosseinzadeh <mdihosseinzadeh@gmail.com>,
	Mahdi Hosseinzadeh <mdihosseinzadeh@gmail.com>
Subject: [PATCH] githubci: add a workflow for creating GitHub release notes
Date: Thu, 25 Nov 2021 11:36:56 +0000	[thread overview]
Message-ID: <pull.1146.git.git.1637840216877.gitgitgadget@gmail.com> (raw)

From: Mahdi Hosseinzadeh <mdihosseinzadeh@gmail.com>

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

             reply	other threads:[~2021-11-25 11:41 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-25 11:36 Mahdi Hosseinzadeh via GitGitGadget [this message]
2021-11-25 20:57 ` [PATCH] githubci: add a workflow for creating GitHub release notes Matthias Aßhauer
2021-11-26 13:59   ` Johannes Schindelin
2021-11-26 17:37     ` Matthias Aßhauer
2021-11-29 12:49       ` Ævar Arnfjörð Bjarmason
2021-11-30 11:46         ` Johannes Schindelin
2021-12-02 19:05           ` Junio C Hamano
2021-12-03  8:33             ` Fabian Stelzer
2021-12-05  1:25               ` Junio C Hamano
2021-12-05 10:54                 ` Fabian Stelzer
2021-12-07  0:05                   ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=pull.1146.git.git.1637840216877.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=mdihosseinzadeh@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).