Skip to content

feat: add installer build script and release workflow#74

Merged
wysaid merged 3 commits intomasterfrom
installer
Feb 8, 2026
Merged

feat: add installer build script and release workflow#74
wysaid merged 3 commits intomasterfrom
installer

Conversation

@wysaid
Copy link
Copy Markdown
Collaborator

@wysaid wysaid commented Feb 8, 2026

Add automated installer packaging using ege-installer to produce a single ege-installer-<version>.exe for end users.

Changes

CI/CD

  • .github/workflows/release.yml: GitHub Actions workflow triggered by v* tags
    • Clones ege-installer, installs NSIS, builds exe installer package
    • Publishes to GitHub Releases with version info and download instructions
    • Also supports manual workflow_dispatch with optional version override

Build tooling

  • build-installer.sh: Local build script for developers
    • Clones/updates ege-installer on demand (no submodule needed)
    • Reads version from version.txt or accepts -v override
    • Calls build.ps1 via PowerShell to produce dist/ege-installer-<version>.exe
    • Supports --clean to reset cached ege-installer

Configuration

  • .gitignore: Added dist/ and ege-installer/ to ignore build artifacts

Design Decisions

Script clone vs Git submodule

Chose on-demand script clone over git submodule because:

  • ege-installer is a build tool, not a code dependency
  • Avoids forcing all contributors to pull unneeded packaging code
  • CI clones it fresh each time (consistent, no stale submodule issues)
  • Aligns with ege-installer's own CI design (setup.ps1 -Auto)

Filename: ege-installer (not ege-setup)

Output filename is ege-installer-*.exe for clarity:

Usage

Local build (requires NSIS 3.11+):

./build-installer.sh                # version from version.txt
./build-installer.sh -v 25.11.0    # manual version
./build-installer.sh --clean        # clean rebuild

Release via CI:

git tag v25.11.0
git push origin v25.11.0
# -> GitHub Actions builds and publishes ege-installer-25.11.0.exe

Summary by CodeRabbit

发布说明

  • 新功能

    • 新增自动化发布流程,支持通过版本标签或手动触发自动构建和发布安装程序。
  • Chores

    • 更新构建配置以支持自动化安装程序生成和发布工作流程。

Copilot AI review requested due to automatic review settings February 8, 2026 16:22
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 8, 2026

Caution

Review failed

The pull request is closed.

Walkthrough

新增 GitHub Actions 工作流 .github/workflows/release.yml(标签与手动触发)和本地构建脚本 build-installer.sh,并更新 .gitignore,用于克隆/构建 ege-installer、生成 NSIS 安装程序、产出 dist 制品并在标签触发时创建 Release。

Changes

Cohort / File(s) Summary
CI/CD 工作流
.github/workflows/release.yml
新增“Release Installer” 工作流:触发器为 tag 推送(v*)和 workflow_dispatch;克隆 ege-installer,安装 NSIS,确定版本并计算 NSIS ProductVersion,调用上游 build.ps1 构建,上传 dist 制品并在标签触发时创建带中文正文的 GitHub Release(草稿/预发布)。
本地构建脚本
build-installer.sh
新增 Bash 脚本:支持从 version.txt-v/--version 指定版本,支持 --clean,克隆/更新 ege-installer,校验 include/lib/,进行路径转换并调用 PowerShell build.ps1,将生成的 ege-installer-<version>.exe 复制到本地 dist/
构建输出忽略规则
.gitignore
修改忽略规则:添加 temp/dist/ege-installer/(并移除先前的否定项),以排除临时文件、构建产物和外部克隆目录。

Sequence Diagram(s)

