chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
# CONTRIBUTING
|
||||
|
||||
> First off, thank you for considering contributing to electerm.
|
||||
|
||||
> electerm is an open source project and I love to receive contributions from our community — you! There are many ways to contribute, from writing tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be incorporated into electerm itself.
|
||||
|
||||
> Working on your first Pull Request? You can learn how from this *free* series, [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).
|
||||
|
||||
Basic process:
|
||||
|
||||
> 1. Create your own fork of the code
|
||||
> 2. Do the changes in your fork
|
||||
> 3. If you like the change and think the project could use it:
|
||||
* Be sure you have followed the code style for the project by running `npm run lint`.
|
||||
* Send a pull request
|
||||
|
||||
> Want to report a issue or give some suggestions?
|
||||
[Submit a issue](https://github.com/electerm/electerm/issues/new)
|
||||
@@ -0,0 +1,3 @@
|
||||
github: electerm
|
||||
ko_fi: zhaoxudong
|
||||
custom: https://paypal.me/zhaoxudongPS
|
||||
@@ -0,0 +1 @@
|
||||
## 👉 [Please follow one of these issue templates](https://github.com/electerm/electerm/issues/new/choose) 👈
|
||||
@@ -0,0 +1,62 @@
|
||||
name: "\U0001F41B Bug report(提交bug)"
|
||||
description: Create a report to help us improve
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thank you for reporting an issue.
|
||||
|
||||
This issue tracker is for bugs and issues found within Electerm.
|
||||
If you require more general support please start a discussion on our discussion board https://github.com/electerm/electerm/discussions
|
||||
|
||||
Please fill in as much of the form below as you're able.
|
||||
|
||||
Before continue, make sure you are using the latest release: check https://github.com/electerm/electerm/releases for latest release, also please
|
||||
|
||||
仅用来追踪bug, 如果有其他的讨论请移步讨论区 https://github.com/electerm/electerm/discussions, 请务必确保问题是基于最新版本: https://github.com/electerm/electerm/releases
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Electerm Version and download file extension(Electerm版本和下载文件后缀)
|
||||
description: |
|
||||
- electerm-xx.xx.xx-linux-amd64.deb
|
||||
- electerm-xx.xx.xx-linux-amd64.snap
|
||||
- electerm-xx.xx.xx-linux-x64.tar.gz
|
||||
- electerm-xx.xx.xx-linux-x86_64.rpm
|
||||
- electerm-xx.xx.xx-mac-arm64.dmg
|
||||
- electerm-xx.xx.xx-mac-x64.dmg
|
||||
- electerm-xx.xx.xx-win-x64-installer.exe
|
||||
- electerm-xx.xx.xx-win-x64-loose.tar.gz
|
||||
- electerm-xx.xx.xx-win-x64.appx
|
||||
- electerm-xx.xx.xx-win-x64.tar.gz
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Platform detail (平台详情)
|
||||
description: |
|
||||
windows 7/8/10/11, mac os(ARM or x64), or linux
|
||||
UNIX: output of `uname -a`
|
||||
Windows: output of `"$([Environment]::OSVersion | ForEach-Object VersionString) $(if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" })"` in PowerShell console
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What steps will reproduce the bug?(重现问题的详细步骤)
|
||||
description: Enter details about your bug, preferably a simple code snippet that can be run using `node` directly without installing third-party dependencies.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What should have happened?(期望的结果)
|
||||
description: If possible please provide screenshots.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Would this happen in other terminal app(是否能够在其他同类软件重现这个问题)
|
||||
description: really important.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional information(其他任何相关信息)
|
||||
description: Tell us anything else you think we should know.
|
||||
@@ -0,0 +1,10 @@
|
||||
name: "💥 Proposal / Feature (建议和新功能)"
|
||||
description: Propose a non-trivial change or new feature for electerm
|
||||
body:
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What feature you'd like to see or proposal(期望什么新功能/特性或者建议)
|
||||
description: A clear and concise description of what the proposal or feature is.(请尽可能详细描述,以便帮助其他人能够理解)
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: ⁉️ Need help with Electerm?
|
||||
url: https://github.com/electerm/electerm/discussions
|
||||
about: Please start a discussion before opening a bug.
|
||||
@@ -0,0 +1,8 @@
|
||||
# Electerm Community Code of Conduct
|
||||
|
||||
1. **Be Respectful**: Treat everyone with kindness. No harassment or discrimination.
|
||||
2. **Collaborate Constructively**: Critique ideas, not people.
|
||||
3. **Support Others**: Help newcomers and value diverse perspectives.
|
||||
4. **Report Responsibly**: Flag issues via [GitHub Issues](https://github.com/electerm/electerm/issues) or contact maintainers privately.
|
||||
|
||||
We foster an open, welcoming environment for all contributors.
|
||||
@@ -0,0 +1,6 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
@@ -0,0 +1,24 @@
|
||||
name: Trigger Website Update
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
trigger-website-update:
|
||||
runs-on: ubuntu-latest
|
||||
environment: build
|
||||
strategy:
|
||||
matrix:
|
||||
repository:
|
||||
- electerm/electerm.org
|
||||
- electerm/repos
|
||||
- electerm/electerm-data-tool
|
||||
steps:
|
||||
- name: Trigger ${{ matrix.repository }} repository workflow
|
||||
uses: peter-evans/repository-dispatch@v2
|
||||
with:
|
||||
token: ${{ secrets.PAT_REPO_TOKEN }}
|
||||
repository: ${{ matrix.repository }}
|
||||
event-type: electerm-release
|
||||
@@ -0,0 +1,26 @@
|
||||
name: electerm-react-publish
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
push:
|
||||
branches: [ electerm-react ]
|
||||
jobs:
|
||||
release-npm:
|
||||
runs-on: ubuntu-24.04
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip npm]') }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup node and npm
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '24'
|
||||
registry-url: https://registry.npmjs.org/
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install shelljs
|
||||
- run: npm install -g @jsdevtools/npm-publish
|
||||
- name: build
|
||||
env:
|
||||
token: ${{secrets.NPM_TOKEN}}
|
||||
run: node build/bin/publish-electerm-react.js
|
||||
@@ -0,0 +1,99 @@
|
||||
# Simplified workflow using custom electerm-builder Docker image
|
||||
name: linux-arm-legacy-docker
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, linux-arm-legacy, legacy-build ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-24.04-arm
|
||||
container: zxdong262/electerm-builder-legacy:latest # This will be our custom image
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip legacy]') && !contains(github.event.head_commit.message, '[skip linux-arm-legacy]') }}
|
||||
|
||||
steps:
|
||||
- name: Clone repository to /tmp and setup
|
||||
run: |
|
||||
cd /tmp
|
||||
git clone https://github.com/electerm/electerm.git electerm_build
|
||||
cd electerm_build
|
||||
git checkout ${{ github.sha }}
|
||||
|
||||
# Configure npm to use /tmp for cache and global packages
|
||||
mkdir -p /tmp/.npm /tmp/.npm-global
|
||||
npm config set cache /tmp/.npm
|
||||
npm config set prefix /tmp/.npm-global
|
||||
export PATH="/tmp/.npm-global/bin:$PATH"
|
||||
echo "PATH=/tmp/.npm-global/bin:$PATH" >> $GITHUB_ENV
|
||||
echo "npm_config_cache=/tmp/.npm" >> $GITHUB_ENV
|
||||
echo "npm_config_prefix=/tmp/.npm-global" >> $GITHUB_ENV
|
||||
|
||||
- name: Verify pre-installed versions
|
||||
working-directory: /tmp/electerm_build
|
||||
run: |
|
||||
echo "=== Pre-installed versions ==="
|
||||
node --version
|
||||
npm --version
|
||||
yarn --version
|
||||
python3 --version
|
||||
python --version
|
||||
gcc --version
|
||||
g++ --version
|
||||
fpm --version
|
||||
|
||||
- name: Clear electron-builder cache
|
||||
working-directory: /tmp/electerm_build
|
||||
run: rm -rf ~/.cache/electron-builder
|
||||
|
||||
- name: ci init
|
||||
working-directory: /tmp/electerm_build
|
||||
run: npm config set legacy-peer-deps true
|
||||
|
||||
- name: Update electron version and remove package-lock
|
||||
working-directory: /tmp/electerm_build
|
||||
run: |
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const pkg = JSON.parse(fs.readFileSync('package.json'));
|
||||
pkg.devDependencies.electron = '22.3.27';
|
||||
pkg.devDependencies['electron-builder'] = '26.0.20';
|
||||
pkg.devDependencies['@electron/rebuild'] = '3.7.2';
|
||||
pkg.dependencies['node-pty'] = '0.10.1';
|
||||
pkg.dependencies.serialport = '10.5.0';
|
||||
pkg.devDependencies.vite = '4';
|
||||
pkg.devDependencies['@vitejs/plugin-react'] = '4.7.0';
|
||||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
|
||||
"
|
||||
rm -f package-lock.json
|
||||
|
||||
- name: Install npm dependencies
|
||||
working-directory: /tmp/electerm_build
|
||||
run: npm i && npm i -S @electron/rebuild@3.7.2
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
working-directory: /tmp/electerm_build
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
- name: Build application
|
||||
working-directory: /tmp/electerm_build
|
||||
run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
working-directory: /tmp/electerm_build
|
||||
run: npm run pb
|
||||
|
||||
- name: Build legacy packages
|
||||
working-directory: /tmp/electerm_build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
USE_SYSTEM_FPM: true
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-linux-arm-legacy
|
||||
@@ -0,0 +1,111 @@
|
||||
# Alternative workflow using native ARM64 runners
|
||||
name: linux-arm-native
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, linux-arm ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-24.04-arm
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip arm-linux]') && !contains(github.event.head_commit.message, '[skip linux3]') }}
|
||||
env:
|
||||
# Force electron-builder to use the system fpm (ARM native) instead of downloading x86 prebuilt bundle
|
||||
USE_SYSTEM_FPM: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Node.js 16.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 16.x
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
python3-dev \
|
||||
build-essential \
|
||||
libnss3-dev \
|
||||
libsecret-1-dev \
|
||||
fakeroot \
|
||||
rpm \
|
||||
libgtk-3-0 \
|
||||
libnotify4 \
|
||||
libnss3 \
|
||||
libxss1 \
|
||||
libxtst6 \
|
||||
xdg-utils \
|
||||
libatspi2.0-0 \
|
||||
libuuid1 \
|
||||
libsecret-1-0 \
|
||||
libappindicator3-1 \
|
||||
ruby-full
|
||||
|
||||
- name: Install FPM
|
||||
run: sudo gem install fpm
|
||||
|
||||
- name: Verify glibc version
|
||||
run: ldd --version
|
||||
|
||||
- name: Verify fpm
|
||||
run: |
|
||||
which fpm
|
||||
fpm --version
|
||||
|
||||
- name: Install yarn
|
||||
run: npm install -g yarn
|
||||
|
||||
- name: ci init
|
||||
run: npm config set legacy-peer-deps true
|
||||
|
||||
- name: Clear electron-builder cache
|
||||
run: rm -rf ~/.cache/electron-builder
|
||||
|
||||
- name: Update electron version and remove package-lock
|
||||
run: |
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const pkg = JSON.parse(fs.readFileSync('package.json'));
|
||||
pkg.devDependencies.electron = '22.3.27';
|
||||
pkg.devDependencies['electron-builder'] = '26.0.20';
|
||||
pkg.devDependencies['@electron/rebuild'] = '3.7.2';
|
||||
pkg.dependencies['node-pty'] = '1.1.0-beta14';
|
||||
pkg.dependencies.serialport = '13.0.0';
|
||||
pkg.devDependencies.vite = '4';
|
||||
pkg.devDependencies['@vitejs/plugin-react'] = '4.7.0';
|
||||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
|
||||
"
|
||||
rm -f package-lock.json
|
||||
|
||||
- name: Install npm dependencies
|
||||
run: npm i && npm i -S @electron/rebuild@3.7.2
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
- name: Build application
|
||||
run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: Build ARM64 packages
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
run: node build/bin/build-linux-arm
|
||||
@@ -0,0 +1,57 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: linux-deb-tar
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, linux-deb-tar ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-24.04
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip linux]') && !contains(github.event.head_commit.message, '[skip linux1]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
# - name: xvfb
|
||||
# uses: GabrielBB/xvfb-action@v1
|
||||
|
||||
# before_script:
|
||||
# - run: export DISPLAY=:99.0
|
||||
# - run: sh -e /etc/init.d/xvfb start &
|
||||
# - run: sleep 3
|
||||
|
||||
# before_install:
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g yarn
|
||||
- run: npm i
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
|
||||
run: node build/bin/build-linux-deb-tar
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# Simplified workflow using custom electerm-builder Docker image
|
||||
name: linux-legacy-docker
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, linux-legacy, legacy-build ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container: zxdong262/electerm-builder-legacy:latest # This will be our custom image
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip legacy]') && !contains(github.event.head_commit.message, '[skip linux-legacy]') }}
|
||||
|
||||
steps:
|
||||
- name: Clone repository to /tmp and setup
|
||||
run: |
|
||||
cd /tmp
|
||||
git clone https://github.com/electerm/electerm.git electerm_build
|
||||
cd electerm_build
|
||||
git checkout ${{ github.sha }}
|
||||
|
||||
# Configure npm to use /tmp for cache and global packages
|
||||
mkdir -p /tmp/.npm /tmp/.npm-global
|
||||
npm config set cache /tmp/.npm
|
||||
npm config set prefix /tmp/.npm-global
|
||||
export PATH="/tmp/.npm-global/bin:$PATH"
|
||||
echo "PATH=/tmp/.npm-global/bin:$PATH" >> $GITHUB_ENV
|
||||
echo "npm_config_cache=/tmp/.npm" >> $GITHUB_ENV
|
||||
echo "npm_config_prefix=/tmp/.npm-global" >> $GITHUB_ENV
|
||||
|
||||
- name: Verify pre-installed versions
|
||||
working-directory: /tmp/electerm_build
|
||||
run: |
|
||||
echo "=== Pre-installed versions ==="
|
||||
node --version
|
||||
npm --version
|
||||
yarn --version
|
||||
python3 --version
|
||||
python --version
|
||||
gcc --version
|
||||
g++ --version
|
||||
fpm --version
|
||||
|
||||
- name: Clear electron-builder cache
|
||||
working-directory: /tmp/electerm_build
|
||||
run: rm -rf ~/.cache/electron-builder
|
||||
|
||||
- name: ci init
|
||||
working-directory: /tmp/electerm_build
|
||||
run: npm config set legacy-peer-deps true
|
||||
|
||||
- name: Update electron version and remove package-lock
|
||||
working-directory: /tmp/electerm_build
|
||||
run: |
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const pkg = JSON.parse(fs.readFileSync('package.json'));
|
||||
pkg.devDependencies.electron = '22.3.27';
|
||||
pkg.devDependencies['electron-builder'] = '26.0.20';
|
||||
pkg.devDependencies['@electron/rebuild'] = '3.7.2';
|
||||
pkg.dependencies['node-pty'] = '0.10.1';
|
||||
pkg.dependencies.serialport = '10.5.0';
|
||||
pkg.devDependencies.vite = '4';
|
||||
pkg.devDependencies['@vitejs/plugin-react'] = '4.7.0';
|
||||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
|
||||
fs.unlinkSync('package-lock.json');
|
||||
"
|
||||
|
||||
- name: Install npm dependencies
|
||||
working-directory: /tmp/electerm_build
|
||||
run: npm i && npm i -S @electron/rebuild@3.7.2
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
working-directory: /tmp/electerm_build
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
- name: Verify updated dependencies
|
||||
working-directory: /tmp/electerm_build
|
||||
run: |
|
||||
echo "Verifying updated dependencies:"
|
||||
npm list electron --depth=0
|
||||
npm list @electron/rebuild --depth=0
|
||||
npm list node-pty --depth=0
|
||||
npm list serialport --depth=0
|
||||
npm list vite --depth=0
|
||||
|
||||
- name: Build application
|
||||
working-directory: /tmp/electerm_build
|
||||
run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
working-directory: /tmp/electerm_build
|
||||
run: npm run pb
|
||||
|
||||
- name: Build legacy packages
|
||||
working-directory: /tmp/electerm_build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
USE_SYSTEM_FPM: true
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-linux-legacy
|
||||
@@ -0,0 +1,142 @@
|
||||
# Build electerm for loong64 (LoongArch64) Linux - Legacy (old world)
|
||||
#
|
||||
# This workflow:
|
||||
# 1. Downloads GCC 8 cross-compiler from Loongnix for old-world ABI
|
||||
# 2. Builds x64 version with legacy deps to get the asar
|
||||
# 3. Downloads electron loong64 from Loongnix
|
||||
# 4. Cross-compile native modules for loong64 with legacy deps
|
||||
# 5. Merges x64 asar with loong64 electron and native modules
|
||||
# 6. Uploads tar.gz to GitHub release draft
|
||||
# 7. Builds deb package and uploads to GitHub release draft
|
||||
# 8. Optionally uploads to R2
|
||||
|
||||
name: linux-loong64-legacy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, linux-loong64-legacy ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-24.04
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip linux]') && !contains(github.event.head_commit.message, '[skip loong64]') && !contains(github.event.head_commit.message, '[skip legacy]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Use Node.js 20.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20.x
|
||||
|
||||
- name: Install loong64 cross-compiler and GCC 8 from Loongnix
|
||||
run: |
|
||||
sudo add-apt-repository -y universe
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-14-loongarch64-linux-gnu g++-14-loongarch64-linux-gnu binutils-loongarch64-linux-gnu || \
|
||||
sudo apt-get install -y gcc-loongarch64-linux-gnu g++-loongarch64-linux-gnu binutils-loongarch64-linux-gnu || true
|
||||
which loongarch64-linux-gnu-gcc 2>/dev/null || sudo ln -sf /usr/bin/loongarch64-linux-gnu-gcc-14 /usr/bin/loongarch64-linux-gnu-gcc || true
|
||||
which loongarch64-linux-gnu-g++ 2>/dev/null || sudo ln -sf /usr/bin/loongarch64-linux-gnu-g++-14 /usr/bin/loongarch64-linux-gnu-g++ || true
|
||||
|
||||
# Download GCC 8 from Loongnix for old-world ABI support
|
||||
# The Loongnix FTP server is unreliable and drops connections, so we retry with resume
|
||||
echo "Downloading GCC 8 cross-compiler from Loongnix..."
|
||||
URL="https://ftp.loongnix.cn/toolchain/gcc/release/loongarch/gcc8/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.6.tar.xz"
|
||||
for i in 1 2 3 4 5; do
|
||||
echo "Attempt $i..."
|
||||
curl -L --retry 3 --retry-delay 5 -C - -o /tmp/gcc8-loong64.tar.xz "$URL" && break
|
||||
echo "Attempt $i failed, retrying..."
|
||||
sleep 10
|
||||
done
|
||||
sudo mkdir -p /opt/gcc8-loong64
|
||||
sudo tar xJf /tmp/gcc8-loong64.tar.xz -C /opt/gcc8-loong64 --strip-components=1
|
||||
echo "/opt/gcc8-loong64/bin" >> $GITHUB_PATH
|
||||
export PATH="/opt/gcc8-loong64/bin:$PATH"
|
||||
loongarch64-linux-gnu-gcc --version
|
||||
|
||||
- run: rm package-lock.json
|
||||
- run: npm config set legacy-peer-deps true
|
||||
|
||||
- name: Update package.json with legacy deps
|
||||
run: |
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const pkg = JSON.parse(fs.readFileSync('package.json'));
|
||||
pkg.devDependencies.electron = '22.3.27';
|
||||
pkg.devDependencies['electron-builder'] = '26.0.20';
|
||||
pkg.devDependencies['@electron/rebuild'] = '3.7.2';
|
||||
pkg.dependencies['node-pty'] = '1.1.0';
|
||||
pkg.dependencies.serialport = '10.5.0';
|
||||
pkg.devDependencies.vite = '4';
|
||||
pkg.devDependencies['@vitejs/plugin-react'] = '4.7.0';
|
||||
console.log('Version:', pkg.version);
|
||||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
|
||||
"
|
||||
|
||||
- name: Install npm dependencies
|
||||
run: |
|
||||
npm config set legacy-peer-deps true
|
||||
npm install -g yarn
|
||||
npm i && npm i -S @electron/rebuild@3.7.2
|
||||
|
||||
- name: Verify updated dependencies
|
||||
run: |
|
||||
echo "Verifying updated dependencies:"
|
||||
npm list electron --depth=0
|
||||
npm list @electron/rebuild --depth=0
|
||||
npm list node-pty --depth=0
|
||||
npm list serialport --depth=0
|
||||
npm list vite --depth=0
|
||||
|
||||
- name: Build loong64 legacy
|
||||
env:
|
||||
WORKFLOW_NAME: linux-loong64-legacy
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
run: bash build/bin/build-linux-loong64-legacy.sh
|
||||
|
||||
- name: Verify output
|
||||
run: |
|
||||
ls -la dist-loong64-legacy/*.tar.gz dist-loong64-legacy/*.deb
|
||||
file dist-loong64-legacy/electerm-*/electerm
|
||||
echo "=== Native modules ==="
|
||||
find dist-loong64-legacy/electerm-* -name "*.node" -exec sh -c 'echo "--- $1 ---"; file "$1"; readelf -h "$1" 2>/dev/null | grep -E "Machine|Class"; readelf -d "$1" 2>/dev/null | grep NEEDED' _ {} \;
|
||||
echo "=== pty.node symbols (forkpty/openpty) ==="
|
||||
find dist-loong64-legacy/electerm-* -name "pty.node" -exec readelf -s {} \; 2>/dev/null | grep -iE "forkpty|openpty|pty" || true
|
||||
echo "=== Build logs ==="
|
||||
cat /tmp/node-pty-build.log 2>/dev/null | tail -50 || echo "No node-pty build log"
|
||||
cat /tmp/serialport-build.log 2>/dev/null | tail -30 || echo "No serialport build log"
|
||||
|
||||
# - name: Upload build logs
|
||||
# if: always()
|
||||
# uses: actions/upload-artifact@v4
|
||||
# with:
|
||||
# name: build-logs
|
||||
# path: /tmp/*-build.log
|
||||
# retention-days: 7
|
||||
|
||||
- name: Upload to R2
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
env:
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
run: |
|
||||
mkdir -p ~/.aws
|
||||
cat > ~/.aws/credentials << EOF
|
||||
[default]
|
||||
aws_access_key_id = ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
aws_secret_access_key = ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
EOF
|
||||
cat > ~/.aws/config << EOF
|
||||
[default]
|
||||
region = auto
|
||||
endpoint_url = ${{ secrets.CF_R2_ENDPOINT }}
|
||||
EOF
|
||||
for file in $(find dist-loong64-legacy \( -name "*.tar.gz" -o -name "*.deb" \) -type f); do
|
||||
filename=$(basename "$file")
|
||||
aws s3 cp "$file" "s3://${CF_R2_BUCKET}/${filename}" \
|
||||
--acl public-read \
|
||||
--cache-control "max-age=31536000"
|
||||
echo "Uploaded: ${filename}"
|
||||
done
|
||||
@@ -0,0 +1,94 @@
|
||||
# Build electerm for loong64 (LoongArch64) Linux
|
||||
#
|
||||
# This workflow:
|
||||
# 1. Builds x64 version with electron v39.2.7 to get the asar
|
||||
# 2. Downloads electron loong64 v39.2.7
|
||||
# 3. Cross-compiles native modules for loong64
|
||||
# 4. Merges x64 asar with loong64 electron and native modules
|
||||
# 5. Uploads tar.gz to GitHub release draft
|
||||
# 6. Builds deb package and uploads to GitHub release draft
|
||||
# 7. Optionally uploads to R2
|
||||
|
||||
name: linux-loong64
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, linux-loong64 ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-24.04
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip linux]') && !contains(github.event.head_commit.message, '[skip loong64]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- name: Install loong64 cross-compiler
|
||||
run: |
|
||||
sudo add-apt-repository -y universe
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-14-loongarch64-linux-gnu g++-14-loongarch64-linux-gnu binutils-loongarch64-linux-gnu || \
|
||||
sudo apt-get install -y gcc-loongarch64-linux-gnu g++-loongarch64-linux-gnu binutils-loongarch64-linux-gnu
|
||||
which loongarch64-linux-gnu-gcc 2>/dev/null || sudo ln -sf /usr/bin/loongarch64-linux-gnu-gcc-14 /usr/bin/loongarch64-linux-gnu-gcc || true
|
||||
which loongarch64-linux-gnu-g++ 2>/dev/null || sudo ln -sf /usr/bin/loongarch64-linux-gnu-g++-14 /usr/bin/loongarch64-linux-gnu-g++ || true
|
||||
|
||||
- run: rm package-lock.json
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- name: Update electron version to v39.2.7
|
||||
run: |
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const pkg = JSON.parse(fs.readFileSync('package.json'));
|
||||
pkg.devDependencies.electron = '39.2.7';
|
||||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n');
|
||||
console.log('Electron version set to 39.2.7');
|
||||
"
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm config set legacy-peer-deps true
|
||||
npm install -g yarn
|
||||
npm i
|
||||
|
||||
- name: Build loong64
|
||||
env:
|
||||
WORKFLOW_NAME: linux-loong64
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
run: bash build/bin/build-linux-loong64.sh
|
||||
|
||||
- name: Verify output
|
||||
run: |
|
||||
ls -la dist-loong64/*.tar.gz dist-loong64/*.deb
|
||||
file dist-loong64/electerm-*/electerm
|
||||
find dist-loong64/electerm-* -name "*.node" -exec file {} \; | grep LoongArch
|
||||
|
||||
- name: Upload to R2
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
env:
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
run: |
|
||||
mkdir -p ~/.aws
|
||||
cat > ~/.aws/credentials << EOF
|
||||
[default]
|
||||
aws_access_key_id = ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
aws_secret_access_key = ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
EOF
|
||||
cat > ~/.aws/config << EOF
|
||||
[default]
|
||||
region = auto
|
||||
endpoint_url = ${{ secrets.CF_R2_ENDPOINT }}
|
||||
EOF
|
||||
for file in $(find dist-loong64 \( -name "*.tar.gz" -o -name "*.deb" \) -type f); do
|
||||
filename=$(basename "$file")
|
||||
aws s3 cp "$file" "s3://${CF_R2_BUCKET}/${filename}" \
|
||||
--acl public-read \
|
||||
--cache-control "max-age=31536000"
|
||||
echo "Uploaded: ${filename}"
|
||||
done
|
||||
@@ -0,0 +1,70 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: linux-rpm-snap
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, linux-rpm-snap ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-24.04
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip linux]') && !contains(github.event.head_commit.message, '[skip linux2]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
# - name: xvfb
|
||||
# uses: GabrielBB/xvfb-action@v1
|
||||
|
||||
- name: Install rpm
|
||||
run: sudo apt-get install rpm -y
|
||||
|
||||
- name: Install Snapcraft
|
||||
uses: samuelmeuli/action-snapcraft@master
|
||||
|
||||
# before_script:
|
||||
# - run: export DISPLAY=:99.0
|
||||
# - run: sh -e /etc/init.d/xvfb start &
|
||||
# - run: sleep 3
|
||||
|
||||
# before_install:
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g yarn
|
||||
- run: npm i
|
||||
# - run: npm i -D -E electron-builder@24.9.1
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
|
||||
run: node build/bin/build-linux-rpm-snap
|
||||
|
||||
- name: upload to snap store
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_TOKEN }}
|
||||
run: snapcraft upload --release=edge dist/*.snap
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: mac-10
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, mac-10, legacy-build ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-15-intel
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip mac]') && !contains(github.event.head_commit.message, '[skip mac-10]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 16.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 16.x
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
# before_install:
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g yarn
|
||||
- name: Update electron version and remove package-lock
|
||||
run: |
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const pkg = JSON.parse(fs.readFileSync('package.json'));
|
||||
pkg.devDependencies.electron = '22.3.27';
|
||||
pkg.devDependencies['electron-builder'] = '26.0.20';
|
||||
pkg.devDependencies['@electron/rebuild'] = '3.7.2';
|
||||
pkg.dependencies['node-pty'] = '1.1.0-beta14';
|
||||
pkg.dependencies.serialport = '13.0.0';
|
||||
pkg.devDependencies.vite = '4';
|
||||
pkg.devDependencies['@vitejs/plugin-react'] = '4.7.0';
|
||||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
|
||||
fs.unlinkSync('package-lock.json');
|
||||
"
|
||||
- run: npm i && npm i -S @electron/rebuild@3.7.2
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
CSC_LINK: ${{ secrets.CSC_LINK }}
|
||||
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
|
||||
APPLE_ID: ${{ secrets.APPLEID }}
|
||||
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLEIDPASS }}
|
||||
APPLE_TEAM_ID: ${{secrets.APPLE_TEAM_ID}}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-mac-10
|
||||
@@ -0,0 +1,57 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: mac-arm
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, mac-arm ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-15
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip mac]') && !contains(github.event.head_commit.message, '[skip arm]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
# before_install:
|
||||
- run: pip install setuptools
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g yarn
|
||||
- run: npm i
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
CSC_LINK: ${{ secrets.CSC_LINK }}
|
||||
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
|
||||
APPLE_ID: ${{ secrets.APPLEID }}
|
||||
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLEIDPASS }}
|
||||
APPLE_TEAM_ID: ${{secrets.APPLE_TEAM_ID}}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-mac-arm
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: mac-x64-test-1
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, test-only, test1 ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-15-intel
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip test]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip mac]') && !contains(github.event.head_commit.message, '[skip test1]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.15.0
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
# before_install:
|
||||
- run: pip install setuptools
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g yarn
|
||||
- run: npm i
|
||||
- run: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D -E playwright@1.49.1 && npm i -D -E @playwright/test@1.49.1
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
- name: test
|
||||
uses: GabrielBB/xvfb-action@v1
|
||||
with:
|
||||
run: npm run test1
|
||||
env:
|
||||
NODE_TEST: 1
|
||||
TEST_HOST: ${{ secrets.TEST_HOST }}
|
||||
TEST_USER: ${{ secrets.TEST_USER_1 }}
|
||||
TEST_PASS: ${{ secrets.TEST_PASS_1 }}
|
||||
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
|
||||
GIST_ID: ${{ secrets.GIST_ID }}
|
||||
GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}
|
||||
GITEE_ID: ${{ secrets.GITEE_ID }}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: mac-x64-test-2
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, test-only ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-15-intel
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip test]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip mac]') && !contains(github.event.head_commit.message, '[skip test2]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.15.0
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
# before_install:
|
||||
- run: pip install setuptools
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g yarn
|
||||
- run: npm i
|
||||
- run: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D -E playwright@1.49.1 && npm i -D -E @playwright/test@1.49.1
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: test
|
||||
uses: GabrielBB/xvfb-action@v1
|
||||
with:
|
||||
run: npm run test2
|
||||
env:
|
||||
NODE_TEST: 1
|
||||
TEST_HOST: ${{ secrets.TEST_HOST }}
|
||||
TEST_USER: ${{ secrets.TEST_USER_2 }}
|
||||
TEST_PASS: ${{ secrets.TEST_PASS_2 }}
|
||||
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
|
||||
GIST_ID: ${{ secrets.GIST_ID }}
|
||||
GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}
|
||||
GITEE_ID: ${{ secrets.GITEE_ID }}
|
||||
CUSTOM_SYNC_URL: ${{ secrets.CUSTOM_SYNC_URL }}
|
||||
CUSTOM_SYNC_USER: ${{ secrets.CUSTOM_SYNC_USER }}
|
||||
CUSTOM_SYNC_SECRET: ${{ secrets.CUSTOM_SYNC_SECRET }}
|
||||
CLOUD_TOKEN: ${{ secrets.CLOUD_TOKEN }}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: mac-x64-test-3
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, test-only, test3 ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-15-intel
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip test]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip mac]') && !contains(github.event.head_commit.message, '[skip test3]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.15.0
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
# before_install:
|
||||
- run: pip install setuptools
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g yarn
|
||||
- run: npm i
|
||||
- run: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D -E playwright@1.49.1 && npm i -D -E @playwright/test@1.49.1
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: test
|
||||
uses: GabrielBB/xvfb-action@v1
|
||||
with:
|
||||
run: npm run test3
|
||||
env:
|
||||
NODE_TEST: 1
|
||||
TEST_HOST: ${{ secrets.TEST_HOST }}
|
||||
TEST_USER: ${{ secrets.TEST_USER_3 }}
|
||||
TEST_PASS: ${{ secrets.TEST_PASS_3 }}
|
||||
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
|
||||
GIST_ID: ${{ secrets.GIST_ID }}
|
||||
GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}
|
||||
GITEE_ID: ${{ secrets.GITEE_ID }}
|
||||
CUSTOM_SYNC_URL: ${{ secrets.CUSTOM_SYNC_URL }}
|
||||
CUSTOM_SYNC_USER: ${{ secrets.CUSTOM_SYNC_USER }}
|
||||
CUSTOM_SYNC_SECRET: ${{ secrets.CUSTOM_SYNC_SECRET }}
|
||||
CLOUD_TOKEN: ${{ secrets.CLOUD_TOKEN }}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: mac-x64
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, mac-x64 ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-15-intel
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip mac]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.10'
|
||||
# before_install:
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g yarn
|
||||
- run: npm i
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
CSC_LINK: ${{ secrets.CSC_LINK }}
|
||||
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
|
||||
APPLE_ID: ${{ secrets.APPLEID }}
|
||||
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLEIDPASS }}
|
||||
APPLE_TEAM_ID: ${{secrets.APPLE_TEAM_ID}}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-mac
|
||||
|
||||
@@ -0,0 +1,504 @@
|
||||
# Upload APPX to Microsoft Store after a new release is published.
|
||||
# Downloads the .appx artifact from the GitHub release and submits
|
||||
# a new Store submission via the Partner Center Ingestion API.
|
||||
|
||||
name: ms-store-upload
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [released]
|
||||
push:
|
||||
branches: [ ms ]
|
||||
|
||||
jobs:
|
||||
upload-to-store:
|
||||
runs-on: windows-2022
|
||||
environment: build
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- name: Install R2 dependencies if store upload may run
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
- name: Determine release tag
|
||||
id: tag
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
$tag = "${{ github.event.release.tag_name }}"
|
||||
if (-not $tag) {
|
||||
Write-Host "No release tag from event, fetching latest release..."
|
||||
$tag = (gh release view --repo "${{ github.repository }}" --json tagName -q '.tagName')
|
||||
if (-not $tag) { throw 'Could not determine release tag.' }
|
||||
}
|
||||
Write-Host "Release tag: $tag"
|
||||
"tag_name=$tag" >> $env:GITHUB_OUTPUT
|
||||
|
||||
- name: Download APPX from release
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
$tag = "${{ steps.tag.outputs.tag_name }}"
|
||||
New-Item -ItemType Directory -Force -Path dist | Out-Null
|
||||
gh release download "$tag" --repo "${{ github.repository }}" --pattern '*.appx' -D dist
|
||||
Write-Host 'Downloaded APPX files:'
|
||||
Get-ChildItem -Path dist -Filter '*.appx' -Recurse | Format-Table FullName, Length
|
||||
|
||||
- name: Setup Microsoft Store Developer CLI
|
||||
uses: microsoft/microsoft-store-apppublisher@v1.1
|
||||
|
||||
- name: Configure Microsoft Store Developer CLI
|
||||
env:
|
||||
MS_TENANT_ID: ${{ secrets.MS_TENANT_ID }}
|
||||
MS_SELLER_ID: ${{ secrets.MS_SELLER_ID }}
|
||||
MS_CLIENT_ID: ${{ secrets.MS_CLIENT_ID }}
|
||||
MS_CLIENT_SECRET: ${{ secrets.MS_CLIENT_SECRET }}
|
||||
run: msstore reconfigure --tenantId "$env:MS_TENANT_ID" --sellerId "$env:MS_SELLER_ID" --clientId "$env:MS_CLIENT_ID" --clientSecret "$env:MS_CLIENT_SECRET"
|
||||
shell: pwsh
|
||||
|
||||
- name: Debug Microsoft Store app access
|
||||
continue-on-error: true
|
||||
env:
|
||||
MS_PRODUCT_ID: ${{ secrets.MS_PRODUCT_ID }}
|
||||
MS_APP_ID: ${{ secrets.MS_APP_ID }}
|
||||
MSSTORE_LOG_FILE: dist/msstore-logs/msstore-${{ github.run_id }}-${{ github.run_attempt }}.log
|
||||
run: |
|
||||
function Get-VisibleProductIds([string] $appsListOutput) {
|
||||
$cleanOutput = [regex]::Replace($appsListOutput, '\x1B\[[0-9;?]*[ -/]*[@-~]', '')
|
||||
return @(
|
||||
$cleanOutput -split "`r?`n" |
|
||||
Where-Object { $_.Trim().StartsWith('│') } |
|
||||
ForEach-Object {
|
||||
$columns = $_.Trim().Split('│') | ForEach-Object { $_.Trim() }
|
||||
if ($columns.Count -ge 5) {
|
||||
$productId = $columns[2]
|
||||
$packageId = $columns[4]
|
||||
if ($productId -and $productId -ne 'ProductId' -and $packageId -and $packageId -ne 'PackageId') {
|
||||
$productId
|
||||
}
|
||||
}
|
||||
} |
|
||||
Select-Object -Unique
|
||||
)
|
||||
}
|
||||
|
||||
New-Item -ItemType Directory -Force -Path (Split-Path -Parent $env:MSSTORE_LOG_FILE) | Out-Null
|
||||
Set-Content -Path $env:MSSTORE_LOG_FILE -Value "=== Microsoft Store debug log $(Get-Date -Format o) ==="
|
||||
|
||||
function Write-StoreLog([string] $message) {
|
||||
Add-Content -Path $env:MSSTORE_LOG_FILE -Value $message
|
||||
}
|
||||
|
||||
$msstoreVersion = & msstore --version 2>&1 | Out-String
|
||||
Write-Host "msstore CLI version: $msstoreVersion"
|
||||
Write-StoreLog "msstore CLI version: $msstoreVersion"
|
||||
|
||||
$configuredProductId = "$env:MS_PRODUCT_ID".Trim()
|
||||
if (-not $configuredProductId) {
|
||||
$configuredProductId = "$env:MS_APP_ID".Trim()
|
||||
}
|
||||
|
||||
if ($configuredProductId) {
|
||||
Write-Host "Configured Store Product ID: $configuredProductId"
|
||||
} else {
|
||||
Write-Host 'Configured Store Product ID: <empty>'
|
||||
}
|
||||
|
||||
Write-Host 'Package identifiers in this repo are not valid Store Product IDs:'
|
||||
Write-Host ' Electron appId: org.electerm.electerm'
|
||||
Write-Host ' APPX applicationId: electerm'
|
||||
Write-Host ' APPX identityName: 64159ZHAOXudong.electerm'
|
||||
Write-Host 'Accessible Microsoft Store packaged apps for this account:'
|
||||
Write-StoreLog "Configured Store Product ID: $configuredProductId"
|
||||
Write-StoreLog 'Package identifiers in this repo are not valid Store Product IDs:'
|
||||
Write-StoreLog ' Electron appId: org.electerm.electerm'
|
||||
Write-StoreLog ' APPX applicationId: electerm'
|
||||
Write-StoreLog ' APPX identityName: 64159ZHAOXudong.electerm'
|
||||
Write-StoreLog 'Accessible Microsoft Store packaged apps for this account:'
|
||||
|
||||
Write-StoreLog ''
|
||||
Write-StoreLog "=== msstore apps list $(Get-Date -Format o) ==="
|
||||
$appsListOutput = (& msstore apps list 2>&1 | Tee-Object -FilePath $env:MSSTORE_LOG_FILE -Append | Out-String)
|
||||
$appsListExitCode = $LASTEXITCODE
|
||||
$global:LASTEXITCODE = 0
|
||||
Write-Host $appsListOutput
|
||||
Write-StoreLog "msstore apps list exit code: $appsListExitCode"
|
||||
|
||||
$productIds = Get-VisibleProductIds $appsListOutput
|
||||
|
||||
if ($appsListExitCode -ne 0) {
|
||||
Write-Host "msstore apps list exited with code $appsListExitCode. This usually means the configured Entra app can authenticate but does not have Partner Center access to packaged apps for this seller account."
|
||||
} elseif ($productIds.Count -eq 0) {
|
||||
Write-Host 'msstore apps list succeeded but no packaged Product IDs were detected. This usually means no packaged Store apps are visible to this account.'
|
||||
} elseif (-not $configuredProductId) {
|
||||
if ($productIds.Count -eq 1) {
|
||||
Write-Host "Exactly one packaged Product ID is visible: $($productIds[0])"
|
||||
} else {
|
||||
Write-Host "Multiple packaged Product IDs are visible: $($productIds -join ', ')"
|
||||
}
|
||||
} elseif ($configuredProductId -notin $productIds) {
|
||||
Write-Host "Configured Store Product ID '$configuredProductId' was not found in the accessible app list."
|
||||
Write-Host "Visible Product IDs: $($productIds -join ', ')"
|
||||
} else {
|
||||
Write-Host "Configured Store Product ID '$configuredProductId' is visible to this account."
|
||||
}
|
||||
shell: pwsh
|
||||
|
||||
- name: Upload APPX to Microsoft Store and submit for certification
|
||||
env:
|
||||
MS_PRODUCT_ID: ${{ secrets.MS_PRODUCT_ID }}
|
||||
MS_APP_ID: ${{ secrets.MS_APP_ID }}
|
||||
MS_TENANT_ID: ${{ secrets.MS_TENANT_ID }}
|
||||
MS_CLIENT_ID: ${{ secrets.MS_CLIENT_ID }}
|
||||
MS_CLIENT_SECRET: ${{ secrets.MS_CLIENT_SECRET }}
|
||||
MSSTORE_LOG_FILE: dist/msstore-logs/msstore-${{ github.run_id }}-${{ github.run_attempt }}.log
|
||||
run: |
|
||||
# ── Initialise log file ─────────────────────────────────────────────────
|
||||
New-Item -ItemType Directory -Force -Path (Split-Path -Parent $env:MSSTORE_LOG_FILE) | Out-Null
|
||||
Set-Content -Path $env:MSSTORE_LOG_FILE -Value "=== ms-store-upload log $(Get-Date -Format o) ==="
|
||||
|
||||
function Write-StoreLog([string] $message) {
|
||||
Add-Content -Path $env:MSSTORE_LOG_FILE -Value $message
|
||||
}
|
||||
|
||||
# Retry wrapper for Invoke-RestMethod with exponential backoff.
|
||||
# The Partner Center Ingestion API is behind Azure Front Door and can
|
||||
# return transient 504 / 502 / 503 responses under load.
|
||||
function Invoke-WithRetry {
|
||||
param(
|
||||
[Parameter(Mandatory=$true)] [scriptblock] $Action,
|
||||
[string] $Description = 'API call',
|
||||
[int] $MaxRetries = 5,
|
||||
[int] $BaseDelaySec = 10
|
||||
)
|
||||
for ($i = 0; $i -lt $MaxRetries; $i++) {
|
||||
try {
|
||||
return & $Action
|
||||
} catch {
|
||||
$statusCode = $null
|
||||
if ($_.Exception.Response) {
|
||||
$statusCode = [int]$_.Exception.Response.StatusCode
|
||||
}
|
||||
$isTransient = $false
|
||||
if ($statusCode -in 408, 429, 500, 502, 503, 504) { $isTransient = $true }
|
||||
if ($_.Exception.Message -match 'timed?\s*out|gateway|service unavailable|connection was closed|unable to connect') { $isTransient = $true }
|
||||
$attempt = $i + 1
|
||||
if ($isTransient -and $attempt -lt $MaxRetries) {
|
||||
$delay = $BaseDelaySec * [Math]::Pow(2, $i)
|
||||
Write-Host " ⚠ ${Description}: transient error (HTTP $statusCode) on attempt $attempt/$MaxRetries — retrying in ${delay}s..."
|
||||
Write-StoreLog "${Description}: transient error (HTTP $statusCode) attempt $attempt/$MaxRetries, retry in ${delay}s. $($_.Exception.Message)"
|
||||
Start-Sleep -Seconds $delay
|
||||
} else {
|
||||
Write-StoreLog "${Description}: FAILED on attempt $attempt (HTTP $statusCode). $($_.Exception.Message)"
|
||||
throw
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Get-VisibleProductIds([string] $appsListOutput) {
|
||||
$cleanOutput = [regex]::Replace($appsListOutput, '\x1B\[[0-9;?]*[ -/]*[@-~]', '')
|
||||
return @(
|
||||
$cleanOutput -split "`r?`n" |
|
||||
Where-Object { $_.Trim().StartsWith('│') } |
|
||||
ForEach-Object {
|
||||
$columns = $_.Trim().Split('│') | ForEach-Object { $_.Trim() }
|
||||
if ($columns.Count -ge 5) {
|
||||
$productId = $columns[2]
|
||||
$packageId = $columns[4]
|
||||
if ($productId -and $productId -ne 'ProductId' -and $packageId -and $packageId -ne 'PackageId') {
|
||||
$productId
|
||||
}
|
||||
}
|
||||
} |
|
||||
Select-Object -Unique
|
||||
)
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
$appx = Get-ChildItem -Path dist -Filter '*.appx' -Recurse | Select-Object -First 1
|
||||
if (-not $appx) { throw 'No .appx file found under dist/' }
|
||||
|
||||
Write-StoreLog ''
|
||||
Write-StoreLog "=== publish preflight $(Get-Date -Format o) ==="
|
||||
Write-StoreLog "APPX file: $($appx.FullName)"
|
||||
|
||||
# Soft preflight: enumerate accessible packaged apps.
|
||||
# 'msstore apps list' can fail on its own (e.g. a CLI regression pulled in by
|
||||
# 'version: latest') even when the Entra app and the configured Product ID are
|
||||
# perfectly valid. The actual submission below calls the Dev Center Ingestion API
|
||||
# directly and does not depend on this command, so when MS_PRODUCT_ID is explicitly
|
||||
# configured we trust it and proceed instead of aborting the whole build.
|
||||
$appsListOutput = (& msstore apps list 2>&1 | Tee-Object -FilePath $env:MSSTORE_LOG_FILE -Append | Out-String)
|
||||
$appsListExitCode = $LASTEXITCODE
|
||||
$global:LASTEXITCODE = 0
|
||||
Write-StoreLog "msstore apps list exit code: $appsListExitCode"
|
||||
$productIds = Get-VisibleProductIds $appsListOutput
|
||||
|
||||
$productId = "$env:MS_PRODUCT_ID".Trim()
|
||||
if (-not $productId) {
|
||||
$productId = "$env:MS_APP_ID".Trim()
|
||||
}
|
||||
|
||||
if (-not $productId) {
|
||||
# No explicitly configured id: we must rely on the app list.
|
||||
if ($appsListExitCode -eq 0 -and $productIds.Count -eq 1) {
|
||||
$productId = $productIds[0]
|
||||
Write-Host "Resolved MS Product ID from account app list: $productId"
|
||||
} else {
|
||||
$visibleProductIds = if ($productIds.Count) { $productIds -join ', ' } else { 'none detected' }
|
||||
throw "Missing MS_PRODUCT_ID or MS_APP_ID secret and could not resolve a single Product ID from 'msstore apps list' (exit $appsListExitCode). Visible Product IDs for this account: $visibleProductIds"
|
||||
}
|
||||
} elseif ($appsListExitCode -ne 0 -or $productIds.Count -eq 0) {
|
||||
Write-Host "WARNING: 'msstore apps list' failed (exit $appsListExitCode) but MS_PRODUCT_ID is explicitly configured; proceeding with the configured Product ID."
|
||||
Write-StoreLog "WARNING: 'msstore apps list' failed (exit $appsListExitCode); proceeding with configured Product ID: $productId"
|
||||
} elseif ($productId -notin $productIds) {
|
||||
Write-Host "WARNING: Configured Store Product ID '$productId' was not found in the accessible app list; proceeding with the configured value anyway."
|
||||
Write-StoreLog "WARNING: Configured Store Product ID '$productId' not in accessible app list; proceeding."
|
||||
} else {
|
||||
Write-Host "Configured Store Product ID '$productId' is visible to this account."
|
||||
}
|
||||
|
||||
$knownWrongAppIds = @(
|
||||
'org.electerm.electerm',
|
||||
'electerm',
|
||||
'64159ZHAOXudong.electerm'
|
||||
)
|
||||
if ($knownWrongAppIds -contains $productId) {
|
||||
throw "Configured store identifier '$productId' is a package identifier. Use the Microsoft Store Partner Center product id instead."
|
||||
}
|
||||
|
||||
Write-Host "Resolved publish Product ID: $productId"
|
||||
Write-StoreLog "Resolved publish Product ID: $productId"
|
||||
|
||||
# ── Direct Ingestion API publish ───────────────────────────────────────
|
||||
# msstore publish copies listing features verbatim from the live submission.
|
||||
# If any locale has >20 features the Ingestion API rejects the update.
|
||||
# We bypass msstore publish and call the API directly so we can cap features.
|
||||
|
||||
Write-StoreLog ''
|
||||
Write-StoreLog "=== direct-api publish $(Get-Date -Format o) ==="
|
||||
|
||||
# 1. Get OAuth token for the Partner Center Ingestion API
|
||||
$tokenParts = @(
|
||||
"grant_type=client_credentials",
|
||||
"client_id=$([uri]::EscapeDataString($env:MS_CLIENT_ID))",
|
||||
"client_secret=$([uri]::EscapeDataString($env:MS_CLIENT_SECRET))",
|
||||
"scope=$([uri]::EscapeDataString('https://manage.devcenter.microsoft.com/.default'))"
|
||||
)
|
||||
$tokenResp = Invoke-WithRetry -Description 'Get OAuth token' {
|
||||
Invoke-RestMethod `
|
||||
-Uri "https://login.microsoftonline.com/$env:MS_TENANT_ID/oauth2/v2.0/token" `
|
||||
-Method Post -ContentType 'application/x-www-form-urlencoded' `
|
||||
-Body ($tokenParts -join '&')
|
||||
}
|
||||
$token = $tokenResp.access_token
|
||||
Write-StoreLog "OAuth token acquired."
|
||||
$h = @{ Authorization = "Bearer $token" }
|
||||
$apiBase = "https://manage.devcenter.microsoft.com/v1.0/my/applications/$productId"
|
||||
|
||||
# 2. Get app info; delete any pending submission
|
||||
Write-Host "Getting app info..."
|
||||
$appInfo = Invoke-WithRetry -Description 'Get app info' { Invoke-RestMethod -Uri $apiBase -Headers $h }
|
||||
Write-StoreLog "App info fetched. lastPublishedSubmission: $($appInfo.lastPublishedApplicationSubmission.id)"
|
||||
if ($appInfo.pendingApplicationSubmission.id) {
|
||||
$pendingId = $appInfo.pendingApplicationSubmission.id
|
||||
Write-Host "Deleting pending submission $pendingId ..."
|
||||
Write-StoreLog "Deleting pending submission: $pendingId"
|
||||
Invoke-WithRetry -Description 'Delete pending submission' { Invoke-RestMethod -Uri "$apiBase/submissions/$pendingId" -Method Delete -Headers $h } | Out-Null
|
||||
Write-Host "Deleted pending submission."
|
||||
Write-StoreLog "Deleted pending submission."
|
||||
}
|
||||
|
||||
# 3. Fetch last published submission to use as the body for POST /submissions.
|
||||
# The API does NOT auto-clone — it requires the full submission object.
|
||||
$lastPubSubId = $appInfo.lastPublishedApplicationSubmission.id
|
||||
if (-not $lastPubSubId) { throw 'No published submission found to clone from.' }
|
||||
Write-Host "Fetching published submission $lastPubSubId as template..."
|
||||
Write-StoreLog "Fetching published submission: $lastPubSubId"
|
||||
$pubSub = Invoke-WithRetry -Description 'Fetch published submission template' { Invoke-RestMethod -Uri "$apiBase/submissions/$lastPubSubId" -Headers $h }
|
||||
|
||||
# 4. Create new submission using the published submission data as the request body.
|
||||
# A 504/502 gateway timeout can still result in the submission being created
|
||||
# server-side. A naive retry would then fail with HTTP 409 Conflict
|
||||
# (InvalidState) because the Ingestion API only allows one pending
|
||||
# submission at a time. After any failure we re-fetch app info and reuse
|
||||
# the pending submission if one now exists instead of blindly retrying.
|
||||
Write-Host "Creating new submission..."
|
||||
Write-StoreLog "Creating new submission (POST with published data as body)..."
|
||||
$pubSubBytes = [System.Text.Encoding]::UTF8.GetBytes(($pubSub | ConvertTo-Json -Depth 30 -Compress))
|
||||
$newSub = $null
|
||||
$maxCreateRetries = 5
|
||||
$submissionReady = $false
|
||||
for ($i = 0; $i -lt $maxCreateRetries -and -not $submissionReady; $i++) {
|
||||
try {
|
||||
$newSub = Invoke-RestMethod -Uri "$apiBase/submissions" -Method Post -Headers $h -ContentType 'application/json' -Body $pubSubBytes
|
||||
$submissionReady = $true
|
||||
} catch {
|
||||
$statusCode = $null
|
||||
if ($_.Exception.Response) {
|
||||
$statusCode = [int]$_.Exception.Response.StatusCode
|
||||
}
|
||||
$errBody = ''
|
||||
if ($_.ErrorDetails -and $_.ErrorDetails.Message) {
|
||||
$errBody = $_.ErrorDetails.Message
|
||||
}
|
||||
$attempt = $i + 1
|
||||
$isRecoverable = ($statusCode -in 409, 502, 503, 504) -or
|
||||
($errBody -match 'Conflict|InvalidState') -or
|
||||
($_.Exception.Message -match 'timed?\s*out|gateway|service unavailable|connection was closed')
|
||||
if ($isRecoverable -and $attempt -lt $maxCreateRetries) {
|
||||
$delay = 10 * [Math]::Pow(2, $i)
|
||||
Write-Host " ⚠ Create new submission: HTTP $statusCode on attempt $attempt/$maxCreateRetries — checking for pending submission in ${delay}s..."
|
||||
Write-StoreLog "Create new submission: HTTP $statusCode attempt $attempt/$maxCreateRetries, retry in ${delay}s. $errBody"
|
||||
Start-Sleep -Seconds $delay
|
||||
# Re-fetch app info — the failed POST may have created a pending submission.
|
||||
# Use Invoke-WithRetry because the API may be experiencing widespread 504s.
|
||||
try {
|
||||
$appInfoRetry = Invoke-WithRetry -Description 'Re-fetch app info for pending submission' { Invoke-RestMethod -Uri $apiBase -Headers $h }
|
||||
if ($appInfoRetry.pendingApplicationSubmission.id) {
|
||||
$pendingSubId = $appInfoRetry.pendingApplicationSubmission.id
|
||||
Write-Host " Found pending submission $pendingSubId — reusing it."
|
||||
Write-StoreLog "Reusing existing pending submission: $pendingSubId"
|
||||
$pendingSub = Invoke-WithRetry -Description 'Fetch pending submission details' { Invoke-RestMethod -Uri "$apiBase/submissions/$pendingSubId" -Headers $h }
|
||||
$newSub = [PSCustomObject]@{
|
||||
id = $pendingSubId
|
||||
fileUploadUrl = $pendingSub.fileUploadUrl
|
||||
}
|
||||
$submissionReady = $true
|
||||
}
|
||||
} catch {
|
||||
Write-Host " Could not re-fetch app info or submission: $($_.Exception.Message)"
|
||||
Write-StoreLog "Re-fetch failed: $($_.Exception.Message)"
|
||||
}
|
||||
} else {
|
||||
Write-StoreLog "Create new submission: FAILED on attempt $attempt (HTTP $statusCode). $errBody"
|
||||
throw
|
||||
}
|
||||
}
|
||||
}
|
||||
if (-not $newSub) { throw 'Failed to create new submission after retries.' }
|
||||
$subId = $newSub.id
|
||||
$fileUploadUrl = $newSub.fileUploadUrl
|
||||
Write-Host "Submission ID: $subId"
|
||||
Write-StoreLog "Submission ID: $subId"
|
||||
|
||||
# 5. Get full data for the new submission
|
||||
$subData = Invoke-WithRetry -Description 'Get new submission data' { Invoke-RestMethod -Uri "$apiBase/submissions/$subId" -Headers $h }
|
||||
|
||||
# 6. Replace packages: mark existing for deletion, add new one as PendingUpload
|
||||
$newPackages = @()
|
||||
foreach ($pkg in @($subData.applicationPackages)) {
|
||||
$pkg.fileStatus = 'PendingDelete'
|
||||
$newPackages += $pkg
|
||||
}
|
||||
$newPackages += [PSCustomObject]@{ fileName = $appx.Name; fileStatus = 'PendingUpload' }
|
||||
$subData.applicationPackages = $newPackages
|
||||
Write-StoreLog "applicationPackages: $($newPackages.Count) entries (last = new PendingUpload)."
|
||||
|
||||
# Auto-publish after certification passes.
|
||||
$subData.targetPublishMode = 'Immediate'
|
||||
|
||||
# 7. Push updated submission metadata
|
||||
Write-Host "Updating submission metadata..."
|
||||
Write-StoreLog "PUT submission metadata..."
|
||||
$updateBodyBytes = [System.Text.Encoding]::UTF8.GetBytes(($subData | ConvertTo-Json -Depth 30 -Compress))
|
||||
Invoke-WithRetry -Description 'PUT submission metadata' {
|
||||
Invoke-RestMethod -Uri "$apiBase/submissions/$subId" -Method Put -Headers $h `
|
||||
-ContentType 'application/json' -Body $updateBodyBytes
|
||||
} | Out-Null
|
||||
Write-Host "Submission metadata updated."
|
||||
Write-StoreLog "Submission metadata updated."
|
||||
|
||||
# 8. Create ZIP and upload to Azure Blob SAS URL
|
||||
# (SAS URL carries its own auth — do not include the Bearer token here)
|
||||
$zipPath = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), 'electerm-appx-upload.zip')
|
||||
if (Test-Path $zipPath) { Remove-Item $zipPath }
|
||||
Compress-Archive -Path $appx.FullName -DestinationPath $zipPath
|
||||
$zipSizeMB = [Math]::Round((Get-Item $zipPath).Length / 1MB, 1)
|
||||
Write-Host "Uploading package ZIP ($zipSizeMB MB)..."
|
||||
Write-StoreLog "Uploading package ZIP ($zipSizeMB MB) to Azure Blob SAS URL..."
|
||||
$blobHeaders = @{ 'x-ms-blob-type' = 'BlockBlob'; 'Content-Type' = 'application/octet-stream' }
|
||||
Invoke-WithRetry -Description 'Upload package ZIP to Azure Blob' { Invoke-RestMethod -Uri $fileUploadUrl -Method Put -Headers $blobHeaders -InFile $zipPath } | Out-Null
|
||||
Write-Host "Package uploaded."
|
||||
Write-StoreLog "Package uploaded."
|
||||
|
||||
# 9. Commit submission to trigger certification.
|
||||
# targetPublishMode = 'Immediate' means it will go live automatically after passing certification.
|
||||
Write-Host "Committing submission to trigger certification..."
|
||||
Write-StoreLog "Committing submission (Immediate publish mode)..."
|
||||
$commitResp = Invoke-WithRetry -Description 'Commit submission' { Invoke-RestMethod -Uri "$apiBase/submissions/$subId/commit" -Method Post -Headers $h -ContentType 'application/json' }
|
||||
Write-Host "Submission committed. Certification will start shortly."
|
||||
Write-StoreLog "Commit response status: $($commitResp.status)"
|
||||
if ($commitResp.statusDetails) {
|
||||
$errors = @($commitResp.statusDetails.errors)
|
||||
$warnings = @($commitResp.statusDetails.warnings)
|
||||
if ($errors.Count -gt 0) {
|
||||
foreach ($e in $errors) {
|
||||
Write-Host " ERROR: $($e.code) - $($e.details)"
|
||||
Write-StoreLog " Commit error: $($e.code) - $($e.details)"
|
||||
}
|
||||
throw "Submission commit returned $($errors.Count) error(s)."
|
||||
}
|
||||
if ($warnings.Count -gt 0) {
|
||||
foreach ($w in $warnings) {
|
||||
Write-Host " WARNING: $($w.code) - $($w.details)"
|
||||
Write-StoreLog " Commit warning: $($w.code) - $($w.details)"
|
||||
}
|
||||
}
|
||||
}
|
||||
Write-StoreLog "Done (committed, Immediate mode). SubmissionId: $subId"
|
||||
|
||||
# 10. Verify submission status after commit
|
||||
Write-Host "Verifying submission status..."
|
||||
Start-Sleep -Seconds 10
|
||||
$subStatus = Invoke-WithRetry -Description 'Check submission status' { Invoke-RestMethod -Uri "$apiBase/submissions/$subId" -Headers $h }
|
||||
Write-Host "Submission status: $($subStatus.status)"
|
||||
Write-StoreLog "Post-commit submission status: $($subStatus.status)"
|
||||
if ($subStatus.status -eq 'CommitFailed') {
|
||||
$errDetails = if ($subStatus.statusDetails.errors) { $subStatus.statusDetails.errors | ForEach-Object { "$($_.code): $($_.details)" } | Out-String } else { 'no details' }
|
||||
throw "Submission commit failed. Status: $($subStatus.status). Details: $errDetails"
|
||||
}
|
||||
|
||||
} catch {
|
||||
$errMsg = $_.ToString()
|
||||
$errDetail = $_.Exception.Message
|
||||
$errStack = $_.ScriptStackTrace
|
||||
Write-Host "ERROR: $errMsg"
|
||||
Write-StoreLog ''
|
||||
Write-StoreLog "=== FATAL ERROR $(Get-Date -Format o) ==="
|
||||
Write-StoreLog "Message : $errMsg"
|
||||
Write-StoreLog "Detail : $errDetail"
|
||||
Write-StoreLog "Stack :"
|
||||
Write-StoreLog "$errStack"
|
||||
throw $_
|
||||
}
|
||||
shell: pwsh
|
||||
|
||||
- name: Upload Microsoft Store raw log to R2
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
env:
|
||||
MSSTORE_LOG_FILE: dist/msstore-logs/msstore-${{ github.run_id }}-${{ github.run_attempt }}.log
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: |
|
||||
if (-not (Test-Path $env:MSSTORE_LOG_FILE)) {
|
||||
Write-Host "Microsoft Store raw log file was not created: $env:MSSTORE_LOG_FILE"
|
||||
exit 0
|
||||
}
|
||||
|
||||
$key = "store-logs/ms-store-upload/${{ github.run_id }}-${{ github.run_attempt }}.log"
|
||||
node build/bin/upload-file-to-r2.js "$env:MSSTORE_LOG_FILE" "$key"
|
||||
shell: pwsh
|
||||
@@ -0,0 +1,24 @@
|
||||
name: publish-to-npm
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
push:
|
||||
branches: [ test-npm ]
|
||||
jobs:
|
||||
release-npm:
|
||||
runs-on: ubuntu-latest
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip npm]') }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup node and npm
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '24'
|
||||
registry-url: https://registry.npmjs.org/
|
||||
- run: node build/bin/prepublish.js
|
||||
- run: npm config set legacy-peer-deps true && npm i
|
||||
- uses: JS-DevTools/npm-publish@v3
|
||||
with:
|
||||
token: ${{secrets.NPM_TOKEN}}
|
||||
@@ -0,0 +1,52 @@
|
||||
name: Sync Master to Gitee
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
sync-master:
|
||||
runs-on: ubuntu-latest
|
||||
environment: build
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.GITEE_PRIVATE_SSH_TOKEN }}" > ~/.ssh/id_rsa
|
||||
chmod 600 ~/.ssh/id_rsa
|
||||
ssh-keyscan gitee.com >> ~/.ssh/known_hosts
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config --global user.name "ZHAO Xudong"
|
||||
git config --global user.email "zxdong@gmail.com"
|
||||
git remote add gitee git@gitee.com:github-zxdong262/electerm.git
|
||||
|
||||
- name: Push to Gitee
|
||||
run: git push -f gitee HEAD:master
|
||||
|
||||
- name: Update version.html in gh-pages
|
||||
run: |
|
||||
# Get version from package.json using standard grep and sed
|
||||
VERSION=$(curl -s https://raw.githubusercontent.com/electerm/electerm/master/package.json | grep '"version":' | sed 's/.*"version": "\([^"]*\).*/\1/')
|
||||
|
||||
# Checkout gh-pages branch
|
||||
git fetch origin gh-pages:gh-pages
|
||||
git checkout gh-pages
|
||||
|
||||
# Update version.html
|
||||
echo "v$VERSION" > version.html
|
||||
|
||||
# Commit and push changes
|
||||
git add version.html
|
||||
git commit -m "Update version to v$VERSION"
|
||||
git push origin gh-pages
|
||||
|
||||
# Also push to Gitee
|
||||
git push gitee gh-pages
|
||||
@@ -0,0 +1,59 @@
|
||||
name: upload-release-assets-to-r2
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
push:
|
||||
branches: [ r2 ]
|
||||
jobs:
|
||||
upload-to-r2:
|
||||
runs-on: ubuntu-latest
|
||||
environment: build
|
||||
steps:
|
||||
- name: Download all release assets
|
||||
run: |
|
||||
TAG_NAME="${{ github.event.release.tag_name || github.event.inputs.tag_name }}"
|
||||
mkdir -p ./release-assets
|
||||
gh release download "$TAG_NAME" --repo "${{ github.repository }}" -D ./release-assets
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
|
||||
- name: List downloaded file
|
||||
run: ls -la ./release-assets
|
||||
|
||||
- name: Configure AWS credentials for R2
|
||||
run: |
|
||||
mkdir -p ~/.aws
|
||||
cat > ~/.aws/credentials << 'EOF'
|
||||
[default]
|
||||
aws_access_key_id = ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
aws_secret_access_key = ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
EOF
|
||||
cat > ~/.aws/config << 'EOF'
|
||||
[default]
|
||||
region = auto
|
||||
endpoint_url = ${{ secrets.CF_R2_ENDPOINT }}
|
||||
EOF
|
||||
|
||||
- name: Delete existing r folder
|
||||
env:
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
run: |
|
||||
aws s3 rm "s3://${CF_R2_BUCKET}/r/" --recursive
|
||||
|
||||
- name: Upload all release assets to R2
|
||||
env:
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
run: |
|
||||
for file in $(find ./release-assets -type f); do
|
||||
rel_path="${file#./release-assets/}"
|
||||
aws s3 cp "$file" "s3://${CF_R2_BUCKET}/r/${rel_path}" \
|
||||
--acl public-read \
|
||||
--cache-control "max-age=31536000"
|
||||
echo "Uploaded: ${rel_path}"
|
||||
done
|
||||
|
||||
- name: Verify uploads
|
||||
env:
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
run: |
|
||||
aws s3 ls "s3://${CF_R2_BUCKET}/r/" --recursive
|
||||
@@ -0,0 +1,55 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: win-appx
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, win-appx ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-2022
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip win]') && !contains(github.event.head_commit.message, '[skip appx]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.7' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g node-gyp
|
||||
|
||||
# before_install:
|
||||
# - run: npm install --global --production windows-build-tools --vs2015
|
||||
- run: npm install -g yarn
|
||||
- run: npm un node-pty serialport
|
||||
- run: npm i
|
||||
- run: npm i -S -E node-pty@1.1.0-beta14
|
||||
- run: npm i -S -E serialport@13.0.0
|
||||
|
||||
- name: Install R2 dependencies if store upload may run
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
|
||||
run: node build/bin/build-win-appx
|
||||
@@ -0,0 +1,68 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: win-arm
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, win-arm ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-11-arm
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip win]') && !contains(github.event.head_commit.message, '[skip win-arm]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g node-gyp
|
||||
|
||||
# before_install:
|
||||
# - run: npm install --global --production windows-build-tools --vs2015
|
||||
- run: npm install -g yarn
|
||||
- run: npm un node-pty serialport
|
||||
- run: npm i
|
||||
- run: npm i -S -E node-pty@1.1.0-beta14
|
||||
- run: npm i -S -E serialport@13.0.0
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
# check work/app/node_modules size in windows arm
|
||||
- name: Check node_modules size
|
||||
shell: powershell
|
||||
run: |
|
||||
$size = (Get-ChildItem -Path "work/app/node_modules" -Recurse | Measure-Object -Property Length -Sum).Sum
|
||||
$sizeInMB = [math]::Round($size / 1MB, 2)
|
||||
$sizeInGB = [math]::Round($size / 1GB, 2)
|
||||
Write-Host "work/app/node_modules size: $sizeInMB MB ($sizeInGB GB)"
|
||||
|
||||
- name: build
|
||||
if: ${{ !contains(github.event.head_commit.message, 'skip build') }}
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-win-arm
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: win-loose
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, win-loose ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-2022
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip win]') && !contains(github.event.head_commit.message, '[skip loose]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.7' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g node-gyp
|
||||
|
||||
# before_install:
|
||||
# - run: npm install --global --production windows-build-tools --vs2015
|
||||
- run: npm install -g yarn
|
||||
- run: npm un node-pty serialport
|
||||
- run: npm i
|
||||
- run: npm i -S -E node-pty@1.1.0-beta14
|
||||
- run: npm i -S -E serialport@13.0.0
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
|
||||
run: node build/bin/build-win-loose
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: win-arm-nsis
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, win-nsis-arm ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-11-arm
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip win]') && !contains(github.event.head_commit.message, '[skip win-nsis-arm]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g node-gyp
|
||||
|
||||
# before_install:
|
||||
# - run: npm install --global --production windows-build-tools --vs2015
|
||||
- run: npm install -g yarn
|
||||
- run: npm un node-pty serialport
|
||||
- run: npm i
|
||||
- run: npm i -S -E node-pty@1.1.0-beta14
|
||||
- run: npm i -S -E serialport@13.0.0
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
# check work/app/node_modules size in windows arm
|
||||
- name: Check node_modules size
|
||||
shell: powershell
|
||||
run: |
|
||||
$size = (Get-ChildItem -Path "work/app/node_modules" -Recurse | Measure-Object -Property Length -Sum).Sum
|
||||
$sizeInMB = [math]::Round($size / 1MB, 2)
|
||||
$sizeInGB = [math]::Round($size / 1GB, 2)
|
||||
Write-Host "work/app/node_modules size: $sizeInMB MB ($sizeInGB GB)"
|
||||
|
||||
- name: build
|
||||
if: ${{ !contains(github.event.head_commit.message, 'skip build') }}
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-win-nsis-arm
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: win-nsis
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, win-nsis ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-2022
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip win]') && !contains(github.event.head_commit.message, '[skip nsis]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.7' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g node-gyp
|
||||
|
||||
# before_install:
|
||||
# - run: npm install --global --production windows-build-tools --vs2015
|
||||
- run: npm install -g yarn
|
||||
- run: npm un node-pty serialport
|
||||
- run: npm i
|
||||
- run: npm i -S -E node-pty@1.1.0-beta14
|
||||
- run: npm i -S -E serialport@13.0.0
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
|
||||
run: node build/bin/build-win-nsis
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: win-portable
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, win-portable ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-2022
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip win]') && !contains(github.event.head_commit.message, '[skip portable]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.7' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g node-gyp
|
||||
|
||||
# before_install:
|
||||
# - run: npm install --global --production windows-build-tools --vs2015
|
||||
- run: npm install -g yarn
|
||||
- run: npm un node-pty serialport
|
||||
- run: npm i
|
||||
- run: npm i -S -E node-pty@1.1.0-beta14
|
||||
- run: npm i -S -E serialport@13.0.0
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-win-portable
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: win-tar
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, win-tar ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-2022
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip win]') && !contains(github.event.head_commit.message, '[skip win-tar]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 24.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24.x
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.7' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g node-gyp
|
||||
|
||||
# before_install:
|
||||
# - run: npm install --global --production windows-build-tools --vs2015
|
||||
- run: npm install -g yarn
|
||||
- run: npm un node-pty serialport
|
||||
- run: npm i
|
||||
- run: npm i -S -E node-pty@1.1.0-beta14
|
||||
- run: npm i -S -E serialport@13.0.0
|
||||
|
||||
- name: Install R2 dependencies if needed fix
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-win-tar
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: win7-tar
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ build, test, build-only, win7-tar, legacy-build ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-2022
|
||||
environment: build
|
||||
if: ${{ !contains(github.event.head_commit.message, '[skip build]') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[skip win]') && !contains(github.event.head_commit.message, '[skip win7-tar]') }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js 16.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 16.x
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.7' # Version range or exact version of a Python version to use, using SemVer's version range syntax
|
||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
||||
- run: npm config set legacy-peer-deps true
|
||||
- run: npm install -g node-gyp
|
||||
|
||||
# before_install :
|
||||
# - run: npm install --global --production windows-build-tools --vs2015
|
||||
- run: npm install -g yarn
|
||||
- name: Update electron version and remove package-lock
|
||||
run: |
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const pkg = JSON.parse(fs.readFileSync('package.json'));
|
||||
pkg.devDependencies.electron = '22.3.27';
|
||||
pkg.devDependencies['electron-builder'] = '26.0.20';
|
||||
pkg.devDependencies['@electron/rebuild'] = '3.7.2';
|
||||
pkg.dependencies['node-pty'] = '1.1.0-beta14';
|
||||
pkg.dependencies.serialport = '13.0.0';
|
||||
pkg.devDependencies.vite = '4';
|
||||
pkg.devDependencies['@vitejs/plugin-react'] = '4.7.0';
|
||||
pkg.dependencies['os-locale-s'] = '1.0.8';
|
||||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
|
||||
fs.unlinkSync('package-lock.json');
|
||||
"
|
||||
- run: npm i
|
||||
- run: npm i -S @electron/rebuild@3.7.2
|
||||
|
||||
- name: Install R2 dependencies if needed
|
||||
if: ${{ contains(github.event.head_commit.message, '[r2]') }}
|
||||
run: npm i -D @aws-sdk/client-s3
|
||||
|
||||
# script:
|
||||
- run: npm run b
|
||||
|
||||
- name: Run pb
|
||||
run: npm run pb
|
||||
|
||||
- name: build
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BUILD_NUMBER: ${{ secrets.BUILD_NUMBER }}
|
||||
WORKFLOW_NAME: ${{ github.workflow }}
|
||||
CF_R2_ACCOUNT_ID: ${{ secrets.CF_R2_ACCOUNT_ID }}
|
||||
CF_R2_BUCKET: ${{ secrets.CF_R2_BUCKET }}
|
||||
CF_R2_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
CF_R2_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_SECRET_ACCESS_KEY }}
|
||||
run: node build/bin/build-win7-tar
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
name: Publish to WinGet
|
||||
on:
|
||||
release:
|
||||
types: [released]
|
||||
push:
|
||||
branches: [ test-winget ]
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-24.04
|
||||
environment: build
|
||||
steps:
|
||||
- uses: vedantmgoyal9/winget-releaser@main
|
||||
with:
|
||||
identifier: electerm.electerm
|
||||
installers-regex: 'win-x64-installer.exe$'
|
||||
max-versions-to-keep: 30
|
||||
token: ${{ secrets.WINGET_TOKEN }}
|
||||
Reference in New Issue
Block a user