Skip to content

Commit d037c72

Browse files
authored
feat(scripts): add script to generate github releases (#3523)
1 parent 595b2bd commit d037c72

File tree

4 files changed

+108
-1
lines changed

4 files changed

+108
-1
lines changed

.github/workflows/check.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,11 @@ jobs:
621621
env:
622622
GITHUB_TOKEN: ${{ secrets.ALGOLIA_BOT_TOKEN }}
623623

624+
- name: Create GitHub release
625+
run: yarn workspace scripts createGitHubReleases ${{ steps.spreadGeneration.outputs.PUSHED_LANGUAGES }}
626+
env:
627+
GITHUB_TOKEN: ${{ secrets.ALGOLIA_BOT_TOKEN }}
628+
624629
- name: Push generation to the Algolia docs
625630
run: yarn workspace scripts pushToAlgoliaDoc
626631
env:
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/* eslint-disable no-console */
2+
3+
import {
4+
ensureGitHubToken,
5+
getOctokit,
6+
OWNER,
7+
run,
8+
setVerbose,
9+
toAbsolutePath,
10+
} from '../../common';
11+
import { isPreRelease } from '../../release/sla';
12+
import type { Language } from '../../types';
13+
import { cloneRepository } from '../utils';
14+
15+
import { commitStartRelease } from './text';
16+
17+
async function createGitHubRelease(lang: Language): Promise<void> {
18+
// **Full Changelog**:
19+
20+
const githubToken = ensureGitHubToken();
21+
22+
// fetch all release tags for this lang
23+
const { tempGitDir } = await cloneRepository({
24+
lang,
25+
githubToken,
26+
tempDir: process.env.RUNNER_TEMP! || toAbsolutePath('foo/local/test'),
27+
});
28+
await run('git fetch --all --tags', { cwd: tempGitDir });
29+
30+
let tags = (
31+
await run('git describe --abbrev=0 --tags $(git rev-list --tags) --always', { cwd: tempGitDir })
32+
).split('\n');
33+
34+
if (tags.length === 0) {
35+
throw new Error(`unable to find tags for language ${lang}`);
36+
}
37+
38+
const newVersion = tags[0];
39+
const isMajor = newVersion.endsWith('0.0');
40+
let previousVersion = '';
41+
42+
// if we are not on the major, we create a release for the last version, otherwise we get every versions of the pre release
43+
if (!isMajor) {
44+
previousVersion = tags[1];
45+
} else {
46+
tags = tags.filter((tag) => tag.startsWith(newVersion) && isPreRelease(tag));
47+
previousVersion = tags[tags.length - 1];
48+
}
49+
50+
const repository = `algoliasearch-client-${lang}`;
51+
const repositoryLink = `https://github.com/${OWNER}/${repository}`;
52+
const content = `
53+
New ${isMajor ? '**major** ' : ''}version released!
54+
55+
→ [Browse the Algolia documentation](https://www.algolia.com/doc/libraries/${lang})
56+
→ [Browse the changelog](${repositoryLink}/blob/main/CHANGELOG.md)
57+
→ [Browse the commits](${repositoryLink}/compare/${previousVersion}...${newVersion})`;
58+
59+
try {
60+
await getOctokit().repos.createRelease({
61+
owner: OWNER,
62+
repo: repository,
63+
tag_name: newVersion,
64+
name: newVersion,
65+
body: content,
66+
});
67+
68+
console.log(`release for ${lang} created: ${repositoryLink}/releases/tag/${newVersion}`);
69+
} catch (e: any) {
70+
if (e.status === 422) {
71+
console.log(
72+
`release for ${lang} already exist: ${repositoryLink}/releases/tag/${newVersion}`,
73+
);
74+
} else {
75+
throw new Error(e);
76+
}
77+
}
78+
}
79+
80+
async function createGitHubReleases(languagesReleased: Language[]): Promise<void> {
81+
const lastCommitMessage = await run('git log -1 --format="%s"');
82+
83+
if (!lastCommitMessage.startsWith(commitStartRelease)) {
84+
console.log('No release commit found, skipping release generation');
85+
86+
return;
87+
}
88+
89+
await Promise.all(
90+
languagesReleased.map(async (lang) => {
91+
console.log(`> creating GitHub release for ${lang}`);
92+
93+
return await createGitHubRelease(lang);
94+
}),
95+
);
96+
}
97+
98+
if (import.meta.url.endsWith(process.argv[1])) {
99+
setVerbose(false);
100+
createGitHubReleases(process.argv.slice(2) as Language[]);
101+
}

scripts/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"build": "yarn build:cli & yarn build:actions",
77
"build:actions": "cd ci/actions/restore-artifacts && esbuild --bundle --format=cjs --minify --platform=node --outfile=builddir/index.cjs --log-level=error src/index.ts",
88
"build:cli": "esbuild --bundle --format=esm --sourcemap --platform=node --packages=external --outdir=dist --log-level=error cli/index.ts ci/codegen/*.ts ci/githubActions/*.ts",
9+
"createGitHubReleases": "yarn runScript dist/ci/codegen/createGitHubReleases.js",
910
"createMatrix": "yarn runScript dist/ci/githubActions/createMatrix.js",
1011
"lint": "eslint --ext=ts,js,mjs,cjs .",
1112
"lint:deadcode": "knip",

scripts/release/sla.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function getMajorMinor(lang: Language, version: string): { major: number; minor:
2222
return { major: parseInt(matches[1], 10), minor: parseInt(matches[2], 10) };
2323
}
2424

25-
function isPreRelease(version: string): boolean {
25+
export function isPreRelease(version: string): boolean {
2626
return (
2727
version.match(preReleaseRegExp) !== null ||
2828
semver.prerelease(version) !== null ||

0 commit comments

Comments
 (0)