-
Notifications
You must be signed in to change notification settings - Fork 0
94 lines (91 loc) · 3.16 KB
/
Copy pathdraft-release.yml
File metadata and controls
94 lines (91 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
name: Create Release Draft
run-name: Draft Release ${{ inputs.version || github.ref_name }}
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
version:
type: string
description: Release version, without leading "v"
required: true
jobs:
validate:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.script.outputs.version }}
releaseId: ${{ steps.script.outputs.releaseId }}
steps:
- uses: actions/setup-node@v6
with:
node-version: '24' # github-script@v8 uses node 24
- run: npm install semver
- uses: actions/github-script@v8
id: script
env:
VERSION: ${{ inputs.version || github.ref_name }}
with:
result-encoding: string
script: |
const validate = require('semver/functions/valid');
const version = validate(process.env.VERSION);
if (!version) {
core.setFailed(`Version ${process.env.VERSION} is not valid semver`);
}
core.setOutput('version', version);
const { data } = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo,
});
data.forEach(
({ name: n, tag_name: t }) => n !== t && core.warning(`Release name and tag mismatch: ${n} != ${t}`)
)
// TODO check if version is greater than latest release
const releases = data.reduce((acc, { id, name, draft }) => Object.assign(acc, {
[name.replace(/^v/, '')]: { id, name, draft }
}), {});
if (releases[version]) {
if (!releases[version].draft) {
return core.setFailed(`Release ${version} already exists and is published`);
}
core.setOutput('releaseId', releases[version].id);
core.warning(`Release ${version} already exists as draft, will be updated`);
}
draft:
runs-on: ubuntu-latest
permissions:
contents: write
needs: validate
steps:
- uses: actions/checkout@v5
- run: echo > RELEASE_HEAD.md
- uses: CSchoel/release-notes-from-changelog@v1
with:
version: ${{ needs.validate.outputs.version }}
- uses: actions/github-script@v8
env:
VERSION: ${{ needs.validate.outputs.version }}
RELEASE_ID: ${{ needs.validate.outputs.releaseId }}
with:
script: |
const fs = require('fs');
const notes = fs.readFileSync('RELEASE.md', 'utf8');
const releaseInfo = {
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: `v${process.env.VERSION}`,
name: `v${process.env.VERSION}`,
body: notes,
draft: true,
prerelease: false,
}
if (process.env.RELEASE_ID) {
await github.rest.repos.updateRelease(Object.assign(releaseInfo, {
release_id: parseInt(process.env.RELEASE_ID, 10)
}));
core.notice(`Updated existing draft release ${process.env.VERSION}`);
return;
}
await github.rest.repos.createRelease(releaseInfo);
fs.unlinkSync('RELEASE.md');