mirror of
https://github.com/alphaXiv/OpenResearch.git
synced 2026-11-12 10:05:24 +08:00
* fix: polish workspace controls and tooltips Assisted-by: gpt-6.1-terra * feat: add desktop update channels Assisted-by: gpt-6.1-terra Assisted-by: gpt-6.1-sol Assisted-by: claude-opus-5.5
436 lines
16 KiB
YAML
436 lines
16 KiB
YAML
# This file was autogenerated by dist: https://axodotdev.github.io/cargo-dist
|
|
#
|
|
# Copyright 2022-2024, axodotdev
|
|
# SPDX-License-Identifier: MIT or Apache-2.0
|
|
#
|
|
# CI that:
|
|
#
|
|
# * checks for a Git Tag that looks like a release
|
|
# * builds artifacts with dist (archives, installers, hashes)
|
|
# * uploads those artifacts to temporary workflow zip
|
|
# * on success, uploads the artifacts to a GitHub Release
|
|
#
|
|
# Note that the GitHub Release will be created with a generated
|
|
# title/body based on your changelogs.
|
|
|
|
name: Release
|
|
permissions:
|
|
"contents": "write"
|
|
|
|
# This task will run whenever you workflow_dispatch with a tag that looks like a version
|
|
# like "1.0.0", "v0.1.0-prerelease.1", "my-app/0.1.0", "releases/v1.0.0", etc.
|
|
# Various formats will be parsed into a VERSION and an optional PACKAGE_NAME, where
|
|
# PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION
|
|
# must be a Cargo-style SemVer Version (must have at least major.minor.patch).
|
|
#
|
|
# If PACKAGE_NAME is specified, then the announcement will be for that
|
|
# package (erroring out if it doesn't have the given version or isn't dist-able).
|
|
#
|
|
# If PACKAGE_NAME isn't specified, then the announcement will be for all
|
|
# (dist-able) packages in the workspace with that version (this mode is
|
|
# intended for workspaces with only one dist-able package, or with all dist-able
|
|
# packages versioned/released in lockstep).
|
|
#
|
|
# If you push multiple tags at once, separate instances of this workflow will
|
|
# spin up, creating an independent announcement for each one. However, GitHub
|
|
# will hard limit this to 3 tags per commit, as it will assume more tags is a
|
|
# mistake.
|
|
#
|
|
# If there's a prerelease-style suffix to the version, then the release(s)
|
|
# will be marked as a prerelease.
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
tag:
|
|
description: Release Tag
|
|
required: true
|
|
type: string
|
|
source-sha:
|
|
description: Merged main commit to release (defaults to this workflow revision)
|
|
required: false
|
|
type: string
|
|
|
|
jobs:
|
|
# Run 'dist plan' (or host) to determine what tasks we need to do
|
|
plan:
|
|
runs-on: "ubuntu-22.04"
|
|
outputs:
|
|
val: ${{ steps.plan.outputs.manifest }}
|
|
source-sha: ${{ steps.source.outputs.sha }}
|
|
tag: ${{ inputs.tag }}
|
|
tag-flag: ${{ format('--tag={0}', inputs.tag) }}
|
|
publishing: "true"
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
persist-credentials: false
|
|
submodules: recursive
|
|
fetch-depth: 0
|
|
ref: ${{ inputs.source-sha || github.sha }}
|
|
- name: Validate the release source
|
|
id: source
|
|
env:
|
|
RELEASE_TAG: ${{ inputs.tag }}
|
|
WORKFLOW_REF: ${{ github.ref }}
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
test "$WORKFLOW_REF" = refs/heads/main
|
|
sha=$(git rev-parse HEAD)
|
|
git merge-base --is-ancestor "$sha" origin/main
|
|
version=$(grep -m1 '^version = ' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
|
|
test "$RELEASE_TAG" = "v$version"
|
|
echo "sha=$sha" >> "$GITHUB_OUTPUT"
|
|
jq -n --arg tag "$RELEASE_TAG" --arg sha "$sha" '{tag: $tag, sha: $sha}' > release-source.json
|
|
- uses: actions/upload-artifact@v7
|
|
with:
|
|
name: release-source
|
|
path: release-source.json
|
|
- name: Install dist
|
|
# we specify bash to get pipefail; it guards against the `curl` command
|
|
# failing. otherwise `sh` won't catch that `curl` returned non-0
|
|
shell: bash
|
|
run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.32.0/cargo-dist-installer.sh | sh"
|
|
- name: Cache dist
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: cargo-dist-cache
|
|
path: ~/.cargo/bin/dist
|
|
- id: plan
|
|
env:
|
|
RELEASE_TAG: ${{ inputs.tag }}
|
|
run: |
|
|
dist host --steps=create --tag="$RELEASE_TAG" --output-format=json > plan-dist-manifest.json
|
|
echo "dist ran successfully"
|
|
cat plan-dist-manifest.json
|
|
echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT"
|
|
- name: "Upload dist-manifest.json"
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: artifacts-plan-dist-manifest
|
|
path: plan-dist-manifest.json
|
|
|
|
build-ui:
|
|
needs: plan
|
|
runs-on: ubuntu-24.04
|
|
permissions:
|
|
contents: read
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
ref: ${{ needs.plan.outputs.source-sha }}
|
|
persist-credentials: false
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 22
|
|
- uses: pnpm/action-setup@v4
|
|
with:
|
|
version: 10
|
|
- name: Prepare release UI
|
|
working-directory: ui
|
|
run: |
|
|
if [ ! -f dist/index.html ]; then
|
|
pnpm install --frozen-lockfile
|
|
pnpm build
|
|
fi
|
|
test -s dist/index.html
|
|
- uses: actions/upload-artifact@v7
|
|
with:
|
|
name: release-ui
|
|
path: ui/dist/
|
|
if-no-files-found: error
|
|
|
|
# Build and packages all the platform-specific things
|
|
build-local-artifacts:
|
|
name: build-local-artifacts (${{ join(matrix.targets, ', ') }})
|
|
# Let the initial task tell us to not run (currently very blunt)
|
|
needs:
|
|
- plan
|
|
- build-ui
|
|
if: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix.include != null }}
|
|
strategy:
|
|
fail-fast: false
|
|
# Target platforms/runners are computed by dist in create-release.
|
|
# Each member of the matrix has the following arguments:
|
|
#
|
|
# - runner: the github runner
|
|
# - dist-args: cli flags to pass to dist
|
|
# - install-dist: expression to run to install dist on the runner
|
|
#
|
|
# Typically there will be:
|
|
# - 1 "global" task that builds universal installers
|
|
# - N "local" tasks that build each platform's binaries and platform-specific installers
|
|
matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }}
|
|
runs-on: ${{ matrix.runner }}
|
|
container: ${{ matrix.container && matrix.container.image || null }}
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json
|
|
steps:
|
|
- name: enable windows longpaths
|
|
run: |
|
|
git config --global core.longpaths true
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
persist-credentials: false
|
|
submodules: recursive
|
|
ref: ${{ needs.plan.outputs.source-sha }}
|
|
- name: Install Rust non-interactively if not already installed
|
|
if: ${{ matrix.container }}
|
|
run: |
|
|
if ! command -v cargo > /dev/null 2>&1; then
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
|
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
fi
|
|
- name: "Mark official release build"
|
|
if: "needs.plan.outputs.publishing == 'true'"
|
|
run: "echo \"ORX_OFFICIAL_RELEASE_BUILD=1\" >> \"$GITHUB_ENV\""
|
|
shell: "bash"
|
|
- name: Install dist
|
|
run: ${{ matrix.install_dist.run }}
|
|
# Get the dist-manifest
|
|
- name: Fetch local artifacts
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
pattern: artifacts-*
|
|
path: target/distrib/
|
|
merge-multiple: true
|
|
- name: Install dependencies
|
|
run: |
|
|
${{ matrix.packages_install }}
|
|
- name: Remove checked-in UI
|
|
shell: bash
|
|
run: rm -rf ui/dist
|
|
- name: Download release UI
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
name: release-ui
|
|
path: ui/dist
|
|
- name: Build artifacts
|
|
run: |
|
|
# Actually do builds and make zips and whatnot
|
|
dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json
|
|
echo "dist ran successfully"
|
|
- id: cargo-dist
|
|
name: Post-build
|
|
# We force bash here just because github makes it really hard to get values up
|
|
# to "real" actions without writing to env-vars, and writing to env-vars has
|
|
# inconsistent syntax between shell and powershell.
|
|
shell: bash
|
|
run: |
|
|
# Parse out what we just built and upload it to scratch storage
|
|
echo "paths<<EOF" >> "$GITHUB_OUTPUT"
|
|
dist print-upload-files-from-manifest --manifest dist-manifest.json >> "$GITHUB_OUTPUT"
|
|
echo "EOF" >> "$GITHUB_OUTPUT"
|
|
|
|
cp dist-manifest.json "$BUILD_MANIFEST_NAME"
|
|
- name: "Upload artifacts"
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: artifacts-build-local-${{ join(matrix.targets, '_') }}
|
|
path: |
|
|
${{ steps.cargo-dist.outputs.paths }}
|
|
${{ env.BUILD_MANIFEST_NAME }}
|
|
|
|
custom-sign-macos-cli:
|
|
needs:
|
|
- plan
|
|
- build-local-artifacts
|
|
uses: ./.github/workflows/sign-macos-cli.yml
|
|
with:
|
|
plan: ${{ needs.plan.outputs.val }}
|
|
secrets: inherit
|
|
|
|
custom-sign-windows-cli:
|
|
needs:
|
|
- plan
|
|
- build-local-artifacts
|
|
permissions:
|
|
contents: read
|
|
id-token: write
|
|
uses: ./.github/workflows/sign-windows-cli.yml
|
|
with:
|
|
plan: ${{ needs.plan.outputs.val }}
|
|
|
|
# Build and package all the platform-agnostic(ish) things
|
|
build-global-artifacts:
|
|
needs:
|
|
- plan
|
|
- build-local-artifacts
|
|
- custom-sign-macos-cli
|
|
- custom-sign-windows-cli
|
|
runs-on: "ubuntu-22.04"
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
persist-credentials: false
|
|
submodules: recursive
|
|
ref: ${{ needs.plan.outputs.source-sha }}
|
|
- name: Install cached dist
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
name: cargo-dist-cache
|
|
path: ~/.cargo/bin/
|
|
- run: chmod +x ~/.cargo/bin/dist
|
|
# Get all the local artifacts for the global tasks to use (for e.g. checksums)
|
|
- name: Fetch local artifacts
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
pattern: artifacts-*
|
|
path: target/distrib/
|
|
merge-multiple: true
|
|
- id: cargo-dist
|
|
shell: bash
|
|
run: |
|
|
dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json
|
|
echo "dist ran successfully"
|
|
|
|
# Parse out what we just built and upload it to scratch storage
|
|
echo "paths<<EOF" >> "$GITHUB_OUTPUT"
|
|
jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT"
|
|
echo "EOF" >> "$GITHUB_OUTPUT"
|
|
|
|
cp dist-manifest.json "$BUILD_MANIFEST_NAME"
|
|
- name: "Upload artifacts"
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: artifacts-build-global
|
|
path: |
|
|
${{ steps.cargo-dist.outputs.paths }}
|
|
${{ env.BUILD_MANIFEST_NAME }}
|
|
|
|
custom-verify-build-channel:
|
|
needs:
|
|
- plan
|
|
- build-local-artifacts
|
|
- custom-sign-macos-cli
|
|
- custom-sign-windows-cli
|
|
uses: ./.github/workflows/verify-build-channel.yml
|
|
with:
|
|
plan: ${{ needs.plan.outputs.val }}
|
|
secrets: inherit
|
|
|
|
custom-telemetry-contract:
|
|
needs:
|
|
- plan
|
|
- build-local-artifacts
|
|
- custom-sign-macos-cli
|
|
- custom-sign-windows-cli
|
|
uses: ./.github/workflows/telemetry-contract.yml
|
|
with:
|
|
plan: ${{ needs.plan.outputs.val }}
|
|
source-sha: ${{ needs.plan.outputs.source-sha }}
|
|
secrets: inherit
|
|
|
|
custom-ci:
|
|
needs:
|
|
- plan
|
|
- build-local-artifacts
|
|
- custom-sign-macos-cli
|
|
- custom-sign-windows-cli
|
|
uses: ./.github/workflows/ci.yml
|
|
with:
|
|
plan: ${{ needs.plan.outputs.val }}
|
|
source-sha: ${{ needs.plan.outputs.source-sha }}
|
|
release: true
|
|
secrets: inherit
|
|
# Determines if we should publish/announce
|
|
host:
|
|
needs:
|
|
- plan
|
|
- build-ui
|
|
- build-local-artifacts
|
|
- custom-sign-macos-cli
|
|
- custom-sign-windows-cli
|
|
- build-global-artifacts
|
|
- custom-verify-build-channel
|
|
- custom-telemetry-contract
|
|
- custom-ci
|
|
permissions:
|
|
contents: write
|
|
issues: read
|
|
pull-requests: read
|
|
# Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine)
|
|
if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && needs.build-ui.result == 'success' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && needs.custom-verify-build-channel.result == 'success' && needs.custom-telemetry-contract.result == 'success' && needs.custom-ci.result == 'success' && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') && (needs.custom-sign-macos-cli.result == 'skipped' || needs.custom-sign-macos-cli.result == 'success') && (needs.custom-sign-windows-cli.result == 'skipped' || needs.custom-sign-windows-cli.result == 'success') }}
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
runs-on: "ubuntu-22.04"
|
|
outputs:
|
|
val: ${{ steps.host.outputs.manifest }}
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
persist-credentials: false
|
|
submodules: recursive
|
|
ref: ${{ needs.plan.outputs.source-sha }}
|
|
fetch-depth: 0
|
|
- name: Install cached dist
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
name: cargo-dist-cache
|
|
path: ~/.cargo/bin/
|
|
- run: chmod +x ~/.cargo/bin/dist
|
|
# Fetch artifacts from scratch-storage
|
|
- name: Fetch artifacts
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
pattern: artifacts-*
|
|
path: target/distrib/
|
|
merge-multiple: true
|
|
- id: host
|
|
shell: bash
|
|
run: |
|
|
dist host ${{ needs.plan.outputs.tag-flag }} --steps=upload --steps=release --output-format=json > dist-manifest.json
|
|
echo "artifacts uploaded and released successfully"
|
|
cat dist-manifest.json
|
|
echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT"
|
|
- name: "Upload dist-manifest.json"
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
# Overwrite the previous copy
|
|
name: artifacts-dist-manifest
|
|
path: dist-manifest.json
|
|
# Create a GitHub Release while uploading all files to it
|
|
- name: "Download GitHub Artifacts"
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
pattern: artifacts-*
|
|
path: artifacts
|
|
merge-multiple: true
|
|
- name: Cleanup
|
|
run: |
|
|
# Remove the granular manifests
|
|
rm -f artifacts/*-dist-manifest.json
|
|
- name: Create GitHub Release
|
|
env:
|
|
PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--prerelease' || '' }}"
|
|
ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}"
|
|
RELEASE_COMMIT: "${{ needs.plan.outputs.source-sha }}"
|
|
run: |
|
|
python3 scripts/release_notes.py "${{ needs.plan.outputs.tag }}" "$RELEASE_COMMIT" "$RUNNER_TEMP/notes.txt"
|
|
git rev-list "$RELEASE_COMMIT" | jq -R -s 'split("\n")[:-1]' > artifacts/desktop-ancestry.json
|
|
gh release create "${{ needs.plan.outputs.tag }}" --target "$RELEASE_COMMIT" $PRERELEASE_FLAG --title "$ANNOUNCEMENT_TITLE" --notes-file "$RUNNER_TEMP/notes.txt" artifacts/*
|
|
|
|
announce:
|
|
needs:
|
|
- plan
|
|
- host
|
|
# use "always() && ..." to allow us to wait for all publish jobs while
|
|
# still allowing individual publish jobs to skip themselves (for prereleases).
|
|
# "host" however must run to completion, no skipping allowed!
|
|
if: ${{ always() && needs.host.result == 'success' }}
|
|
runs-on: "ubuntu-22.04"
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
steps:
|
|
- uses: actions/checkout@v6
|
|
with:
|
|
persist-credentials: false
|
|
submodules: recursive
|
|
ref: ${{ needs.plan.outputs.source-sha }}
|