news 2026/4/3 6:10:30

开源Electron应用GitHubActions自动化部署与升级指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开源Electron应用GitHubActions自动化部署与升级指南

开源 Electron 应用 GitHub Actions 自动化部署与升级指南

一、前言

本文详细介绍如何利用 GitHub Actions 实现 Electron 应用的自动化构建、发布及通过 UpgradeLink 实现应用自动更新功能。通过本指南,你将学会配置
GitHub Actions 工作流,完成从代码提交到应用更新的全自动化流程。

二、核心工具介绍

1. UpgradeLink GitHub Action

UpgradeLink 提供的 GitHub Action 插件,用于将 Electron 应用生成的更新文件上传至 UpgradeLink 服务器,
UpgradeLink 读取json文件中应用文件的地址,保存文件,自动实现应用版本文件的创建,和对应升级策略的创建。

  • 项目地址

2.已经跑完全部流程的示例项目

流程的示例项目

  • 示例项目 electron-demo

三、工作流说明

工作流分为三个主要作业:

  1. electron-build:构建并发布 Electron 应用打包不同端与架构的安装包

    • 跨平台构建:同时支持 macOS、Linux 和 Windows
    • 版本号提取:从 Electron 构建输出中提取应用版本号
  2. electron-release:根据electron-build构建输出的包,进行 Releases 版本发布

    • 发布管理:自动创建 GitHub Release 并上传应用安装包
    • 输出参数:输出应用版本号,用于后续作业
  3. upgradeLink-upload:将更新信息同步到 UpgradeLink

    • 依赖关系:等待 上面两个作业 作业完成
    • 版本感知:通过输出参数获取应用版本号
    • API 调用:使用 UpgradeLink Action 将对应的安装包上传至升级服务器

四、接入步骤详解

1. 前期准备

首先需要确保:

  • 已创建 GitHub 仓库并上传 Electron 应用代码
  • 拥有 UpgradeLink 平台的账号并获取以下凭证:
    • ACCESS_KEY(访问密钥) 密钥信息
    • ELECTRON_KEY(应用唯一标识) 应用信息
  • 在 UpgradeLink平台的 electron 应用配置中,配置上 github 仓库的地址。

2. 配置 GitHub Secrets

在 GitHub 仓库的 Settings > Security > Secrets and variables > Actions 中添加以下加密环境变量:

Secret 名称说明
UPGRADE_LINK_ACCESS_KEYUpgradeLink 平台提供的访问密钥,用于 API 调用身份验证
UPGRADE_LINK_ELECTRON_KEYUpgradeLink 平台为你的 Electron 应用分配的唯一标识

3. 编辑 electron-demo/.github/workflows/main.yml github-Action文件,根据自己的需要,进行调整。

