|
1 | 1 | # Release workflow for BrowserOS Codex binaries. |
2 | 2 | # Builds all distributions without signing. |
3 | | -# To release, run: |
4 | | -# ``` |
5 | | -# git tag -a browseros-v0.1.0 -m "Release 0.1.0" |
6 | | -# git push origin browseros-v0.1.0 |
7 | | -# ``` |
| 3 | +# |
| 4 | +# Two triggers: |
| 5 | +# 1. Automatic (tag push): |
| 6 | +# ``` |
| 7 | +# git tag -a browseros-v0.1.0 -m "Release 0.1.0" |
| 8 | +# git push origin browseros-v0.1.0 |
| 9 | +# ``` |
| 10 | +# |
| 11 | +# 2. Manual (any branch): |
| 12 | +# Go to Actions → release-browseros → "Run workflow" |
8 | 13 |
|
9 | 14 | name: release-browseros |
10 | 15 |
|
11 | 16 | on: |
12 | 17 | push: |
13 | 18 | tags: |
14 | 19 | - "browseros-v*.*.*" |
| 20 | + workflow_dispatch: |
15 | 21 |
|
16 | 22 | concurrency: |
17 | 23 | group: ${{ github.workflow }} |
18 | 24 | cancel-in-progress: true |
19 | 25 |
|
20 | 26 | jobs: |
21 | | - tag-check: |
22 | | - runs-on: ubuntu-latest |
23 | | - steps: |
24 | | - - uses: actions/checkout@v5 |
25 | | - |
26 | | - - name: Validate tag matches Cargo.toml version |
27 | | - shell: bash |
28 | | - run: | |
29 | | - set -euo pipefail |
30 | | - echo "::group::Tag validation" |
31 | | -
|
32 | | - # 1. Must be a tag and match the regex |
33 | | - [[ "${GITHUB_REF_TYPE}" == "tag" ]] \ |
34 | | - || { echo "❌ Not a tag push"; exit 1; } |
35 | | - [[ "${GITHUB_REF_NAME}" =~ ^browseros-v[0-9]+\.[0-9]+\.[0-9]+(-(alpha|beta)(\.[0-9]+)?)?$ ]] \ |
36 | | - || { echo "❌ Tag '${GITHUB_REF_NAME}' doesn't match expected format"; exit 1; } |
37 | | -
|
38 | | - # 2. Extract versions |
39 | | - tag_ver="${GITHUB_REF_NAME#browseros-v}" |
40 | | - cargo_ver="$(grep -m1 '^version' codex-rs/Cargo.toml \ |
41 | | - | sed -E 's/version *= *"([^"]+)".*/\1/')" |
42 | | -
|
43 | | - # 3. Compare |
44 | | - [[ "${tag_ver}" == "${cargo_ver}" ]] \ |
45 | | - || { echo "❌ Tag ${tag_ver} ≠ Cargo.toml ${cargo_ver}"; exit 1; } |
46 | | -
|
47 | | - echo "✅ Tag and Cargo.toml agree (${tag_ver})" |
48 | | - echo "::endgroup::" |
49 | | -
|
50 | 27 | build: |
51 | | - needs: tag-check |
52 | 28 | name: Build - ${{ matrix.runner }} - ${{ matrix.target }} |
53 | 29 | runs-on: ${{ matrix.runner }} |
54 | 30 | timeout-minutes: 30 |
|
79 | 55 |
|
80 | 56 | steps: |
81 | 57 | - uses: actions/checkout@v5 |
| 58 | + |
| 59 | + - name: Validate tag matches Cargo.toml (for tag pushes only) |
| 60 | + if: startsWith(github.ref, 'refs/tags/browseros-v') |
| 61 | + shell: bash |
| 62 | + run: | |
| 63 | + set -euo pipefail |
| 64 | + echo "::group::Tag validation" |
| 65 | +
|
| 66 | + # Extract versions |
| 67 | + tag_ver="${GITHUB_REF_NAME#browseros-v}" |
| 68 | + cargo_ver="$(grep -m1 '^version' Cargo.toml \ |
| 69 | + | sed -E 's/version *= *"([^"]+)".*/\1/')" |
| 70 | +
|
| 71 | + # Validate format |
| 72 | + if ! [[ "${tag_ver}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-(alpha|beta)(\.[0-9]+)?)?$ ]]; then |
| 73 | + echo "❌ Tag '${GITHUB_REF_NAME}' doesn't match expected format" |
| 74 | + exit 1 |
| 75 | + fi |
| 76 | +
|
| 77 | + # Compare versions |
| 78 | + if [[ "${tag_ver}" != "${cargo_ver}" ]]; then |
| 79 | + echo "❌ Tag ${tag_ver} ≠ Cargo.toml ${cargo_ver}" |
| 80 | + exit 1 |
| 81 | + fi |
| 82 | +
|
| 83 | + echo "✅ Tag and Cargo.toml agree (${tag_ver})" |
| 84 | + echo "::endgroup::" |
82 | 85 | - uses: dtolnay/rust-toolchain@1.90 |
83 | 86 | with: |
84 | 87 | targets: ${{ matrix.target }} |
@@ -169,16 +172,33 @@ jobs: |
169 | 172 | - name: List artifacts |
170 | 173 | run: ls -R dist/ |
171 | 174 |
|
172 | | - - name: Define release name |
173 | | - id: release_name |
| 175 | + - name: Define release info |
| 176 | + id: release_info |
| 177 | + shell: bash |
174 | 178 | run: | |
175 | | - version="${GITHUB_REF_NAME#browseros-v}" |
176 | | - echo "name=${version}" >> $GITHUB_OUTPUT |
| 179 | + if [[ "${{ github.ref_type }}" == "tag" ]]; then |
| 180 | + # Tag-based release: extract version from tag |
| 181 | + version="${GITHUB_REF_NAME#browseros-v}" |
| 182 | + release_name="BrowserOS ${version}" |
| 183 | + tag_name="${GITHUB_REF_NAME}" |
| 184 | + is_prerelease=$([[ "${version}" == *"-"* ]] && echo "true" || echo "false") |
| 185 | + else |
| 186 | + # Manual release: use branch and commit |
| 187 | + branch="${GITHUB_REF#refs/heads/}" |
| 188 | + commit="${GITHUB_SHA:0:7}" |
| 189 | + release_name="BrowserOS (${branch} - ${commit})" |
| 190 | + tag_name="browseros-manual-${GITHUB_RUN_ID}" |
| 191 | + is_prerelease="true" |
| 192 | + fi |
| 193 | +
|
| 194 | + echo "name=${release_name}" >> $GITHUB_OUTPUT |
| 195 | + echo "tag=${tag_name}" >> $GITHUB_OUTPUT |
| 196 | + echo "prerelease=${is_prerelease}" >> $GITHUB_OUTPUT |
177 | 197 |
|
178 | 198 | - name: Create GitHub Release |
179 | 199 | uses: softprops/action-gh-release@v2 |
180 | 200 | with: |
181 | | - name: BrowserOS ${{ steps.release_name.outputs.name }} |
182 | | - tag_name: ${{ github.ref_name }} |
| 201 | + name: ${{ steps.release_info.outputs.name }} |
| 202 | + tag_name: ${{ steps.release_info.outputs.tag }} |
183 | 203 | files: dist/** |
184 | | - prerelease: ${{ contains(steps.release_name.outputs.name, '-') }} |
| 204 | + prerelease: ${{ steps.release_info.outputs.prerelease }} |
0 commit comments