sequenceDiagram
    participant User as 用户
    participant GH as GitHub Actions
    participant Repo as 本仓库
    participant ExtRepo as ege-installer
    participant BuildPS as build.ps1
    participant Artifact as 制品(dist)
    participant Release as GitHub Release

    User->>GH: 推送 v* 标签 或 手动触发 workflow_dispatch
    GH->>Repo: 检出并运行 `.github/workflows/release.yml`
    Repo->>ExtRepo: 克隆或更新 ege-installer
    GH->>GH: 决定版本(input > tag > version.txt > 1.0.0)
    GH->>ExtRepo: 安装 NSIS 并调用 BuildPS(Version, ProductVersion)
    ExtRepo->>BuildPS: 执行构建(NSIS)
    BuildPS->>Artifact: 生成 `ege-installer-<version>.exe` 到 dist/
    GH->>Artifact: 上传 dist 作为 action 制品
    GH->>Release: 若为 tag,则创建 Release 并附加 exe(草稿/预发布,含中文正文)
Loading

Estimated code review effort

🎯 3 (中等) | ⏱️ ~20 分钟

Poem

🐰 我从树梢带来新脚本,
一键抓取、编译又打包,
标签一跃,安装器出炉,
中文说明摆上桌前,
小兔捧着 dist 分享喜悦。

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed 标题准确地总结了主要变更:添加安装程序构建脚本和发布工作流,与PR目标完全一致。
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch installer

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@augmentcode
Copy link
Copy Markdown

augmentcode bot commented Feb 8, 2026

🤖 Augment PR Summary

Summary: Adds automated Windows installer packaging for xege-sdk using ege-installer to produce a single ege-setup-<version>.exe for end users.

Changes:

  • Introduces a GitHub Actions release workflow triggered by v* tags (plus manual workflow_dispatch) to build an NSIS installer and publish it to GitHub Releases.
  • Adds version resolution logic (dispatch input → tag name → version.txt) and derives an NSIS-friendly 4-part product version for the installer metadata.
  • Adds a local build-installer.sh script to clone/update ege-installer, read/override the version, invoke build.ps1, and copy the resulting EXE into dist/.
  • Updates .gitignore to ignore dist/ outputs and the locally cloned ege-installer/ directory.

Technical Notes: CI runs on windows-latest, installs NSIS via Chocolatey, then uploads the built EXE as an artifact and attaches it to the GitHub Release on tag builds.

🤖 Was this summary useful? React with 👍 or 👎

Copy link
Copy Markdown

@augmentcode augmentcode bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review completed. 3 suggestions posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.


- name: Clone ege-installer
run: |
git clone --depth 1 https://github.com/x-ege/ege-installer.git ege-installer
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This clones ege-installer from the default branch at build time, which can make tagged releases non-reproducible (and increases supply-chain risk if ege-installer changes); consider pinning to a known tag/commit for release builds.

Severity: medium

Other Locations
  • build-installer.sh:63
  • build-installer.sh:68

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.


Write-Host "Display Version: $version"
Write-Host "Product Version: $productVersion"
"VERSION=$version" >> $env:GITHUB_OUTPUT
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since $version is written directly to $GITHUB_OUTPUT, a version containing newlines or other special characters could corrupt outputs and break downstream steps; consider validating/normalizing it to a single safe token before exporting.

Severity: medium

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

case "$1" in
-v | --version)
CUSTOM_VERSION="$2"
shift 2
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If -v/--version is provided without a following value, shift 2 (with set -e) will terminate the script with a non-obvious error; consider explicitly checking that $2 is present before shifting.

