Skip to content

Commit d563440

Browse files
committed
Create draft releases in workflow
1 parent 44f9b08 commit d563440

1 file changed

Lines changed: 111 additions & 0 deletions

File tree

.github/workflows/release.yaml

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
name: Create/Update Draft Release
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
jobs:
9+
create-release:
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: write
13+
steps:
14+
- uses: actions/checkout@v4
15+
with:
16+
fetch-depth: 0
17+
18+
- name: Calculate next version
19+
id: next_version
20+
uses: actions/github-script@v7
21+
with:
22+
script: |
23+
// Get latest release
24+
let latestTag = 'v0.0.0';
25+
try {
26+
const release = await github.rest.repos.getLatestRelease({
27+
owner: context.repo.owner,
28+
repo: context.repo.repo,
29+
});
30+
latestTag = release.data.tag_name;
31+
console.log('Latest release:', latestTag);
32+
} catch (error) {
33+
console.log('No releases found, using v0.0.0 as base');
34+
}
35+
36+
// Parse and bump version
37+
const version = latestTag.replace(/^v/, '');
38+
const parts = version.split('.');
39+
const major = parseInt(parts[0]) || 0;
40+
const minor = parseInt(parts[1]) || 0;
41+
42+
// Bump minor version
43+
const nextMinor = minor + 1;
44+
const nextVersion = `v${major}.${nextMinor}.0`;
45+
46+
console.log(`Bumping ${latestTag} to ${nextVersion}`);
47+
core.setOutput('NEXT_VERSION', nextVersion);
48+
49+
- name: Generate release notes from versions.yaml
50+
id: release_notes
51+
uses: actions/github-script@v7
52+
with:
53+
script: |
54+
const fs = require('fs');
55+
const yaml = require('js-yaml');
56+
57+
const versionsContent = fs.readFileSync('versions.yaml', 'utf8');
58+
const versions = yaml.load(versionsContent);
59+
60+
// Get previous versions for comparison
61+
let previousVersions = { charts: {}, buildpacks: {} };
62+
try {
63+
const latestRelease = await github.rest.repos.getLatestRelease({
64+
owner: context.repo.owner,
65+
repo: context.repo.repo,
66+
});
67+
68+
console.log(`Comparing with previous release: ${latestRelease.data.tag_name}`);
69+
70+
const response = await github.rest.repos.getContent({
71+
owner: context.repo.owner,
72+
repo: context.repo.repo,
73+
path: 'versions.yaml',
74+
ref: latestRelease.data.tag_name,
75+
});
76+
77+
const previousContent = Buffer.from(response.data.content, 'base64').toString('utf-8');
78+
previousVersions = yaml.load(previousContent);
79+
} catch (e) {
80+
console.log('Could not fetch previous versions.yaml:', e.message);
81+
}
82+
83+
let releaseNotes = '## Charts\n\n';
84+
releaseNotes += '| Chart | Version |\n';
85+
releaseNotes += '|-------|----------|\n';
86+
87+
for (const [name, data] of Object.entries(versions.charts)) {
88+
const previousVersion = previousVersions.charts?.[name]?.version;
89+
const changed = previousVersion && previousVersion !== data.version ? ' ↑' : '';
90+
releaseNotes += `| ${name}${changed} | ${data.version} |\n`;
91+
}
92+
93+
releaseNotes += '\n## Buildpacks\n\n';
94+
releaseNotes += '| Buildpack | Tag |\n';
95+
releaseNotes += '|-----------|-----|\n';
96+
97+
for (const [name, data] of Object.entries(versions.buildpacks)) {
98+
const previousTag = previousVersions.buildpacks?.[name]?.tag;
99+
const changed = previousTag && previousTag !== data.tag ? ' ↑' : '';
100+
releaseNotes += `| ${name}${changed} | ${data.tag} |\n`;
101+
}
102+
103+
core.setOutput('notes', releaseNotes);
104+
105+
- name: Create or update draft release
106+
uses: softprops/action-gh-release@v1
107+
with:
108+
tag_name: ${{ steps.next_version.outputs.NEXT_VERSION }}
109+
body: ${{ steps.release_notes.outputs.notes }}
110+
draft: true
111+
files: versions.yaml

0 commit comments

Comments
 (0)