-
Notifications
You must be signed in to change notification settings - Fork 31
148 lines (127 loc) · 5.18 KB
/
release.yml
File metadata and controls
148 lines (127 loc) · 5.18 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
142
143
144
145
146
147
148
name: Release
on:
workflow_dispatch:
inputs:
release_type:
description: 'Release type'
required: true
default: 'dev'
type: choice
options:
- dev
- production
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
release:
name: Release
runs-on: ubuntu-latest
permissions:
id-token: write
contents: write
pull-requests: write
issues: write
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version-file: ".nvmrc"
cache: "yarn"
- name: Update npm to latest
run: npm install -g npm@latest
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Determine release type
id: release-type
run: |
echo "type=${{ github.event.inputs.release_type }}" >> $GITHUB_OUTPUT
echo "Release type: ${{ github.event.inputs.release_type }}"
- name: Get current version
id: current-version
run: |
CURRENT_VERSION=$(node -p "require('./package.json').version")
echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
echo "Current version: $CURRENT_VERSION"
- name: Validate dev version format (dev releases only)
if: steps.release-type.outputs.type == 'dev'
run: |
CURRENT_VERSION="${{ steps.current-version.outputs.current_version }}"
if [[ ! $CURRENT_VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+-(dev|rc[0-9]+)$ ]]; then
echo "Error: For dev releases, package version must be in format MAJOR.MINOR.PATCH-dev or MAJOR.MINOR.PATCH-rc{number}"
echo "Current version is $CURRENT_VERSION"
echo "Please update package.json version to follow the dev format (e.g., 1.0.0-dev or 1.0.0-rc1)"
exit 1
fi
- name: Calculate release version
id: version
run: |
CURRENT_VERSION="${{ steps.current-version.outputs.current_version }}"
RELEASE_TYPE="${{ steps.release-type.outputs.type }}"
if [[ "$RELEASE_TYPE" == "production" ]]; then
# For production, use current version as-is
RELEASE_VERSION="$CURRENT_VERSION"
else
# For dev releases, append commit SHA
SHA=$(git rev-parse --short=7 HEAD)
RELEASE_VERSION="${CURRENT_VERSION}.${SHA}"
fi
echo "release_version=$RELEASE_VERSION" >> $GITHUB_OUTPUT
echo "Release version will be: $RELEASE_VERSION"
- name: Update package.json version
run: |
RELEASE_VERSION="${{ steps.version.outputs.release_version }}"
node -e "
const fs = require('fs');
const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
packageJson.version = '$RELEASE_VERSION';
fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2) + '\n');
"
echo "Updated package.json version to $RELEASE_VERSION"
- name: Build package
run: yarn build
- name: Create Git tag
run: |
RELEASE_VERSION="${{ steps.version.outputs.release_version }}"
RELEASE_TYPE="${{ steps.release-type.outputs.type }}"
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
if [[ "$RELEASE_TYPE" == "production" ]]; then
git tag -a "v$RELEASE_VERSION" -m "Release v$RELEASE_VERSION"
else
git tag -a "v$RELEASE_VERSION" -m "Dev release v$RELEASE_VERSION"
fi
git push https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git "v$RELEASE_VERSION"
- name: Publish to NPM
run: |
RELEASE_TYPE="${{ steps.release-type.outputs.type }}"
if [[ "$RELEASE_TYPE" == "production" ]]; then
echo "Publishing production release..."
npm publish --provenance --access public
else
echo "Publishing development release with prerelease tag..."
npm publish --provenance --access public --tag prerelease
fi
- name: Create GitHub Release
if: steps.release-type.outputs.type == 'production'
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_GH_TOKEN }}
with:
tag_name: v${{ steps.version.outputs.release_version }}
release_name: Release v${{ steps.version.outputs.release_version }}
draft: false
prerelease: false
- name: Create GitHub Pre-release
if: steps.release-type.outputs.type == 'dev'
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_GH_TOKEN }}
with:
tag_name: v${{ steps.version.outputs.release_version }}
release_name: Dev Release v${{ steps.version.outputs.release_version }}
draft: false
prerelease: true