Severity: medium

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In @.github/workflows/release.yml:
- Around line 57-67: The current fallback silently sets $version = "1.0.0" when
$version is empty and version.txt is missing; update the block that uses
$versionFile/Test-Path/Get-Content/Write-Host so that instead of assigning
"1.0.0" it emits a visible error and exits (e.g., use Write-Error and exit 1)
when no version can be determined—this ensures tag-triggered releases cannot
proceed with an incorrect default version; if you prefer a softer approach,
replace the silent assignment with a prominent Write-Host warning and fail the
job for tag-triggered workflows.
- Around line 70-82: The current logic leaves $productVersion unchanged when it
contains more than four segments (e.g., "1.2.3.4.5"); after splitting into
$parts (the line assigning $parts = $productVersion.Split('.')), add a
truncation step that, if $parts.Length -gt 4, reduces $parts to the first four
elements and then reassigns $productVersion by joining those four segments (so
subsequent checks and NSIS/VIProductVersion use a strict X.X.X.X format). Ensure
this uses the existing $productVersion and $parts variables so other branches
still work.
- Around line 37-55: The workflow currently injects github.event.inputs.version
and github.ref directly into the PowerShell run script (variables $inputVersion
and $ref), creating a script-injection risk; change the job to pass these values
via environment variables (e.g. set env: INPUT_VERSION: ${{
github.event.inputs.version }} and env: GITHUB_REF: ${{ github.ref }}) and in
the script read them via $env:INPUT_VERSION and $env:GITHUB_REF, then
validate/sanitize before use (for example use a strict regex to allow only
semantic version characters or extract tag with -match "^refs/tags/v(.+)$"
against $env:GITHUB_REF and assign to $version only if it passes the regex),
thereby removing direct interpolation of ${ { github.* }} into the run block and
ensuring $inputVersion, $ref and $version are derived from validated environment
variables.
🧹 Nitpick comments (4)
build-installer.sh (3)

16-17: set -e 应在 cd 之前,确保 cd 失败时脚本也能退出。

当前 set -ecd 之后,如果 cd 失败(例如脚本所在目录被删除),脚本会在错误的工作目录下继续执行。

建议调整顺序
+set -e
 cd "$(dirname "$0")"
-set -e

30-32: -v 缺少参数值校验,用户误用时报错不友好。

如果用户执行 ./build-installer.sh -v(不带版本号),$2 为空,CUSTOM_VERSION 被设为空字符串,然后 shift 2 在只剩一个参数时会失败。虽然 set -e 会使脚本退出,但错误信息不直观。

建议添加参数存在性检查
     -v | --version)
+        if [[ -z "${2:-}" ]]; then
+            echo "Error: -v/--version requires a version argument."
+            exit 1
+        fi
         CUSTOM_VERSION="$2"
         shift 2

131-140: 日志输出与实际执行的路径不一致。

第 131 行将 BUILD_SCRIPT 转为 Windows 路径存入 BUILD_SCRIPT_WIN,第 133 行日志打印的是 $BUILD_SCRIPT_WIN,但第 138 行实际传给 powershell -File 的却是未转换的 $BUILD_SCRIPT(Unix 路径)。

虽然 MSYS2 会自动转换传给 Windows 可执行程序的路径参数,所以实际运行可能没有问题,但日志与实际命令不一致会给排查问题带来困惑。建议统一:

使用转换后的 Windows 路径调用 PowerShell
 echo "Running: powershell $BUILD_SCRIPT_WIN"
 echo ""

 powershell -NoProfile -ExecutionPolicy Bypass -File "$BUILD_SCRIPT_WIN" \
     -XegeLibsPath "$XEGE_LIBS_WIN" \
     -Version "$EGE_VERSION"

或者如果确认依赖 MSYS 自动转换,则日志也应打印实际使用的路径:

-echo "Running: powershell $BUILD_SCRIPT_WIN"
+echo "Running: powershell $BUILD_SCRIPT"
.github/workflows/release.yml (1)

31-32: NSIS 未固定版本,可能影响构建可复现性。

choco install nsis -y 会安装最新版。如果 NSIS 更新引入了不兼容变更,可能导致构建意外失败。可考虑固定版本以提升 CI 稳定性。

固定 NSIS 版本示例
-        run: choco install nsis -y
+        run: choco install nsis --version=3.11 -y

Comment on lines +37 to +55
run: |
# Priority: workflow input > tag name > version.txt
$version = ""

