Skip to content

Commit ce094c9

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

1 file changed

Lines changed: 107 additions & 0 deletions

File tree

.github/workflows/release.yaml

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

0 commit comments

Comments
 (0)