name: 'publish' on: push: branches: - main tags: - '*.*.*' jobs: electron-build: outputs: appVersion: ${{ steps.extract-version.outputs.appVersion }} permissions: contents: write strategy: fail-fast: false matrix: include: # Linux 平台 - platform: ubuntu-22.04 target: x86_64-unknown-linux-gnu artifact-name: ubuntu-x86_64 arch-suffix: x64 # 直接定义完整的构建命令,包含通道信息 build-command: "yarn electron-builder --linux --x64 --publish always --config.publish.channel=latest-linux" - platform: ubuntu-22.04 target: aarch64-unknown-linux-gnu artifact-name: ubuntu-aarch64 arch-suffix: arm64 build-command: "yarn electron-builder --linux --arm64 --publish always --config.publish.channel=latest-linux" # macOS 平台 - platform: macos-latest target: aarch64-apple-darwin artifact-name: macos-arm64 arch-suffix: arm64 build-command: "yarn electron-builder --mac --arm64 --publish always --config.publish.channel=latest-mac" - platform: macos-latest target: x86_64-apple-darwin artifact-name: macos-x64 arch-suffix: x64 build-command: "yarn electron-builder --mac --x64 --publish always --config.publish.channel=latest-mac" # Windows 平台 - platform: windows-latest target: x86_64-pc-windows-msvc artifact-name: windows-x64 arch-suffix: x64 build-command: "yarn electron-builder --win --x64 --publish always --config.publish.channel=latest-win" runs-on: ${{ matrix.platform }} steps: - uses: actions/checkout@v4 - name: setup node uses: actions/setup-node@v4 with: node-version: lts/* cache: 'yarn' - name: Install dependencies with yarn run: yarn install - name: List installed dependencies run: yarn list - name: install dependencies (ubuntu only) if: startsWith(matrix.platform, 'ubuntu') run: | sudo apt-get update sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf xdg-utils - name: install dependencies (macos only) if: matrix.platform == 'macos-latest' run: | brew install automake autoconf libtool - name: install frontend dependencies run: yarn install - name: Install rimraf run: yarn add rimraf --dev - name: Build Electron App # 直接执行矩阵中定义的完整构建命令 run: ${{ matrix.build-command }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Cleanup Artifacts for Linux if: startsWith(matrix.platform, 'ubuntu') run: | mkdir -p dist-temp find dist -maxdepth 1 -type f \( -name "*.AppImage" -o -name "*.yml" -o -name "*.zip" \) -exec cp {} dist-temp/ \; rm -rf dist mv dist-temp dist echo "保留的发布文件:" ls -la dist - name: Cleanup Artifacts for macOS if: matrix.platform == 'macos-latest' run: | mkdir -p dist-temp find dist -maxdepth 1 -type f \( -name "*.dmg" -o -name "*.pkg" -o -name "*.zip" -o -name "*.yml" \) -exec cp {} dist-temp/ \; rm -rf dist mv dist-temp dist echo "保留的发布文件:" ls -la dist - name: Cleanup Artifacts for Windows if: matrix.platform == 'windows-latest' run: | New-Item -ItemType Directory -Path dist-temp -Force | Out-Null Get-ChildItem -Path dist -File | Where-Object { $_.Name -like "*.exe" -or $_.Name -like "*.msi" -or $_.Name -like "*.zip" -or $_.Name -like "*.yml" } | Copy-Item -Destination dist-temp/ Remove-Item -Path dist -Recurse -Force Rename-Item -Path dist-temp -NewName dist Write-Host "保留的发布文件:" Get-ChildItem -Path dist - name: Rename files with architecture suffix (Linux/macOS) if: startsWith(matrix.platform, 'ubuntu') || matrix.platform == 'macos-latest' run: | cd dist ARCH_SUFFIX="${{ matrix.arch-suffix }}" if [ "$ARCH_SUFFIX" != "x64" ] && [ "$ARCH_SUFFIX" != "arm64" ]; then echo "错误: 架构后缀不正确 - $ARCH_SUFFIX" exit 1 fi # 先处理重复平台标识 for file in *.yml; do if [ -f "$file" ]; then # 固定替换 -linux-linux 为 -linux if [[ "$file" == *-linux-linux* ]]; then new_file="${file//-linux-linux/-linux}" mv "$file" "$new_file" echo "替换重复标识: $file -> $new_file" file="$new_file" fi # 固定替换 -mac-mac 为 -mac if [[ "$file" == *-mac-mac* ]]; then new_file="${file//-mac-mac/-mac}" mv "$file" "$new_file" echo "替换重复标识: $file -> $new_file" file="$new_file" fi # 固定替换 x86_64-x64 为 -x64 if [[ "$file" == *-x86_64-x64* ]]; then new_file="${file//x86_64-x64/-x64}" mv "$file" "$new_file" echo "替换重复标识: $file -> $new_file" file="$new_file" fi # 处理架构后缀 if [[ "$file" != *-"$ARCH_SUFFIX".* ]]; then filename="${file%.*}" extension="${file#$filename}" new_filename="${filename}-${ARCH_SUFFIX}${extension}" mv "$file" "$new_filename" echo "添加架构后缀: $file -> $new_filename" else echo "文件已处理完成: $file" fi fi done echo "最终文件列表:" ls -l - name: Rename files with architecture suffix (Windows) if: matrix.platform == 'windows-latest' run: | cd dist $ARCH_SUFFIX = "${{ matrix.arch-suffix }}" if ($ARCH_SUFFIX -ne "x64" -and $ARCH_SUFFIX -ne "arm64") { Write-Error "错误: 架构后缀不正确 - $ARCH_SUFFIX" exit 1 } Get-ChildItem -File | ForEach-Object { $file = $_ if ($file.Name -match "-$ARCH_SUFFIX\.[^.]+$") { Write-Host "文件已包含架构后缀: $($file.Name)" } else { $filename = $file.BaseName $extension = $file.Extension $new_filename = "$filename-$ARCH_SUFFIX$extension" Rename-Item -Path $file.FullName -NewName $new_filename Write-Host "重命名: $($file.Name) -> $new_filename" } } Write-Host "重命名后的文件:" Get-ChildItem -File - name: Extract version id: extract-version run: | # 优先从标签获取版本号 if [[ "${{ github.ref }}" == refs/tags/* ]]; then VERSION=${{ github.ref_name }} else # 如果不是标签推送,从package.json读取版本号 VERSION=$(node -p "require('./package.json').version") # 或者使用固定的默认值 # VERSION="dev-$(date +%Y%m%d)" fi echo "appVersion=$VERSION" >> $GITHUB_OUTPUT echo "Extracted version: $VERSION" shell: bash - name: Upload artifacts uses: actions/upload-artifact@v4.0.0 with: name: ${{ matrix.artifact-name }} path: dist/* if-no-files-found: error electron-release: needs: electron-build runs-on: ubuntu-22.04 permissions: contents: write steps: - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts merge-multiple: false - name: Verify artifact files run: | echo "下载的文件结构:" tree artifacts if [ -z "$(find artifacts -type f)" ]; then echo "错误: 没有找到任何artifact文件" exit 1 fi - name: Prepare release files run: | mkdir -p release-files find artifacts -type f -exec cp {} release-files/ \; echo "准备发布的文件:" ls -l release-files - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ needs.electron-build.outputs.appVersion }} name: Release ${{ needs.electron-build.outputs.appVersion }} files: release-files/* draft: false prerelease: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
4. 引入 upgradelink-action模块。替换对应的信息
upgradeLink-upload: # 同时依赖 electron-build 和 electron-release,确保能访问 electron-build 的输出 needs: [ electron-build, electron-release ] permissions: contents: write runs-on: ubuntu-latest steps: - name: Send a request to UpgradeLink uses: toolsetlink/upgradelink-action-electron@v1.0.1 with: source-url: 'https://github.com/toolsetlink/electron-demo/releases/download/${{ needs.electron-build.outputs.appVersion }}' access-key: ${{ secrets.UPGRADE_LINK_ACCESS_KEY }} # ACCESS_KEY 密钥key electron-key: ${{ secrets.UPGRADE_LINK_ELECTRON_KEY }} # ELECTRON_KEY electron 应用唯一标识 github-token: ${{ secrets.GITHUB_TOKEN }} version: ${{ needs.electron-build.outputs.appVersion }} prompt-upgrade-content: '提示升级内容'

