forked from KaBooMa/S1API
-
-
Notifications
You must be signed in to change notification settings - Fork 28
141 lines (123 loc) · 4.15 KB
/
Copy pathpublish-github-release.yml
File metadata and controls
141 lines (123 loc) · 4.15 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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
name: Publish GitHub Release
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
tag:
description: Existing release tag to publish or refresh
required: true
type: string
permissions:
contents: write
jobs:
publish-release:
runs-on: ubuntu-latest
steps:
- name: Resolve release metadata
id: metadata
shell: bash
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
tag="${{ inputs.tag }}"
else
tag="${GITHUB_REF_NAME}"
fi
if [[ -z "$tag" ]]; then
echo "::error::Unable to determine release tag"
exit 1
fi
if [[ ! "$tag" =~ ^v([0-9]+\.[0-9]+\.[0-9]+)(r[0-9]+)?$ ]]; then
echo "::error::Tag '$tag' does not match the expected release format"
exit 1
fi
base_version="${BASH_REMATCH[1]}"
release_name="S1API ${tag#v}"
release_branch="releases/${base_version}"
echo "tag=${tag}" >> "$GITHUB_OUTPUT"
echo "base_version=${base_version}" >> "$GITHUB_OUTPUT"
echo "release_name=${release_name}" >> "$GITHUB_OUTPUT"
echo "release_branch=${release_branch}" >> "$GITHUB_OUTPUT"
- name: Publish or update GitHub release
uses: actions/github-script@v7
env:
RELEASE_TAG: ${{ steps.metadata.outputs.tag }}
RELEASE_NAME: ${{ steps.metadata.outputs.release_name }}
RELEASE_BRANCH: ${{ steps.metadata.outputs.release_branch }}
with:
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const tag = process.env.RELEASE_TAG;
const releaseName = process.env.RELEASE_NAME;
const releaseBranch = process.env.RELEASE_BRANCH;
const resolveTargetCommitish = async () => {
try {
await github.rest.repos.getBranch({
owner,
repo,
branch: releaseBranch
});
return releaseBranch;
} catch (error) {
if (error.status !== 404) {
throw error;
}
}
const ref = await github.rest.git.getRef({
owner,
repo,
ref: `tags/${tag}`
});
let target = ref.data.object;
if (target.type === "tag") {
const annotated = await github.rest.git.getTag({
owner,
repo,
tag_sha: target.sha
});
target = annotated.data.object;
}
return target.sha;
};
const targetCommitish = await resolveTargetCommitish();
const notes = await github.rest.repos.generateReleaseNotes({
owner,
repo,
tag_name: tag,
target_commitish: targetCommitish
});
const payload = {
owner,
repo,
tag_name: tag,
target_commitish: targetCommitish,
name: releaseName,
body: notes.data.body,
draft: false,
prerelease: false,
make_latest: "legacy"
};
let existingRelease = null;
try {
existingRelease = await github.rest.repos.getReleaseByTag({
owner,
repo,
tag
});
} catch (error) {
if (error.status !== 404) {
throw error;
}
}
if (existingRelease) {
const updated = await github.rest.repos.updateRelease({
...payload,
release_id: existingRelease.data.id
});
core.notice(`Updated GitHub release ${updated.data.html_url}`);
return;
}
const created = await github.rest.repos.createRelease(payload);
core.notice(`Published GitHub release ${created.data.html_url}`);