-
Notifications
You must be signed in to change notification settings - Fork 3
138 lines (121 loc) · 4.13 KB
/
publish.yaml
File metadata and controls
138 lines (121 loc) · 4.13 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
name: Publish Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+*'
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
# This workflow will perform a publish whenever it is triggered
# If you are using a fork, and want to push tags you can disable this workflow in the github ui
jobs:
prepare:
name: Prepare package
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.do-publish.outputs.tag }}
prerelease: ${{ steps.do-publish.outputs.prerelease }}
timeout-minutes: 15
permissions:
contents: write
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js 18.x
uses: actions/setup-node@v6
with:
node-version: 18.x
- name: Enable corepack
run: corepack enable
- name: Determine publish info
id: do-publish
run: |
# If this run was started manually, choose nightly for main and experimental otherwise.
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
echo "Publishing nightly"
echo "tag=nightly" >> $GITHUB_OUTPUT
else
echo "Publishing experimental"
echo "tag=experimental" >> $GITHUB_OUTPUT
fi
HASH=$(git rev-parse --short HEAD)
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
PRERELEASE_TAG=nightly-$(echo "${{ github.ref_name }}" | sed -r 's/[^a-z0-9]+/-/gi')
echo "prerelease=${PRERELEASE_TAG}-${TIMESTAMP}-${HASH}" >> $GITHUB_OUTPUT
else
# Otherwise (push by tag), keep the previous logic: compare published vs package.json
PUBLISHED_VERSION=$(yarn npm info --json . | jq -c '.version' -r)
THIS_VERSION=$(node -p "require('./package.json').version")
# Simple bash helper to compare version numbers
verlte() {
[ "$1" = "`echo -e "$1\n$2" | sort -V | head -n1`" ]
}
verlt() {
[ "$1" = "$2" ] && return 1 || verlte $1 $2
}
if verlt $PUBLISHED_VERSION $THIS_VERSION
then
echo "Publishing latest"
echo "tag=latest" >> $GITHUB_OUTPUT
else
echo "Publishing hotfix"
echo "tag=hotfix" >> $GITHUB_OUTPUT
fi
fi
- name: Prepare build
run: |
yarn install
# Bump to prerelease version if needed
if [ "${{ steps.do-publish.outputs.prerelease }}" != "" ]; then
OLD_VERSION=$(node -p "require('./package.json').version")
yarn version ${OLD_VERSION}-${{ steps.do-publish.outputs.prerelease }}
fi
# yarn build
env:
CI: true
- name: Upload release artifact
uses: actions/upload-artifact@v4
with:
name: publish-dist
path: |
dist
package.json
retention-days: 1
if-no-files-found: error
publish:
name: Publish to NPM
needs:
- prepare
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write # scoped for as short as possible, as this gives write access to npm
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js 24.x
uses: actions/setup-node@v6
with:
node-version: 24.x
- name: Download release artifact
uses: actions/download-artifact@v5
with:
name: publish-dist
- name: Publish to NPM
run: |
corepack enable
yarn install
# Publish from the extracted release (build output present)
yarn npm publish --access=public --provenance --tag ${{ needs.prepare.outputs.tag }}
NEW_VERSION=$(node -p "require('./package.json').version")
echo "**Published:** $NEW_VERSION" >> $GITHUB_STEP_SUMMARY
env:
CI: true