# 1. Check workflow_dispatch input
$inputVersion = "${{ github.event.inputs.version }}"
if ($inputVersion) {
$version = $inputVersion
Write-Host "Using workflow input version: $version"
}

# 2. Check tag name
if (-not $version) {
$ref = "${{ github.ref }}"
if ($ref -match "^refs/tags/v(.+)$") {
$version = $matches[1]
Write-Host "Using tag version: $version"
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

脚本注入风险:github.event.inputs.versiongithub.ref 直接内插到 run 脚本中。

${{ github.event.inputs.version }}(第 42 行)和 ${{ github.ref }}(第 50 行)直接拼入 PowerShell 脚本,存在脚本注入风险。虽然 workflow_dispatch 仅限仓库协作者触发,但这是 GitHub Actions 安全最佳实践中明确反对的模式。恶意或错误的输入(如包含 "; 的版本号)可能导致任意命令执行。

推荐做法是通过环境变量传递,避免直接内插:

建议使用环境变量替代直接内插
      - name: Determine version
        id: version
        shell: pwsh
+       env:
+         INPUT_VERSION: ${{ github.event.inputs.version }}
+         GH_REF: ${{ github.ref }}
        run: |
          # Priority: workflow input > tag name > version.txt
          $version = ""

          # 1. Check workflow_dispatch input
-         $inputVersion = "${{ github.event.inputs.version }}"
+         $inputVersion = $env:INPUT_VERSION
          if ($inputVersion) {
            $version = $inputVersion
            Write-Host "Using workflow input version: $version"
          }

          # 2. Check tag name
          if (-not $version) {
-           $ref = "${{ github.ref }}"
+           $ref = $env:GH_REF
            if ($ref -match "^refs/tags/v(.+)$") {
              $version = $matches[1]
              Write-Host "Using tag version: $version"
            }
          }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
run: |
# Priority: workflow input > tag name > version.txt
$version = ""
# 1. Check workflow_dispatch input
$inputVersion = "${{ github.event.inputs.version }}"
if ($inputVersion) {
$version = $inputVersion
Write-Host "Using workflow input version: $version"
}
# 2. Check tag name
if (-not $version) {
$ref = "${{ github.ref }}"
if ($ref -match "^refs/tags/v(.+)$") {
$version = $matches[1]
Write-Host "Using tag version: $version"
}
}
- name: Determine version
id: version
shell: pwsh
env:
INPUT_VERSION: ${{ github.event.inputs.version }}
GH_REF: ${{ github.ref }}
run: |
# Priority: workflow input > tag name > version.txt
$version = ""
# 1. Check workflow_dispatch input
$inputVersion = $env:INPUT_VERSION
if ($inputVersion) {
$version = $inputVersion
Write-Host "Using workflow input version: $version"
}
# 2. Check tag name
if (-not $version) {
$ref = $env:GH_REF
if ($ref -match "^refs/tags/v(.+)$") {
$version = $matches[1]
Write-Host "Using tag version: $version"
}
}
🤖 Prompt for AI Agents
In @.github/workflows/release.yml around lines 37 - 55, The workflow currently
injects github.event.inputs.version and github.ref directly into the PowerShell
run script (variables $inputVersion and $ref), creating a script-injection risk;
change the job to pass these values via environment variables (e.g. set env:
INPUT_VERSION: ${{ github.event.inputs.version }} and env: GITHUB_REF: ${{
github.ref }}) and in the script read them via $env:INPUT_VERSION and
$env:GITHUB_REF, then validate/sanitize before use (for example use a strict
regex to allow only semantic version characters or extract tag with -match
"^refs/tags/v(.+)$" against $env:GITHUB_REF and assign to $version only if it
passes the regex), thereby removing direct interpolation of ${ { github.* }}
into the run block and ensuring $inputVersion, $ref and $version are derived
from validated environment variables.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds automated packaging for an end-user Windows installer (ege-setup-<version>.exe) via a local build script and a tag-triggered GitHub Actions release workflow, using the external x-ege/ege-installer project.

Changes:

  • Added build-installer.sh for local installer builds (clone/update ege-installer, read version, invoke build.ps1, copy output to dist/).
  • Added .github/workflows/release.yml to build the installer on v* tags (and manual dispatch) and publish it to GitHub Releases.
  • Updated .gitignore to ignore dist/ and the cloned ege-installer/ directory.

Reviewed changes

Copilot reviewed 2 out of 3 changed files in this pull request and generated 4 comments.

File Description
build-installer.sh New local script to build the Windows installer via ege-installer tooling.
.github/workflows/release.yml New CI workflow to build/publish the installer on tags and upload artifacts.
.gitignore Ignores generated installer output and the cloned installer tool repo.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +58 to +66
if (-not $version) {
$versionFile = "${{ github.workspace }}\version.txt"
if (Test-Path $versionFile) {
$version = (Get-Content $versionFile -Raw).Trim()
Write-Host "Using version.txt: $version"
} else {
$version = "1.0.0"
Write-Host "Fallback version: $version"
}
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If neither a workflow input nor a tag is present, the workflow falls back to 1.0.0 when version.txt is missing. For a release pipeline, silently defaulting to an arbitrary version is error-prone; it should fail with a clear error so accidental releases don’t get published under the wrong version.

Copilot uses AI. Check for mistakes.
Comment on lines +30 to +33
-v | --version)
CUSTOM_VERSION="$2"
shift 2
;;
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The -v/--version option assumes a value exists in $2; if the user passes -v as the last argument, shift 2 will fail (and with set -e the script exits) without a clear error. Add an explicit check for a missing/empty version argument and print usage before exiting.

Copilot uses AI. Check for mistakes.

# 注意:build.ps1 的 NSIS 输出路径被硬编码为 ege-installer/dist/
# 不传 OutputDir,让 build.ps1 使用默认值,之后再复制到本地 dist/
powershell -NoProfile -ExecutionPolicy Bypass -File "$BUILD_SCRIPT" \
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BUILD_SCRIPT_WIN is computed and logged, but the actual PowerShell invocation uses the POSIX path in $BUILD_SCRIPT. In Git Bash/MSYS, passing a /c/... path to powershell -File can be interpreted as a switch and fail. Use the Windows-converted path consistently (or otherwise ensure -File receives a PowerShell-safe path).

Suggested change
powershell -NoProfile -ExecutionPolicy Bypass -File "$BUILD_SCRIPT" \
powershell -NoProfile -ExecutionPolicy Bypass -File "$BUILD_SCRIPT_WIN" \

Copilot uses AI. Check for mistakes.

- name: Clone ege-installer
run: |
git clone --depth 1 https://github.com/x-ege/ege-installer.git ege-installer
Copy link

Copilot AI Feb 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This workflow clones and executes ege-installer from GitHub without pinning to a tag/commit. For release automation, this creates a supply-chain risk and makes releases non-reproducible if ege-installer changes. Pin the clone to a known-good ref (tag/SHA) and update it intentionally when needed.

Suggested change
git clone --depth 1 https://github.com/x-ege/ege-installer.git ege-installer
# NOTE: Pin to a known-good tag or commit SHA to ensure reproducible, secure builds.
# Update <PINNED_EGE_INSTALLER_REF> intentionally when upgrading ege-installer.
git clone --depth 1 --branch <PINNED_EGE_INSTALLER_REF> https://github.com/x-ege/ege-installer.git ege-installer

Copilot uses AI. Check for mistakes.
@wysaid wysaid added the enhancement New feature or request label Feb 8, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @.github/workflows/release.yml:
- Around line 89-95: Validate and sanitize the version output in the "Determine
version" step (e.g., enforce a regex like ^\d+(\.\d+)*[-\w]*$ and fail the step
if it doesn't match) to prevent malicious values from being written to
GITHUB_OUTPUT, and stop relying on direct interpolation of
steps.version.outputs.VERSION in consumer steps; update the "Build installer
package" step (and other consumers referencing steps.version.outputs.VERSION) to
receive the version via environment variables (env: VERSION: ${{
steps.version.outputs.VERSION }}) and then reference the env variable within the
run block instead of using ${{ ... }} so untrusted workflow output cannot be
injected directly into shell commands.
- Around line 31-32: Update the GitHub Actions step that installs NSIS (the
"Install NSIS" run step) to pin the package to a specific version instead of
using `choco install nsis -y`; change it to install NSIS 3.11 (or a specific
3.11.x patch) by passing the --version argument (e.g., --version=3.11) so builds
are reproducible and use the patched release that fixes the CVE.
🧹 Nitpick comments (3)
.github/workflows/release.yml (3)

27-29: ege-installer 未固定到特定提交或标签,存在供应链与构建可重现性风险。

当前 git clone --depth 1 始终拉取 ege-installer 的默认分支最新提交。如果上游仓库被篡改或引入了破坏性变更,发布流水线将在无预警的情况下受到影响。

建议固定到已知可信的提交哈希或标签:

建议固定提交哈希
-          git clone --depth 1 https://github.com/x-ege/ege-installer.git ege-installer
+          git clone --depth 1 --branch <known-tag-or-branch> https://github.com/x-ege/ege-installer.git ege-installer
+          cd ege-installer
+          git verify-commit HEAD || true  # optional: verify if signed
+          # Or pin to a specific commit:
+          # git clone https://github.com/x-ege/ege-installer.git ege-installer
+          # cd ege-installer && git checkout <trusted-commit-sha>

17-19: 建议添加 concurrency 控制和作业超时。

当前工作流没有 concurrency 组和 timeout-minutes 设定:

  • 如果短时间内推送多个 v* 标签,可能会并行运行多个发布作业,产生竞态。
  • 没有超时的作业在卡住时会一直运行到 GitHub 默认的 6 小时上限。
建议添加 concurrency 和 timeout
 jobs:
   build-and-release:
     runs-on: windows-latest
+    timeout-minutes: 30
+    concurrency:
+      group: release-installer
+      cancel-in-progress: false

22-25: fetch-depth: 0 对当前用途不是必需的。

工作流仅从标签名或 version.txt 获取版本号,不需要完整的 git 历史。fetch-depth: 0 会拉取全部提交历史,对于大型仓库会增加 checkout 时间。

如果没有其他需要完整历史的原因(如生成 changelog),可以改为默认的浅克隆:

建议移除 fetch-depth: 0
      - name: Checkout repository
        uses: actions/checkout@v4
-       with:
-         fetch-depth: 0

Security improvements:
- Pin NSIS to version 3.11 for reproducible builds
- Add version format validation (X.Y.Z with optional suffix)

Best practices:
- Add concurrency control to prevent parallel releases
- Add 30-minute timeout to prevent hanging jobs
- Remove unnecessary fetch-depth: 0 (only version.txt needed)

Design decisions (intentionally not changed):
- Keep ege-installer on latest (not pinned): We control the upstream
  and want immediate bug fixes and new IDE support. This is a conscious
  trade-off favoring flexibility over hermetic builds.
Workflow improvements:
- Fail fast for tag releases when version cannot be determined
- Truncate productVersion to 4 segments if longer (NSIS requirement)
- Clarify fallback 1.0.0 is for manual workflow only

build-installer.sh improvements:
- Move 'set -e' before 'cd' to catch directory change errors
- Add parameter validation for -v/--version flag
- Use BUILD_SCRIPT_WIN consistently in PowerShell invocation
- Improve log message clarity
@wysaid wysaid merged commit 52fea90 into master Feb 8, 2026
10 of 11 checks passed
@wysaid wysaid deleted the installer branch February 8, 2026 16:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants