-
Notifications
You must be signed in to change notification settings - Fork 0
/
action.yml
133 lines (112 loc) · 4.04 KB
/
action.yml
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
name: 'ZyAction: Update Semver'
description: A GitHub Action to update floating version tag aliases.
author: Florian Bernd
branding:
icon: arrow-up-circle
color: red
inputs:
tag:
description: >
The name of the target tag or the reference to be used to update the other tags.
Defaults to `GITHUB_REF` if not specified.
type: string
required: false
default: ''
prefix:
description: >
An optional version prefix like e.g. `v` or `release-v`. Defaults to `v`.
type: string
required: false
default: 'v'
update-minor:
description: >
Enable this option to also update minor version tags. Defaults to `false`.
type: boolean
required: false
default: false
ignore-prerelease:
description: >
Enable this option to ignore prerelease versions. Defaults to `true`.
type: boolean
required: false
default: true
runs:
using: composite
steps:
- name: Extract Target Version
id: semver
shell: bash
env:
INPUT_TAG: ${{ inputs.tag }}
INPUT_PREFIX: ${{ inputs.prefix }}
run: |
version="$INPUT_TAG"
if [[ -z "$version" ]]; then
version="$GITHUB_REF"
fi
echo "Target tag name or reference: '$version'"
version="${version#refs/}"
version="${version#tags/}"
version="${version#$INPUT_PREFIX}"
echo "Target version: '$version'"
semvertool="$GITHUB_ACTION_PATH/semver-tool/semver.sh"
status=$("$semvertool" validate "$version")
if [[ "$status" != "valid" ]]; then
echo "::error ::Version '$version' does not match the semver scheme 'X.Y.Z(-PRERELEASE)(+BUILD)'"
exit 1
fi
major=$("$semvertool" get major "$version")
minor=$("$semvertool" get minor "$version")
prerelease=$("$semvertool" get prerelease "$version")
echo "version=$version" >> $GITHUB_OUTPUT
echo "major=$major" >> $GITHUB_OUTPUT
echo "minor=$minor" >> $GITHUB_OUTPUT
echo "prerelease=$prerelease" >> $GITHUB_OUTPUT
- name: Update Version Tags
if: inputs.ignore-prerelease == 'false' || steps.semver.outputs.prerelease == ''
uses: actions/github-script@v6
with:
script: |
async function createOrUpdateTag(name, sha) {
try {
await github.rest.git.updateRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `tags/${name}`,
sha: sha,
force: true
});
} catch (error) {
// API returns '422: Reference does not exist' if the target reference does not exists
if (error.status != 422) {
throw(error);
}
await github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `refs/tags/${name}`,
sha: sha
});
}
}
try {
const targetName = 'tags/${{ inputs.prefix }}${{ steps.semver.outputs.version }}';
const target = await github.rest.git.getRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: targetName
});
const targetHash = target.data.object.sha;
console.log(`Target reference: '${targetName}' (${targetHash})`);
const nameMajor = '${{ inputs.prefix }}${{ steps.semver.outputs.major }}';
await createOrUpdateTag(nameMajor, targetHash);
console.log(`Updated major version tag '${nameMajor}'`);
if (!${{ inputs.update-minor }}) {
return;
}
const nameMinor = '${{ inputs.prefix }}${{ steps.semver.outputs.major }}.${{ steps.semver.outputs.minor }}';
await createOrUpdateTag(nameMinor, targetHash);
console.log(`Updated minor version tag '${nameMinor}'`);
} catch (error) {
core.setFailed(error.message);
}