mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-01-31 23:11:28 +01:00
Add release channels (#385)
## New release flow 1. Run "Bump Version" workflow with the desired version bump and the prerelease flag set to `true`. This will push a new version bump to the target branch and create a new git tag. - See below for more info on how the version bumping works. 2. A new "Build Helper" workflow run will kick off automatically for the new tag. Once it is complete, test the new build locally by downloading with the [download script](https://github.com/wavetermdev/thenextwave/blob/main/scripts/artifacts/download-staged-artifact.sh). 3. Release the new build using the [publish script](https://github.com/wavetermdev/thenextwave/blob/main/scripts/artifacts/publish-from-staging.sh). This will trigger electron-updater to distribute the package to beta users. 4. Run "Bump Version" again with a release bump (either `major`, `minor`, or `patch`) and the prerelease flag set to `false`. 6. Release the new build to all channels using the [publish script](https://github.com/wavetermdev/thenextwave/blob/main/scripts/artifacts/publish-from-staging.sh). This will trigger electron-updater to distribute the package to all users. ## Change Summary Creates a new "Bump Version" workflow to manage versioning and tag creation. Build Helper is now automated. ### Version bumps Updates the `version.cjs` script so that an argument can be passed to trigger a version bump. Under the hood, this utilizes NPM's `semver` package. If arguments are present, the version will be bumped. If only a single argument is given, the following are valid inputs: - `none`: No-op. - `patch`: Bumps the patch version. - `minor`: Bumps the minor version. - `major`: Bumps the major version. - '1', 'true': Bumps the prerelease version. If two arguments are given, the first argument must be either `none`, `patch`, `minor`, or `major`. The second argument must be `1` or `true` to bump the prerelease version. ### electron-builder We are now using the release channels support in electron-builder. This will automatically detect the channel being built based on the package version to determine which channel update files need to be generated. See [here](https://www.electron.build/tutorials/release-using-channels.html) for more information. ### Github Actions #### Bump Version This adds a new "Bump Version" workflow for managing versioning and queuing new builds. When run, this workflow will bump the version, create a new tag, and push the changes to the target branch. There is a new dropdown when queuing the "Bump Version" workflow to select what kind of version bump to perform. A bump must always be performed when running a new build to ensure consistency. I had to create a GitHub App to grant write permissions to our main branch for the version bump commits. I've made a separate workflow file to manage the version bump commits, which should help prevent tampering. Thanks to using the GitHub API directly, I am able to make these commits signed! #### Build Helper Build Helper is now triggered when new tags are created, rather than being triggered automatically. This ensures we're always creating artifacts from known checkpoints. ### Settings Adds a new `autoupdate:channel` configuration to the settings file. If unset, the default from the artifact will be used (should correspond to the channel of the artifact when downloaded). ## Future Work I want to add a release workflow that will automatically copy over the corresponding version artifacts to the release bucket when a new GitHub Release is created. I also want to separate versions into separate subdirectories in the release bucket so we can clean them up more-easily. --------- Co-authored-by: wave-builder <builds@commandline.dev> Co-authored-by: wave-builder[bot] <181805596+wave-builder[bot]@users.noreply.github.com>
This commit is contained in:
parent
0159152c00
commit
5b7535d08f
19
.github/workflows/build-helper.yml
vendored
19
.github/workflows/build-helper.yml
vendored
@ -2,13 +2,19 @@
|
|||||||
# For more information on the macOS signing and notarization, see https://www.electron.build/code-signing and https://www.electron.build/configuration/mac
|
# For more information on the macOS signing and notarization, see https://www.electron.build/code-signing and https://www.electron.build/configuration/mac
|
||||||
# For more information on the Windows Code Signing, see https://docs.digicert.com/en/digicert-keylocker/ci-cd-integrations/plugins/github-custom-action-for-keypair-signing.html and https://docs.digicert.com/en/digicert-keylocker/signing-tools/sign-authenticode-with-electron-builder-using-ksp-integration.html
|
# For more information on the Windows Code Signing, see https://docs.digicert.com/en/digicert-keylocker/ci-cd-integrations/plugins/github-custom-action-for-keypair-signing.html and https://docs.digicert.com/en/digicert-keylocker/signing-tools/sign-authenticode-with-electron-builder-using-ksp-integration.html
|
||||||
|
|
||||||
name: "Build Helper"
|
name: Build Helper
|
||||||
on: workflow_dispatch
|
run-name: Version ${{ github.ref_name }}
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+*"
|
||||||
env:
|
env:
|
||||||
GO_VERSION: "1.22.5"
|
GO_VERSION: "1.22.5"
|
||||||
NODE_VERSION: "22.5.1"
|
NODE_VERSION: "22.5.1"
|
||||||
jobs:
|
jobs:
|
||||||
runbuild:
|
runbuild:
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.set-version.outputs.WAVETERM_VERSION }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
@ -53,7 +59,7 @@ jobs:
|
|||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: ${{env.NODE_VERSION}}
|
node-version: ${{env.NODE_VERSION}}
|
||||||
- name: Install yarn
|
- name: Install Yarn
|
||||||
run: |
|
run: |
|
||||||
corepack enable
|
corepack enable
|
||||||
yarn install
|
yarn install
|
||||||
@ -62,9 +68,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
version: 3.x
|
version: 3.x
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Set Version
|
|
||||||
|
- name: "Set Version"
|
||||||
id: set-version
|
id: set-version
|
||||||
run: echo "WAVETERM_VERSION=$(node "./version.cjs")" >> "$GITHUB_OUTPUT"
|
run: echo "WAVETERM_VERSION=$(task version)" >> "$GITHUB_OUTPUT"
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
# Windows Code Signing Setup
|
# Windows Code Signing Setup
|
||||||
@ -90,7 +97,7 @@ jobs:
|
|||||||
- name: Setup Keylocker KSP (Windows only)
|
- name: Setup Keylocker KSP (Windows only)
|
||||||
if: matrix.platform == 'windows'
|
if: matrix.platform == 'windows'
|
||||||
run: |
|
run: |
|
||||||
curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/Keylockertools-windows-x64.msi/download -H "x-api-key:%SM_API_KEY%" -o Keylockertools-windows-x64.msi
|
curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/Keylockertools-windows-x64.msi/download -H "x-api-key:%SM_API_KEY%" -o Keylockertools-windows-x64.msi
|
||||||
msiexec /i Keylockertools-windows-x64.msi /quiet /qn
|
msiexec /i Keylockertools-windows-x64.msi /quiet /qn
|
||||||
C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user
|
C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user
|
||||||
smctl windows certsync
|
smctl windows certsync
|
||||||
|
52
.github/workflows/bump-version.yml
vendored
52
.github/workflows/bump-version.yml
vendored
@ -1,19 +1,27 @@
|
|||||||
# Workflow to manage bumping the package version and pushing it to the target branch.
|
# Workflow to manage bumping the package version and pushing it to the target branch with a new tag.
|
||||||
|
# This workflow uses a GitHub App to bypass branch protection and uses the GitHub API directly to ensure commits and tags are signed.
|
||||||
|
# For more information, see this doc: https://github.com/Nautilus-Cyberneering/pygithub/blob/main/docs/how_to_sign_automatic_commits_in_github_actions.md
|
||||||
|
|
||||||
name: Bump version
|
name: Bump Version
|
||||||
|
run-name: "branch: ${{ github.ref_name }}; version: ${{ inputs.bump }}; prerelease: ${{ inputs.is-prerelease }}"
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
bump:
|
bump:
|
||||||
description: SemVer Bump
|
description: SemVer Bump
|
||||||
required: true
|
required: true
|
||||||
default: beta
|
|
||||||
type: choice
|
type: choice
|
||||||
|
default: none
|
||||||
options:
|
options:
|
||||||
- beta
|
- none
|
||||||
- patch
|
- patch
|
||||||
- minor
|
- minor
|
||||||
- major
|
- major
|
||||||
|
is-prerelease:
|
||||||
|
description: Is Prerelease
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
env:
|
env:
|
||||||
NODE_VERSION: "22.5.1"
|
NODE_VERSION: "22.5.1"
|
||||||
jobs:
|
jobs:
|
||||||
@ -44,16 +52,32 @@ jobs:
|
|||||||
version: 3.x
|
version: 3.x
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: "Set Version: ${{ inputs.bump }}"
|
- name: "Bump Version: ${{ inputs.bump }}"
|
||||||
id: set-version
|
id: bump-version
|
||||||
run: echo "WAVETERM_VERSION=$(task version:${{ inputs.bump }})" >> "$GITHUB_OUTPUT"
|
run: echo "WAVETERM_VERSION=$( task version -- ${{ inputs.bump }} ${{inputs.is-prerelease}} )" >> "$GITHUB_OUTPUT"
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: "Push version bump: ${{ steps.set-version.outputs.WAVETERM_VERSION }}"
|
- name: "Push version bump: ${{ steps.bump-version.outputs.WAVETERM_VERSION }}"
|
||||||
run: |
|
run: |
|
||||||
git config user.name wave-builder
|
# Create a new commit for the package version bump in package.json
|
||||||
git config user.email builds@commandline.dev
|
export VERSION=${{ steps.bump-version.outputs.WAVETERM_VERSION }}
|
||||||
git add package.json
|
export MESSAGE="chore: bump package version to $VERSION"
|
||||||
git commit -m "Bump version to ${{ steps.set-version.outputs.WAVETERM_VERSION }}"
|
export FILE=package.json
|
||||||
git tag -a ${{ steps.set-version.outputs.WAVETERM_VERSION }} -m "Bump version to ${{ steps.set-version.outputs.WAVETERM_VERSION }}"
|
export BRANCH=${{github.ref_name}}
|
||||||
git push
|
export SHA=$( git rev-parse $BRANCH:$FILE )
|
||||||
|
export CONTENT=$( base64 -i $FILE )
|
||||||
|
gh api --method PUT /repos/:owner/:repo/contents/$FILE \
|
||||||
|
--field branch="$BRANCH" \
|
||||||
|
--field message="$MESSAGE" \
|
||||||
|
--field content="$CONTENT" \
|
||||||
|
--field sha="$SHA"
|
||||||
|
|
||||||
|
# Fetch the new commit and create a tag referencing it
|
||||||
|
git fetch
|
||||||
|
export TAG_SHA=$( git rev-parse origin/$BRANCH )
|
||||||
|
gh api --method POST /repos/:owner/:repo/git/refs \
|
||||||
|
--field ref="refs/tags/$VERSION" \
|
||||||
|
--field sha="$TAG_SHA"
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||||
|
13
Taskfile.yml
13
Taskfile.yml
@ -200,6 +200,19 @@ tasks:
|
|||||||
- frontend/app/store/services.ts
|
- frontend/app/store/services.ts
|
||||||
- frontend/app/store/wshserver.ts
|
- frontend/app/store/wshserver.ts
|
||||||
|
|
||||||
|
version:
|
||||||
|
desc: Get the current package version, or bump version if args are present.
|
||||||
|
summary: |
|
||||||
|
If no arguments are present, the current version will be returned.
|
||||||
|
If only a single argument is given, the following are valid inputs:
|
||||||
|
- `none`: No-op.
|
||||||
|
- `patch`: Bumps the patch version.
|
||||||
|
- `minor`: Bumps the minor version.
|
||||||
|
- `major`: Bumps the major version.
|
||||||
|
- '1', 'true': Bumps the prerelease version.
|
||||||
|
If two arguments are given, the first argument must be either `none`, `patch`, `minor`, or `major`. The second argument must be `1` or `true` to bump the prerelease version.
|
||||||
|
cmd: node version.cjs {{.CLI_ARGS}}
|
||||||
|
|
||||||
yarn:
|
yarn:
|
||||||
desc: Runs `yarn`
|
desc: Runs `yarn`
|
||||||
internal: true
|
internal: true
|
||||||
|
@ -12,6 +12,7 @@ const config = {
|
|||||||
productName: pkg.productName,
|
productName: pkg.productName,
|
||||||
executableName: pkg.name,
|
executableName: pkg.name,
|
||||||
artifactName: "${productName}-${platform}-${arch}-${version}.${ext}",
|
artifactName: "${productName}-${platform}-${arch}-${version}.${ext}",
|
||||||
|
generateUpdatesFilesForAllChannels: true,
|
||||||
npmRebuild: false,
|
npmRebuild: false,
|
||||||
nodeGypRebuild: false,
|
nodeGypRebuild: false,
|
||||||
electronCompile: false,
|
electronCompile: false,
|
||||||
|
@ -29,6 +29,12 @@ export class Updater {
|
|||||||
|
|
||||||
autoUpdater.autoInstallOnAppQuit = settings["autoupdate:installonquit"];
|
autoUpdater.autoInstallOnAppQuit = settings["autoupdate:installonquit"];
|
||||||
|
|
||||||
|
// Only update the release channel if it's specified, otherwise use the one configured in the artifact.
|
||||||
|
const channel = settings["autoupdate:channel"];
|
||||||
|
if (channel) {
|
||||||
|
autoUpdater.channel = channel;
|
||||||
|
}
|
||||||
|
|
||||||
autoUpdater.removeAllListeners();
|
autoUpdater.removeAllListeners();
|
||||||
|
|
||||||
autoUpdater.on("error", (err) => {
|
autoUpdater.on("error", (err) => {
|
||||||
|
1
frontend/types/gotypes.d.ts
vendored
1
frontend/types/gotypes.d.ts
vendored
@ -410,6 +410,7 @@ declare global {
|
|||||||
"autoupdate:enabled"?: boolean;
|
"autoupdate:enabled"?: boolean;
|
||||||
"autoupdate:intervalms"?: number;
|
"autoupdate:intervalms"?: number;
|
||||||
"autoupdate:installonquit"?: boolean;
|
"autoupdate:installonquit"?: boolean;
|
||||||
|
"autoupdate:channel"?: string;
|
||||||
"widget:*"?: boolean;
|
"widget:*"?: boolean;
|
||||||
"widget:showhelp"?: boolean;
|
"widget:showhelp"?: boolean;
|
||||||
"window:*"?: boolean;
|
"window:*"?: boolean;
|
||||||
|
260
package.json
260
package.json
@ -1,131 +1,133 @@
|
|||||||
{
|
{
|
||||||
"name": "thenextwave",
|
"name": "thenextwave",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Command Line Inc",
|
"name": "Command Line Inc",
|
||||||
"email": "info@commandline.dev"
|
"email": "info@commandline.dev"
|
||||||
},
|
},
|
||||||
"productName": "TheNextWave",
|
"productName": "TheNextWave",
|
||||||
"description": "An Open-Source, AI-Native, Terminal Built for Seamless Workflows",
|
"description": "An Open-Source, AI-Native, Terminal Built for Seamless Workflows",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"version": "0.1.12",
|
"version": "0.1.13-beta.20",
|
||||||
"homepage": "https://waveterm.dev",
|
"homepage": "https://waveterm.dev",
|
||||||
"build": {
|
"build": {
|
||||||
"appId": "dev.commandline.thenextwave"
|
"appId": "dev.commandline.thenextwave"
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"main": "./dist/main/index.js",
|
"main": "./dist/main/index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "electron-vite dev",
|
"dev": "electron-vite dev",
|
||||||
"start": "electron-vite preview",
|
"start": "electron-vite preview",
|
||||||
"build:dev": "electron-vite build --mode development",
|
"build:dev": "electron-vite build --mode development",
|
||||||
"build:prod": "electron-vite build --mode production",
|
"build:prod": "electron-vite build --mode production",
|
||||||
"storybook": "storybook dev -p 6006 --no-open",
|
"storybook": "storybook dev -p 6006 --no-open",
|
||||||
"build-storybook": "storybook build",
|
"build-storybook": "storybook build",
|
||||||
"coverage": "vitest run --coverage",
|
"coverage": "vitest run --coverage",
|
||||||
"test": "vitest",
|
"test": "vitest",
|
||||||
"postinstall": "electron-builder install-app-deps"
|
"postinstall": "electron-builder install-app-deps"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@chromatic-com/storybook": "^2.0.2",
|
"@chromatic-com/storybook": "^2.0.2",
|
||||||
"@eslint/js": "^9.10.0",
|
"@eslint/js": "^9.10.0",
|
||||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||||
"@storybook/addon-essentials": "^8.3.0",
|
"@storybook/addon-essentials": "^8.3.0",
|
||||||
"@storybook/addon-interactions": "^8.3.0",
|
"@storybook/addon-interactions": "^8.3.0",
|
||||||
"@storybook/addon-links": "^8.3.0",
|
"@storybook/addon-links": "^8.3.0",
|
||||||
"@storybook/blocks": "^8.3.0",
|
"@storybook/blocks": "^8.3.0",
|
||||||
"@storybook/react": "^8.3.0",
|
"@storybook/react": "^8.3.0",
|
||||||
"@storybook/react-vite": "^8.3.0",
|
"@storybook/react-vite": "^8.3.0",
|
||||||
"@storybook/test": "^8.3.0",
|
"@storybook/test": "^8.3.0",
|
||||||
"@types/css-tree": "^2",
|
"@types/css-tree": "^2",
|
||||||
"@types/debug": "^4",
|
"@types/debug": "^4",
|
||||||
"@types/electron": "^1.6.10",
|
"@types/electron": "^1.6.10",
|
||||||
"@types/node": "^22.5.4",
|
"@types/node": "^22.5.4",
|
||||||
"@types/papaparse": "^5",
|
"@types/papaparse": "^5",
|
||||||
"@types/pngjs": "^6.0.5",
|
"@types/pngjs": "^6.0.5",
|
||||||
"@types/react": "^18.3.5",
|
"@types/react": "^18.3.5",
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.0",
|
||||||
"@types/shell-quote": "^1",
|
"@types/semver": "^7",
|
||||||
"@types/sprintf-js": "^1",
|
"@types/shell-quote": "^1",
|
||||||
"@types/throttle-debounce": "^5",
|
"@types/sprintf-js": "^1",
|
||||||
"@types/tinycolor2": "^1",
|
"@types/throttle-debounce": "^5",
|
||||||
"@types/uuid": "^10.0.0",
|
"@types/tinycolor2": "^1",
|
||||||
"@vitejs/plugin-react-swc": "^3.7.0",
|
"@types/uuid": "^10.0.0",
|
||||||
"@vitest/coverage-istanbul": "^2.1.1",
|
"@vitejs/plugin-react-swc": "^3.7.0",
|
||||||
"electron": "^32.1.0",
|
"@vitest/coverage-istanbul": "^2.1.1",
|
||||||
"electron-builder": "^25.0.5",
|
"electron": "^32.1.0",
|
||||||
"electron-vite": "^2.3.0",
|
"electron-builder": "^25.0.5",
|
||||||
"eslint": "^9.10.0",
|
"electron-vite": "^2.3.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint": "^9.10.0",
|
||||||
"less": "^4.2.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"prettier": "^3.3.3",
|
"less": "^4.2.0",
|
||||||
"prettier-plugin-jsdoc": "^1.3.0",
|
"prettier": "^3.3.3",
|
||||||
"prettier-plugin-organize-imports": "^4.0.0",
|
"prettier-plugin-jsdoc": "^1.3.0",
|
||||||
"rollup-plugin-flow": "^1.1.1",
|
"prettier-plugin-organize-imports": "^4.0.0",
|
||||||
"storybook": "^8.3.0",
|
"rollup-plugin-flow": "^1.1.1",
|
||||||
"ts-node": "^10.9.2",
|
"semver": "^7.6.3",
|
||||||
"tslib": "^2.6.3",
|
"storybook": "^8.3.0",
|
||||||
"tsx": "^4.19.1",
|
"ts-node": "^10.9.2",
|
||||||
"typescript": "^5.6.2",
|
"tslib": "^2.6.3",
|
||||||
"typescript-eslint": "^8.5.0",
|
"tsx": "^4.19.1",
|
||||||
"vite": "^5.4.6",
|
"typescript": "^5.6.2",
|
||||||
"vite-plugin-image-optimizer": "^1.1.8",
|
"typescript-eslint": "^8.5.0",
|
||||||
"vite-plugin-static-copy": "^1.0.6",
|
"vite": "^5.4.6",
|
||||||
"vite-plugin-svgr": "^4.2.0",
|
"vite-plugin-image-optimizer": "^1.1.8",
|
||||||
"vite-tsconfig-paths": "^5.0.1",
|
"vite-plugin-static-copy": "^1.0.6",
|
||||||
"vitest": "^2.1.1"
|
"vite-plugin-svgr": "^4.2.0",
|
||||||
},
|
"vite-tsconfig-paths": "^5.0.1",
|
||||||
"dependencies": {
|
"vitest": "^2.1.1"
|
||||||
"@monaco-editor/loader": "^1.4.0",
|
},
|
||||||
"@monaco-editor/react": "^4.6.0",
|
"dependencies": {
|
||||||
"@observablehq/plot": "^0.6.16",
|
"@monaco-editor/loader": "^1.4.0",
|
||||||
"@react-hook/resize-observer": "^2.0.2",
|
"@monaco-editor/react": "^4.6.0",
|
||||||
"@table-nav/core": "^0.0.7",
|
"@observablehq/plot": "^0.6.16",
|
||||||
"@table-nav/react": "^0.0.7",
|
"@react-hook/resize-observer": "^2.0.2",
|
||||||
"@tanstack/react-table": "^8.20.5",
|
"@table-nav/core": "^0.0.7",
|
||||||
"@types/color": "^3.0.6",
|
"@table-nav/react": "^0.0.7",
|
||||||
"@xterm/addon-fit": "^0.10.0",
|
"@tanstack/react-table": "^8.20.5",
|
||||||
"@xterm/addon-serialize": "^0.13.0",
|
"@types/color": "^3.0.6",
|
||||||
"@xterm/addon-web-links": "^0.11.0",
|
"@xterm/addon-fit": "^0.10.0",
|
||||||
"@xterm/addon-webgl": "^0.18.0",
|
"@xterm/addon-serialize": "^0.13.0",
|
||||||
"@xterm/xterm": "^5.5.0",
|
"@xterm/addon-web-links": "^0.11.0",
|
||||||
"base64-js": "^1.5.1",
|
"@xterm/addon-webgl": "^0.18.0",
|
||||||
"clsx": "^2.1.1",
|
"@xterm/xterm": "^5.5.0",
|
||||||
"color": "^4.2.3",
|
"base64-js": "^1.5.1",
|
||||||
"css-tree": "^3.0.0",
|
"clsx": "^2.1.1",
|
||||||
"dayjs": "^1.11.13",
|
"color": "^4.2.3",
|
||||||
"debug": "^4.3.7",
|
"css-tree": "^3.0.0",
|
||||||
"electron-updater": "6.3.4",
|
"dayjs": "^1.11.13",
|
||||||
"fast-average-color": "^9.4.0",
|
"debug": "^4.3.7",
|
||||||
"htl": "^0.3.1",
|
"electron-updater": "6.3.4",
|
||||||
"html-to-image": "^1.11.11",
|
"fast-average-color": "^9.4.0",
|
||||||
"immer": "^10.1.1",
|
"htl": "^0.3.1",
|
||||||
"jotai": "^2.9.3",
|
"html-to-image": "^1.11.11",
|
||||||
"monaco-editor": "^0.51.0",
|
"immer": "^10.1.1",
|
||||||
"overlayscrollbars": "^2.10.0",
|
"jotai": "^2.9.3",
|
||||||
"overlayscrollbars-react": "^0.5.6",
|
"monaco-editor": "^0.51.0",
|
||||||
"papaparse": "^5.4.1",
|
"overlayscrollbars": "^2.10.0",
|
||||||
"pngjs": "^7.0.0",
|
"overlayscrollbars-react": "^0.5.6",
|
||||||
"react": "^18.3.1",
|
"papaparse": "^5.4.1",
|
||||||
"react-dnd": "^16.0.1",
|
"pngjs": "^7.0.0",
|
||||||
"react-dnd-html5-backend": "^16.0.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dnd": "^16.0.1",
|
||||||
"react-frame-component": "^5.2.7",
|
"react-dnd-html5-backend": "^16.0.1",
|
||||||
"react-gauge-chart": "^0.5.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-markdown": "^9.0.1",
|
"react-frame-component": "^5.2.7",
|
||||||
"rehype-highlight": "^7.0.0",
|
"react-gauge-chart": "^0.5.1",
|
||||||
"rehype-raw": "^7.0.0",
|
"react-markdown": "^9.0.1",
|
||||||
"rehype-sanitize": "^6.0.0",
|
"rehype-highlight": "^7.0.0",
|
||||||
"rehype-slug": "^6.0.0",
|
"rehype-raw": "^7.0.0",
|
||||||
"remark-flexible-toc": "^1.1.1",
|
"rehype-sanitize": "^6.0.0",
|
||||||
"remark-gfm": "^4.0.0",
|
"rehype-slug": "^6.0.0",
|
||||||
"rxjs": "^7.8.1",
|
"remark-flexible-toc": "^1.1.1",
|
||||||
"shell-quote": "^1.8.1",
|
"remark-gfm": "^4.0.0",
|
||||||
"sprintf-js": "^1.1.3",
|
"rxjs": "^7.8.1",
|
||||||
"throttle-debounce": "^5.0.2",
|
"shell-quote": "^1.8.1",
|
||||||
"tinycolor2": "^1.6.0",
|
"sprintf-js": "^1.1.3",
|
||||||
"use-device-pixel-ratio": "^1.1.2",
|
"throttle-debounce": "^5.0.2",
|
||||||
"winston": "^3.14.2"
|
"tinycolor2": "^1.6.0",
|
||||||
},
|
"use-device-pixel-ratio": "^1.1.2",
|
||||||
"packageManager": "yarn@4.4.1"
|
"winston": "^3.14.2"
|
||||||
|
},
|
||||||
|
"packageManager": "yarn@4.4.1"
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ const (
|
|||||||
ConfigKey_AutoUpdateEnabled = "autoupdate:enabled"
|
ConfigKey_AutoUpdateEnabled = "autoupdate:enabled"
|
||||||
ConfigKey_AutoUpdateIntervalMs = "autoupdate:intervalms"
|
ConfigKey_AutoUpdateIntervalMs = "autoupdate:intervalms"
|
||||||
ConfigKey_AutoUpdateInstallOnQuit = "autoupdate:installonquit"
|
ConfigKey_AutoUpdateInstallOnQuit = "autoupdate:installonquit"
|
||||||
|
ConfigKey_AutoUpdateChannel = "autoupdate:channel"
|
||||||
|
|
||||||
ConfigKey_WidgetClear = "widget:*"
|
ConfigKey_WidgetClear = "widget:*"
|
||||||
ConfigKey_WidgetShowHelp = "widget:showhelp"
|
ConfigKey_WidgetShowHelp = "widget:showhelp"
|
||||||
|
@ -64,6 +64,7 @@ type SettingsType struct {
|
|||||||
AutoUpdateEnabled bool `json:"autoupdate:enabled,omitempty"`
|
AutoUpdateEnabled bool `json:"autoupdate:enabled,omitempty"`
|
||||||
AutoUpdateIntervalMs float64 `json:"autoupdate:intervalms,omitempty"`
|
AutoUpdateIntervalMs float64 `json:"autoupdate:intervalms,omitempty"`
|
||||||
AutoUpdateInstallOnQuit bool `json:"autoupdate:installonquit,omitempty"`
|
AutoUpdateInstallOnQuit bool `json:"autoupdate:installonquit,omitempty"`
|
||||||
|
AutoUpdateChannel string `json:"autoupdate:channel,omitempty"`
|
||||||
|
|
||||||
WidgetClear bool `json:"widget:*,omitempty"`
|
WidgetClear bool `json:"widget:*,omitempty"`
|
||||||
WidgetShowHelp bool `json:"widget:showhelp,omitempty"`
|
WidgetShowHelp bool `json:"widget:showhelp,omitempty"`
|
||||||
|
@ -1,9 +1,18 @@
|
|||||||
# Building for release
|
# Building for release
|
||||||
|
|
||||||
|
## Bump Version workflow
|
||||||
|
|
||||||
|
All releases start by first bumping the package version and creating a new Git tag. We have a workflow set up to automate this.
|
||||||
|
|
||||||
|
To run it, trigger a new run of the [Bump Version workflow](https://github.com/wavetermdev/thenextwave/actions/workflows/bump-version.yml). When triggering the run, you will be
|
||||||
|
prompted to select a version bump type, either `none`, `patch`, `minor`, or `major`, and whether the version is prerelease or not. This determines how much the version number is incremented.
|
||||||
|
See [`version.cjs`](../../version.cjs) for more details on how this works.
|
||||||
|
|
||||||
|
Once the tag has been created, a new [Build Helper](#build-helper-workflow) run will be automatically queued to generate the artifacts.
|
||||||
|
|
||||||
## Build Helper workflow
|
## Build Helper workflow
|
||||||
|
|
||||||
Our release builds are managed by the "Build Helper" GitHub Action, which is defined
|
Our release builds are managed by the [Build Helper workflow](https://github.com/wavetermdev/thenextwave/actions/workflows/build-helper.yml).
|
||||||
in [`build-helper.yml`](../../.github/workflows/build-helper.yml).
|
|
||||||
|
|
||||||
Under the hood, this will call the `package` task in
|
Under the hood, this will call the `package` task in
|
||||||
[`Taskfile.yml`](../../Taskfile.yml), which will build the Electron codebase using
|
[`Taskfile.yml`](../../Taskfile.yml), which will build the Electron codebase using
|
||||||
@ -34,6 +43,11 @@ With each release, `latest-mac.yml`, `latest-linux.yml`, and `latest-linux-arm64
|
|||||||
newest release. These also include file sizes and checksums to aid in validating the packages. The app
|
newest release. These also include file sizes and checksums to aid in validating the packages. The app
|
||||||
will check these files in our S3 bucket every hour to see if a new version is available.
|
will check these files in our S3 bucket every hour to see if a new version is available.
|
||||||
|
|
||||||
|
### Update channels
|
||||||
|
|
||||||
|
We utilize update channels to roll out beta and stable releases. These are determined based on the package versioning [described above](#bump-version-workflow). Users can
|
||||||
|
select their update channel using the `autoupdate:channel` setting in Wave. See [here](https://www.electron.build/tutorials/release-using-channels.html) for more information.
|
||||||
|
|
||||||
### Homebrew
|
### Homebrew
|
||||||
|
|
||||||
Homebrew is automatically bumped when new artifacts are published.
|
Homebrew is automatically bumped when new artifacts are published.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
# Takes a release from our staging bucket and publishes it to the public download bucket.
|
# Takes a release from our staging bucket and publishes it to the public download bucket.
|
||||||
# Usage: publish-from-staging.sh <version> <aws-profile>
|
# Usage: publish-from-staging.sh <version> <aws-profile>
|
||||||
# Example: publish-from-staging.sh 0.1.0 storage
|
# Example: publish-from-staging.sh 0.1.0 storage
|
||||||
|
52
version.cjs
52
version.cjs
@ -1,9 +1,57 @@
|
|||||||
|
/**
|
||||||
|
* Script to get the current package version and bump the version, if specified.
|
||||||
|
*
|
||||||
|
* If no arguments are present, the current version will returned.
|
||||||
|
* If only a single argument is given, the following are valid inputs:
|
||||||
|
* - `none`: No-op.
|
||||||
|
* - `patch`: Bumps the patch version.
|
||||||
|
* - `minor`: Bumps the minor version.
|
||||||
|
* - `major`: Bumps the major version.
|
||||||
|
* - '1', 'true': Bumps the prerelease version.
|
||||||
|
* If two arguments are given, the first argument must be either `none`, `patch`, `minor`, or `major`. The second argument must be `1` or `true` to bump the prerelease version.
|
||||||
|
*/
|
||||||
|
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const packageJson = require(path.resolve(__dirname, "package.json"));
|
const packageJsonPath = path.resolve(__dirname, "package.json");
|
||||||
|
const packageJson = require(packageJsonPath);
|
||||||
|
|
||||||
const VERSION = `${packageJson.version}`;
|
const VERSION = `${packageJson.version}`;
|
||||||
module.exports = VERSION;
|
module.exports = VERSION;
|
||||||
|
|
||||||
if (typeof require !== "undefined" && require.main === module) {
|
if (typeof require !== "undefined" && require.main === module) {
|
||||||
console.log(VERSION);
|
if (process.argv.length > 2) {
|
||||||
|
const fs = require("fs");
|
||||||
|
const semver = require("semver");
|
||||||
|
|
||||||
|
const action = process.argv[2];
|
||||||
|
const isPrerelease =
|
||||||
|
process.argv.length > 3
|
||||||
|
? process.argv[3] === "true" || process.argv[3] === "1"
|
||||||
|
: action === "true" || action === "1";
|
||||||
|
let newVersion = packageJson.version;
|
||||||
|
switch (action) {
|
||||||
|
case "major":
|
||||||
|
case "minor":
|
||||||
|
case "patch":
|
||||||
|
newVersion = semver.inc(
|
||||||
|
VERSION,
|
||||||
|
`${isPrerelease ? "pre" : ""}${action}`,
|
||||||
|
null,
|
||||||
|
isPrerelease ? "beta" : null
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case "none":
|
||||||
|
case "true":
|
||||||
|
case "1":
|
||||||
|
if (isPrerelease) newVersion = semver.inc(VERSION, "prerelease", null, "beta");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(`Unknown action ${action}`);
|
||||||
|
}
|
||||||
|
packageJson.version = newVersion;
|
||||||
|
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 4) + "\n");
|
||||||
|
console.log(newVersion);
|
||||||
|
} else {
|
||||||
|
console.log(VERSION);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2496,6 +2496,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/semver@npm:^7":
|
||||||
|
version: 7.5.8
|
||||||
|
resolution: "@types/semver@npm:7.5.8"
|
||||||
|
checksum: 10c0/8663ff927234d1c5fcc04b33062cb2b9fcfbe0f5f351ed26c4d1e1581657deebd506b41ff7fdf89e787e3d33ce05854bc01686379b89e9c49b564c4cfa988efa
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@types/send@npm:*":
|
"@types/send@npm:*":
|
||||||
version: 0.17.4
|
version: 0.17.4
|
||||||
resolution: "@types/send@npm:0.17.4"
|
resolution: "@types/send@npm:0.17.4"
|
||||||
@ -10208,6 +10215,7 @@ __metadata:
|
|||||||
"@types/pngjs": "npm:^6.0.5"
|
"@types/pngjs": "npm:^6.0.5"
|
||||||
"@types/react": "npm:^18.3.5"
|
"@types/react": "npm:^18.3.5"
|
||||||
"@types/react-dom": "npm:^18.3.0"
|
"@types/react-dom": "npm:^18.3.0"
|
||||||
|
"@types/semver": "npm:^7"
|
||||||
"@types/shell-quote": "npm:^1"
|
"@types/shell-quote": "npm:^1"
|
||||||
"@types/sprintf-js": "npm:^1"
|
"@types/sprintf-js": "npm:^1"
|
||||||
"@types/throttle-debounce": "npm:^5"
|
"@types/throttle-debounce": "npm:^5"
|
||||||
@ -10261,6 +10269,7 @@ __metadata:
|
|||||||
remark-gfm: "npm:^4.0.0"
|
remark-gfm: "npm:^4.0.0"
|
||||||
rollup-plugin-flow: "npm:^1.1.1"
|
rollup-plugin-flow: "npm:^1.1.1"
|
||||||
rxjs: "npm:^7.8.1"
|
rxjs: "npm:^7.8.1"
|
||||||
|
semver: "npm:^7.6.3"
|
||||||
shell-quote: "npm:^1.8.1"
|
shell-quote: "npm:^1.8.1"
|
||||||
sprintf-js: "npm:^1.1.3"
|
sprintf-js: "npm:^1.1.3"
|
||||||
storybook: "npm:^8.3.0"
|
storybook: "npm:^8.3.0"
|
||||||
|
Loading…
Reference in New Issue
Block a user