Aller au contenu

Notes de version

AI generated translation.

Il existe de nombreux générateurs automatisés de notes de version qui examinent la liste des commits depuis la dernière version et génèrent une liste de modifications. Les notes de version sont généralement basées exclusivement sur les messages de commit.

Dans le projet GenAIScript, nous créons un générateur de notes de version qui utilise à la fois l’historique des commits et le diff des modifications.

Vous pouvez voir l’une des premières notes de version générées par prototype pour 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. 🛠️
...

Nous commençons notre script en appelant git plusieurs fois pour récupérer le tag de la version précédente, la liste des commits, et le diff depuis ce tag. (Cette astuce a principalement été trouvée lors d’une session GitHub Copilot Chat).

git-release-notes.genai.mjs
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`,
);

Nous utilisons la fonction def avec maxTokens pour intégrer ces informations sans dépasser la fenêtre de contenu du modèle (entrée de 32k).

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

Le reste du script suit un schéma typique avec un rôle et une tâche.

$`
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.
`;

Le script complet tel qu’il s’exécute dans GenAIScript est le suivant :

git-release-notes.genai.mjs
script({
system: ["system"],
temperature: 0.5,
model: "github:openai/gpt-4o",
});
const product = env.vars.product || "GenAIScript";
// find previous tag
const { version } = await workspace.readJSON("package.json");
const tag = await git.lastTag();
const excludedPaths = [
"package.json",
"**/package.json",
"yarn.lock",
"**/yarn.lock",
"**/genaiscript.d.ts",
"**/jsconfig.json",
"docs/**",
".github/*",
".vscode/*",
"slides/**",
"THIRD_PARTY_LICENSES.md",
];
const commits = (
await git.log({
excludedGrep: "(skip ci|THIRD_PARTY_NOTICES|THIRD_PARTY_LICENSES|genai)",
base: tag,
head: "HEAD",
excludedPaths,
})
)
.map(({ message }) => message)
.join("\n");
console.debug(commits.slice(0, 50) + "...");
const diff = await git.diff({
base: tag,
head: "HEAD",
excludedPaths,
});
console.debug(diff.slice(0, 1000) + "...");
const commitsName = def("COMMITS", commits, {
ignoreEmpty: true,
maxTokens: 3000,
});
const diffName = def("DIFF", diff, { maxTokens: 12000 });
$`
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
- do not wrap text in markdown section
`;

GenAIScript utilise release-it pour automatiser le processus de publication. Nous avons configuré release-it pour exécuter le script à l’aide du cli en ajoutant un champ github.releaseNotes dans la configuration de release-it.

package.json
"release-it": {
"github": {
"releaseNotes": "node packages/cli/dist/src/index.js run git-release-notes --cache --cache-name releases --no-run-trace --no-output-trace"
}
}