五、常见问题与解决方案

1. 签名问题

  • macOS
    应用程序必须签名才能使自动更新工作。 参考文档

2. 构建失败排查

  • 检查 GitHub Actions 日志,查看具体错误信息
  • 确认所有依赖已正确安装,特别是 Linux 平台的系统依赖
  • 确保 Node.js 版本兼容

3. UpgradeLink 集成问题

  • 检查 UpgradeLink 控制台中的应用标识是否与配置一致
  • 确认 GitHub Releases 中是否生成了正确的 安装包 文件

六、总结

通过以上配置,你可以实现 Electron 应用的全自动化构建、发布和更新流程。每当代码推送到指定分支时,GitHub Actions 将自动完成以下工作:

  1. 检测代码变更
  2. 在多平台环境中构建 Electron 应用
  3. 创建 GitHub Release 并上传安装包
  4. 提取应用版本号
  5. 将更新信息同步到 UpgradeLink 平台
  6. 最终用户将通过 UpgradeLink 收到应用更新通知

这种自动化流程大大提高了开发效率,减少了手动操作错误,让开发者可以更专注于应用功能开发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/28 12:08:47

腾讯混元1.8B开源:轻量化大模型开启边缘智能新纪元

腾讯混元1.8B开源:轻量化大模型开启边缘智能新纪元 【免费下载链接】Hunyuan-1.8B-Pretrain 腾讯开源混元大语言模型系列中的高效预训练模型,具备1.8B参数规模,支持256K超长上下文与混合推理模式,适配从边缘设备到高并发服务器的广…

作者头像 李华
网站建设 2026/3/31 7:19:40

Wan2.2-T2V-A14B能否处理抽象概念描述?测试‘时间流逝’等关键词

Wan2.2-T2V-A14B能否处理抽象概念描述?测试“时间流逝”等关键词 在影视创作中,如何用画面表现“时间的流逝”——这个看不见、摸不着的过程?传统做法依赖导演对光影变化、人物衰老、季节轮转的精心调度。如今,AI视频生成模型正试…

作者头像 李华
网站建设 2026/3/29 0:31:10

如何快速优化Mermaid.js流程图布局:ELK算法的完整配置指南

如何快速优化Mermaid.js流程图布局:ELK算法的完整配置指南 【免费下载链接】mermaid 项目地址: https://gitcode.com/gh_mirrors/mer/mermaid 在数据可视化和技术文档编写中,流程图布局的清晰度直接影响信息传达效果。很多开发者在使用Mermaid.j…

作者头像 李华
网站建设 2026/4/2 5:19:19

洛雪音乐六音修复完全指南:5步轻松解决音乐源失效问题

洛雪音乐六音修复完全指南:5步轻松解决音乐源失效问题 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 还在为洛雪音乐1.6.0版本后六音音源失效而烦恼吗?本指南将为你提供一…

作者头像 李华
网站建设 2026/4/2 13:37:33

On Page SEO 和 Off Page SEO 到底有啥区别?独立开发者出海必看

最近在折腾自己的产品网站,发现很多独立开发者对 SEO 这块儿还是挺迷糊的。今天就用大白话聊聊 On Page 和 Off Page SEO 的区别。 先说个比喻吧 你可以把你的网站想象成一家餐厅: On Page SEO 就是你餐厅内部的装修、菜品质量、服务态度Off Page SEO…

作者头像 李华
网站建设 2026/3/25 5:27:39

Wan2.2-T2V-A14B如何还原古典绘画风格的动态演绎?

Wan2.2-T2V-A14B如何还原古典绘画风格的动态演绎? 在博物馆的玻璃展柜前,人们常常驻足于《清明上河图》前凝视良久。画中熙攘的人流、穿梭的舟车、市井百态跃然纸上,却始终静止在绢本之上。如果能让这幅千年古画“活”过来——行人缓步、河水…

作者头像 李华