Showing the changes to .github (2 of 49 files). Show all
Unified · Split
| @@ -92,5 +92,8 @@ jobs: · 91 unmodified lines | ||
| 92 | 92 | with: |
| 93 | 93 | node-version-file: package.json |
| 94 | 94 | |
| 95 | + - name: Install dependencies | |
| 96 | + run: bun install --frozen-lockfile | |
| 97 | + | |
| 95 | 98 | - name: Exercise release-only workflow steps |
| 96 | 99 | run: node scripts/release-smoke.ts |
| @@ -1,14 +1,24 @@ | ||
| 1 | −name: Release Desktop | |
| 1 | +name: Release | |
| 2 | 2 | |
| 3 | 3 | on: |
| 4 | 4 | push: |
| 5 | 5 | tags: |
| 6 | 6 | - "v*.*.*" |
| 7 | + schedule: | |
| 8 | + - cron: "0 9 * * *" | |
| 7 | 9 | workflow_dispatch: |
| 8 | 10 | inputs: |
| 11 | + channel: | |
| 12 | + description: "Release channel" | |
| 13 | + required: false | |
| 14 | + default: stable | |
| 15 | + type: choice | |
| 16 | + options: | |
| 17 | + - stable | |
| 18 | + - nightly | |
| 9 | 19 | version: |
| 10 | 20 | description: "Release version (for example 1.2.3 or v1.2.3)" |
| 11 | − required: true | |
| 21 | + required: false | |
| 12 | 22 | type: string |
| 13 | 23 | |
| 14 | 24 | permissions: |
| @@ -21,40 +31,21 @@ jobs: · 6 unmodified lines | ||
| 21 | 31 | runs-on: ubuntu-24.04 |
| 22 | 32 | timeout-minutes: 10 |
| 23 | 33 | outputs: |
| 34 | + release_channel: ${{ steps.release_meta.outputs.release_channel }} | |
| 24 | 35 | version: ${{ steps.release_meta.outputs.version }} |
| 25 | 36 | tag: ${{ steps.release_meta.outputs.tag }} |
| 37 | + release_name: ${{ steps.release_meta.outputs.name }} | |
| 38 | + short_sha: ${{ steps.release_meta.outputs.short_sha }} | |
| 39 | + previous_tag: ${{ steps.previous_tag.outputs.previous_tag }} | |
| 40 | + cli_dist_tag: ${{ steps.release_meta.outputs.cli_dist_tag }} | |
| 26 | 41 | is_prerelease: ${{ steps.release_meta.outputs.is_prerelease }} |
| 27 | 42 | make_latest: ${{ steps.release_meta.outputs.make_latest }} |
| 28 | 43 | ref: ${{ github.sha }} |
| 29 | 44 | steps: |
| 30 | 45 | - name: Checkout |
| 31 | 46 | uses: actions/checkout@v6 |
| 32 | − | |
| 33 | − - id: release_meta | |
| 34 | − name: Resolve release version | |
| 35 | − shell: bash | |
| 36 | − run: | | |
| 37 | − if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]]; then | |
| 38 | − raw="${{ github.event.inputs.version }}" | |
| 39 | − else | |
| 40 | − raw="${GITHUB_REF_NAME}" | |
| 41 | − fi | |
| 42 | − | |
| 43 | − version="${raw#v}" | |
| 44 | − if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]]; then | |
| 45 | − echo "Invalid release version: $raw" >&2 | |
| 46 | − exit 1 | |
| 47 | − fi | |
| 48 | − | |
| 49 | − echo "version=$version" >> "$GITHUB_OUTPUT" | |
| 50 | − echo "tag=v$version" >> "$GITHUB_OUTPUT" | |
| 51 | − if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then | |
| 52 | − echo "is_prerelease=false" >> "$GITHUB_OUTPUT" | |
| 53 | − echo "make_latest=true" >> "$GITHUB_OUTPUT" | |
| 54 | − else | |
| 55 | − echo "is_prerelease=true" >> "$GITHUB_OUTPUT" | |
| 56 | − echo "make_latest=false" >> "$GITHUB_OUTPUT" | |
| 57 | − fi | |
| 47 | + with: | |
| 48 | + fetch-depth: 0 | |
| 58 | 49 | |
| 59 | 50 | - name: Setup Bun |
| 60 | 51 | uses: oven-sh/setup-bun@v2 |
| @@ -69,6 +60,60 @@ jobs: · 8 unmodified lines | ||
| 69 | 60 | - name: Install dependencies |
| 70 | 61 | run: bun install --frozen-lockfile |
| 71 | 62 | |
| 63 | + - id: release_meta | |
| 64 | + name: Resolve release version | |
| 65 | + shell: bash | |
| 66 | + env: | |
| 67 | + DISPATCH_CHANNEL: ${{ github.event.inputs.channel }} | |
| 68 | + DISPATCH_VERSION: ${{ github.event.inputs.version }} | |
| 69 | + NIGHTLY_DATE: ${{ github.run_started_at }} | |
| 70 | + NIGHTLY_SHA: ${{ github.sha }} | |
| 71 | + NIGHTLY_RUN_NUMBER: ${{ github.run_number }} | |
| 72 | + run: | | |
| 73 | + if [[ "${GITHUB_EVENT_NAME}" == "schedule" || ( "${GITHUB_EVENT_NAME}" == "workflow_dispatch" && "${DISPATCH_CHANNEL:-stable}" == "nightly" ) ]]; then | |
| 74 | + nightly_date="$(date -u -d "$NIGHTLY_DATE" +%Y%m%d)" | |
| 75 | + | |
| 76 | + node scripts/resolve-nightly-release.ts \ | |
| 77 | + --date "$nightly_date" \ | |
| 78 | + --run-number "$NIGHTLY_RUN_NUMBER" \ | |
| 79 | + --sha "$NIGHTLY_SHA" \ | |
| 80 | + --github-output | |
| 81 | + | |
| 82 | + echo "release_channel=nightly" >> "$GITHUB_OUTPUT" | |
| 83 | + echo "cli_dist_tag=nightly" >> "$GITHUB_OUTPUT" | |
| 84 | + echo "is_prerelease=true" >> "$GITHUB_OUTPUT" | |
| 85 | + echo "make_latest=false" >> "$GITHUB_OUTPUT" | |
| 86 | + else | |
| 87 | + if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]]; then | |
| 88 | + raw="${DISPATCH_VERSION}" | |
| 89 | + if [[ -z "$raw" ]]; then | |
| 90 | + echo "workflow_dispatch stable releases require the version input." >&2 | |
| 91 | + exit 1 | |
| 92 | + fi | |
| 93 | + else | |
| 94 | + raw="${GITHUB_REF_NAME}" | |
| 95 | + fi | |
| 96 | + | |
| 97 | + version="${raw#v}" | |
| 98 | + if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]]; then | |
| 99 | + echo "Invalid release version: $raw" >&2 | |
| 100 | + exit 1 | |
| 101 | + fi | |
| 102 | + | |
| 103 | + echo "release_channel=stable" >> "$GITHUB_OUTPUT" | |
| 104 | + echo "version=$version" >> "$GITHUB_OUTPUT" | |
| 105 | + echo "tag=v$version" >> "$GITHUB_OUTPUT" | |
| 106 | + echo "name=T3 Code v$version" >> "$GITHUB_OUTPUT" | |
| 107 | + echo "cli_dist_tag=latest" >> "$GITHUB_OUTPUT" | |
| 108 | + if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then | |
| 109 | + echo "is_prerelease=false" >> "$GITHUB_OUTPUT" | |
| 110 | + echo "make_latest=true" >> "$GITHUB_OUTPUT" | |
| 111 | + else | |
| 112 | + echo "is_prerelease=true" >> "$GITHUB_OUTPUT" | |
| 113 | + echo "make_latest=false" >> "$GITHUB_OUTPUT" | |
| 114 | + fi | |
| 115 | + fi | |
| 116 | + | |
| 72 | 117 | - name: Lint |
| 73 | 118 | run: bun run lint |
| 74 | 119 | |
| @@ -78,6 +123,14 @@ jobs: · 3 unmodified lines | ||
| 78 | 123 | - name: Test |
| 79 | 124 | run: bun run test |
| 80 | 125 | |
| 126 | + - id: previous_tag | |
| 127 | + name: Resolve previous release tag | |
| 128 | + run: | | |
| 129 | + node scripts/resolve-previous-release-tag.ts \ | |
| 130 | + --channel "${{ steps.release_meta.outputs.release_channel }}" \ | |
| 131 | + --current-tag "${{ steps.release_meta.outputs.tag }}" \ | |
| 132 | + --github-output | |
| 133 | + | |
| 81 | 134 | build: |
| 82 | 135 | name: Build ${{ matrix.label }} |
| 83 | 136 | needs: preflight |
| @@ -206,16 +259,17 @@ jobs: · 122 unmodified lines | ||
| 206 | 259 | "release/*.AppImage" \ |
| 207 | 260 | "release/*.exe" \ |
| 208 | 261 | "release/*.blockmap" \ |
| 209 | − "release/latest*.yml"; do | |
| 262 | + "release/*.yml"; do | |
| 210 | 263 | for file in $pattern; do |
| 211 | 264 | cp "$file" release-publish/ |
| 212 | 265 | done |
| 213 | 266 | done |
| 214 | 267 | |
| 215 | 268 | if [[ "${{ matrix.platform }}" == "mac" && "${{ matrix.arch }}" != "arm64" ]]; then |
| 216 | − if [[ -f release-publish/latest-mac.yml ]]; then | |
| 217 | − mv release-publish/latest-mac.yml "release-publish/latest-mac-${{ matrix.arch }}.yml" | |
| 218 | − fi | |
| 269 | + shopt -s nullglob | |
| 270 | + for manifest in release-publish/*-mac.yml; do | |
| 271 | + mv "$manifest" "${manifest%.yml}-${{ matrix.arch }}.yml" | |
| 272 | + done | |
| 219 | 273 | fi |
| 220 | 274 | |
| 221 | 275 | - name: Upload build artifacts |
| @@ -257,7 +311,7 @@ jobs: · 35 unmodified lines | ||
| 257 | 311 | run: bun run build --filter=@t3tools/web --filter=t3 |
| 258 | 312 | |
| 259 | 313 | - name: Publish CLI package |
| 260 | − run: node apps/server/scripts/cli.ts publish --tag latest --app-version "${{ needs.preflight.outputs.version }}" --verbose | |
| 314 | + run: node apps/server/scripts/cli.ts publish --tag "${{ needs.preflight.outputs.cli_dist_tag }}" --app-version "${{ needs.preflight.outputs.version }}" --verbose | |
| 261 | 315 | |
| 262 | 316 | release: |
| 263 | 317 | name: Publish GitHub Release |
| @@ -284,17 +338,42 @@ jobs: · 20 unmodified lines | ||
| 284 | 338 | |
| 285 | 339 | - name: Merge macOS updater manifests |
| 286 | 340 | run: | |
| 287 | − node scripts/merge-mac-update-manifests.ts \ | |
| 288 | − release-assets/latest-mac.yml \ | |
| 289 | − release-assets/latest-mac-x64.yml | |
| 290 | − rm -f release-assets/latest-mac-x64.yml | |
| 341 | + shopt -s nullglob | |
| 342 | + for x64_manifest in release-assets/*-mac-x64.yml; do | |
| 343 | + arm64_manifest="${x64_manifest%-x64.yml}.yml" | |
| 344 | + if [[ -f "$arm64_manifest" ]]; then | |
| 345 | + node scripts/merge-mac-update-manifests.ts "$arm64_manifest" "$x64_manifest" | |
| 346 | + rm -f "$x64_manifest" | |
| 347 | + fi | |
| 348 | + done | |
| 291 | 349 | |
| 292 | 350 | - name: Publish release |
| 351 | + if: needs.preflight.outputs.previous_tag != '' | |
| 352 | + uses: softprops/action-gh-release@v2 | |
| 353 | + with: | |
| 354 | + tag_name: ${{ needs.preflight.outputs.tag }} | |
| 355 | + target_commitish: ${{ needs.preflight.outputs.ref }} | |
| 356 | + name: ${{ needs.preflight.outputs.release_name }} | |
| 357 | + generate_release_notes: true | |
| 358 | + previous_tag: ${{ needs.preflight.outputs.previous_tag }} | |
| 359 | + prerelease: ${{ needs.preflight.outputs.is_prerelease }} | |
| 360 | + make_latest: ${{ needs.preflight.outputs.make_latest }} | |
| 361 | + files: | | |
| 362 | + release-assets/*.dmg | |
| 363 | + release-assets/*.zip | |
| 364 | + release-assets/*.AppImage | |
| 365 | + release-assets/*.exe | |
| 366 | + release-assets/*.blockmap | |
| 367 | + release-assets/*.yml | |
| 368 | + fail_on_unmatched_files: true | |
| 369 | + | |
| 370 | + - name: Publish first release | |
| 371 | + if: needs.preflight.outputs.previous_tag == '' | |
| 293 | 372 | uses: softprops/action-gh-release@v2 |
| 294 | 373 | with: |
| 295 | 374 | tag_name: ${{ needs.preflight.outputs.tag }} |
| 296 | 375 | target_commitish: ${{ needs.preflight.outputs.ref }} |
| 297 | − name: T3 Code v${{ needs.preflight.outputs.version }} | |
| 376 | + name: ${{ needs.preflight.outputs.release_name }} | |
| 298 | 377 | generate_release_notes: true |
| 299 | 378 | prerelease: ${{ needs.preflight.outputs.is_prerelease }} |
| 300 | 379 | make_latest: ${{ needs.preflight.outputs.make_latest }} |
| @@ -304,11 +383,12 @@ jobs: · 3 unmodified lines | ||
| 304 | 383 | release-assets/*.AppImage |
| 305 | 384 | release-assets/*.exe |
| 306 | 385 | release-assets/*.blockmap |
| 307 | − release-assets/latest*.yml | |
| 386 | + release-assets/*.yml | |
| 308 | 387 | fail_on_unmatched_files: true |
| 309 | 388 | |
| 310 | 389 | finalize: |
| 311 | 390 | name: Finalize release |
| 391 | + if: needs.preflight.outputs.release_channel == 'stable' | |
| 312 | 392 | needs: [preflight, release] |
| 313 | 393 | runs-on: ubuntu-24.04 |
| 314 | 394 | timeout-minutes: 10 |