Skip to content

Release Notes

There are plenty of automated release notes generator that inspect the list of commits since the last release and generate a list of changes. The release notes are typically exclusively based on the commit messages.

In the GenAIScript projet, we create a release notes generator that uses both commit history and the diff of the changes.

You can see one of the first prototype generated release notes for v1.41.6.

We are excited to announce the release of GenAIScript 1.41.6! 🎉
In this release, we've made some significant improvements to enhance your experience. Here are the key changes:
Improved Release Script: We've fine-tuned our release script to ensure smoother and more efficient releases in the future. 🛠️
...

Commit history and diff

We start our script by calling git a few times to retreive the previous release tag, the list of commits, the diff since the tag. (This magic was mostly found using a GitHub Copilot Chat session).

git-release-notes.genai.js
const { stdout: tag } = await host.exec("git", ["describe", "--tags", "--abbrev=0", "HEAD^",])
const { stdout: commits } = await host.exec("git", ["log", `HEAD...${tag}`,])
const { stdout: diff } = await host.exec("git", ["diff", `${tag}..HEAD`,])

We use the def function with maxTokens to inline this information without exceeding the content window of the model (32k input).

git-release-notes.genai.js
def("COMMITS", commits, { maxTokens: 4000 })
def("DIFF", diff, { maxTokens: 20000 })

Role and task

The rest of the script follows a typical pattern with a role and a task.

$`
You are an expert software developer and release manager.
## Task
Generate a clear, exciting, relevant, useful release notes
for the upcoming release.
- The commits in the release are in COMMITS.
- The diff of the changes are in DIFF.
`

The script

The full script as it is running in GenAIScript is as follows:

git-release-notes.genai.js
script({ system: ["system"], temperature: 0.5, model: "openai:gpt-4-32k" })
const product = env.vars.product || "GenAIScript"
// find previous tag
const pkg = JSON.parse((await workspace.readText("package.json")).content)
const { version } = pkg
const { stdout: tag } = await host.exec("git", [
"describe",
"--tags",
"--abbrev=0",
"HEAD^",
])
const { stdout: commits } = await host.exec("git", [
"log",
"--grep='skip ci'",
"--invert-grep",
"--no-merges",
`HEAD...${tag}`,
])
const { stdout: diff } = await host.exec("git", [
"diff",
`${tag}..HEAD`,
"--no-merges",
"--",
"docs/**",
":!**/package.json",
":!**/genaiscript.d.ts",
":!**/jsconfig.json",
":!.github/*",
":!.vscode/*",
":!yarn.lock",
])
const commitsName = def("COMMITS", commits, { maxTokens: 4000 })
const diffName = def("DIFF", diff, { maxTokens: 20000 })
$`
You are an expert software developer and release manager.
## Task
Generate a clear, exciting, relevant, useful release notes
for the upcoming release ${version} of ${product} on GitHub.
- The commits in the release are in ${commitsName}.
- The diff of the changes are in ${diffName}.
## Guidelines
- only include the most important changes. All changes must be in the commits.
- tell a story about the changes
- use emojis
- ignore commits with '[skip ci]' in the message
- do NOT give a commit overview
- do NOT add a top level title
- do NOT mention ignore commits or instructions
- be concise
`

Release-it integration

GenAIScript uses release-it to automate the release process. We configured release-it to run the script using the cli by adding a github.releaseNotes field in the release-it configuration.

package.json
"release-it": {
"github": {
"releaseNotes": "npx --yes genaiscript run git-release-notes"
}
}