-
Notifications
You must be signed in to change notification settings - Fork 0
137 lines (118 loc) · 4.55 KB
/
Copy pathrelease.yml
File metadata and controls
137 lines (118 loc) · 4.55 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
name: Release CLI
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
release_version:
description: Release version without the leading v
required: true
type: string
jobs:
build-native:
name: Build ${{ matrix.target.rust_target }}
runs-on: ${{ matrix.target.runner }}
strategy:
fail-fast: false
matrix:
target:
- runner: windows-latest
rust_target: x86_64-pc-windows-msvc
binary_name: jucode.exe
- runner: ubuntu-latest
rust_target: x86_64-unknown-linux-gnu
binary_name: jucode
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target.rust_target }}
- name: Build release binary
run: cargo build --release --target ${{ matrix.target.rust_target }}
# Guard against the v0.1.10 incident: the npm package version is stamped
# from the tag / dispatch input, so a binary built from a checkout whose
# Cargo.toml wasn't bumped would ship mislabeled — and its self-update
# check would nag users forever. Fail the release instead.
- name: Verify binary version matches the release version
shell: bash
run: |
if [ "${GITHUB_EVENT_NAME}" = "workflow_dispatch" ]; then
expected="${{ inputs.release_version }}"
else
expected="${GITHUB_REF_NAME#v}"
fi
actual="$(./target/${{ matrix.target.rust_target }}/release/${{ matrix.target.binary_name }} --version | awk '{print $NF}')"
echo "expected=${expected} actual=${actual}"
if [ "${actual}" != "${expected}" ]; then
echo "::error::built binary reports ${actual} but the release is ${expected} — bump Cargo.toml (and commit) before tagging"
exit 1
fi
- name: Stage artifact
shell: bash
run: |
mkdir -p artifacts/${{ matrix.target.rust_target }}
cp target/${{ matrix.target.rust_target }}/release/${{ matrix.target.binary_name }} artifacts/${{ matrix.target.rust_target }}/${{ matrix.target.binary_name }}
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.target.rust_target }}
path: artifacts/${{ matrix.target.rust_target }}/${{ matrix.target.binary_name }}
release:
name: Publish release assets
needs: build-native
runs-on: ubuntu-latest
permissions:
contents: write
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
registry-url: https://registry.npmjs.org/
- uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: false
- name: Resolve release metadata
id: release_meta
shell: bash
run: |
if [ "${GITHUB_EVENT_NAME}" = "workflow_dispatch" ]; then
echo "version=${{ inputs.release_version }}" >> "$GITHUB_OUTPUT"
echo "tag=v${{ inputs.release_version }}" >> "$GITHUB_OUTPUT"
else
echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
echo "tag=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT"
fi
- name: Normalize artifact layout
shell: bash
run: |
mkdir -p artifacts-normalized
for dir in artifacts/*; do
target="$(basename "$dir")"
mkdir -p "artifacts-normalized/$target"
cp "$dir"/* "artifacts-normalized/$target/"
done
- name: Sync npm versions
env:
RELEASE_VERSION: ${{ steps.release_meta.outputs.version }}
run: npm run release:sync-version
- name: Stage npm binaries
run: npm run release:stage-binaries -- --source-root artifacts-normalized --target x86_64-unknown-linux-gnu --target x86_64-pc-windows-msvc
- name: Pack npm packages
run: npm run release:pack -- --target x86_64-unknown-linux-gnu --target x86_64-pc-windows-msvc
- name: Create GitHub release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.release_meta.outputs.tag }}
files: |
artifacts-normalized/**/jucode*
dist/npm/*.tgz
- name: Publish npm packages
if: ${{ env.NODE_AUTH_TOKEN != '' }}
run: |
npm publish ./npm/cli-linux-x64 --access public
npm publish ./npm/cli-win32-x64 --access public
npm publish ./npm/cli --access public