原来 GitHub Actions 还能直接打包 EXE、IPA、DMG、APK:不用本地搭环境,也不一定需要 Mac

大家好,这里是「代码简单说」。
在这里插入图片描述

最近我才发现一个之前一直被我忽略的东西:GitHub Actions 不只是用来跑测试、部署网站,还可以直接拿来做软件构建和发布。

这意味着什么?

以前我如果要做一个跨平台客户端,往往需要准备各种开发环境:

Windows
├── Node.js
├── Java / JDK
├── Android SDK
├── Android Studio
└── 各种编译工具

Mac
├── Xcode
├── CocoaPods
├── Node.js
└── Apple 签名环境

尤其是做 macOS、iOS 软件时,没有 Mac 经常会非常麻烦

但 GitHub Actions 可以直接调用 GitHub 提供的云端 Runner:

本地电脑
    ↓
git push
    ↓
GitHub
    ↓
GitHub Actions
    ↓
自动构建
    ↓
EXE / DMG / APK / IPA
    ↓
GitHub Artifacts / Release

整个构建过程都可以放到云端完成。


一、GitHub Actions 到底是什么

GitHub Actions 本质上就是 GitHub 提供的一套 CI/CD 自动化平台

最简单的理解:

你把代码提交到 GitHub,GitHub 就帮你开一台临时电脑执行命令。

例如:

name: Build

on:
  push:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Install dependencies
        run: npm install

      - name: Build
        run: npm run build

提交代码后,GitHub 就会自动:

拉取代码
  ↓
启动 Linux Runner
  ↓
安装 Node.js
  ↓
npm install
  ↓
npm run build
  ↓
生成构建结果

所以 GitHub Actions 本质上可以理解成:

“远程帮我执行命令的电脑。”


二、最让我惊讶的是,它不只是 Linux

以前很多人的印象可能是:

GitHub Actions = 跑 Linux 脚本

实际上 GitHub 提供了不同操作系统的 Runner,例如:

ubuntu-latest
windows-latest
macos-latest

所以你可以根据目标平台选择构建环境。

例如:

目标 Runner
Linux Ubuntu
Android Ubuntu
Windows Windows
macOS macOS
iOS macOS

这件事情对于个人开发者来说非常方便。


三、Android APK 可以直接云端打包

比如我开发一个 Android 项目。

以前通常需要:

安装 Android Studio
安装 JDK
安装 Android SDK
配置 Gradle
配置环境变量
下载各种依赖

电脑还得腾出大量空间。

但现在完全可以让 GitHub Actions 帮我构建。

例如:

name: Android Build

on:
  push:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup JDK
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '17'

      - name: Build APK
        run: ./gradlew assembleRelease

      - name: Upload APK
        uses: actions/upload-artifact@v4
        with:
          name: app-release
          path: app/build/outputs/apk/release/*.apk

之后:

git push
   ↓
GitHub Actions
   ↓
Gradle 构建
   ↓
app-release.apk

直接就出来了。


四、EXE 也可以让 GitHub 帮你打包

Windows 软件同样如此。

比如 Electron:

Vue
  ↓
Electron
  ↓
electron-builder
  ↓
EXE

GitHub Actions 可以直接使用 Windows Runner:

jobs:
  build:
    runs-on: windows-latest

然后执行:

npm install
npm run build

或者:

npx electron-builder --win

最后自动生成:

dist/
├── xxx.exe
└── xxx.exe.blockmap

再通过:

uses: actions/upload-artifact@v4

上传。

这样我的电脑甚至不需要安装 Visual Studio。


五、DMG 也可以直接构建

这也是我觉得 GitHub Actions 特别方便的地方。

macOS 软件通常需要 Mac 环境。

例如 Electron 项目:

electron-builder --mac

传统情况下,你可能需要:

一台 Mac
↓
安装 Node.js
↓
安装依赖
↓
配置 Xcode / 工具链
↓
执行构建
↓
生成 DMG

而 GitHub Actions 可以直接指定:

runs-on: macos-latest

然后:

- name: Build macOS
  run: npm run build:mac

生成:

MyApp.dmg
MyApp.zip

所以对于单纯的 macOS 构建任务来说:

我自己的电脑不需要是一台 Mac。

GitHub 会提供 macOS Runner 执行构建。


六、那 IPA 呢?

这里需要特别说明。

IPA 可以进行云端构建,但 iOS 的情况明显比 APK 复杂。

原因不是“编译”本身,而是 Apple 的签名体系。

通常涉及:

Apple Developer
    ↓
Certificates
    ↓
Provisioning Profiles
    ↓
Code Signing
    ↓
Xcode
    ↓
IPA

所以 GitHub Actions 可以运行:

macOS Runner
    ↓
Xcode
    ↓
iOS 项目
    ↓
Archive
    ↓
Export IPA

但是:

你仍然需要 Apple 的开发者账号以及正确的签名材料。

GitHub Actions 并不会凭空解决 Apple 签名问题。

因此更准确的说法是:

没有自己的 Mac,也可以把 iOS 构建流程放到 GitHub Actions 的 macOS Runner 上执行。

这和“完全不需要 Apple 开发者账号”是两回事。


七、最舒服的地方:一次提交,多个平台一起构建

例如我有一个 Electron 项目:

MyApp

我可以写一个 Matrix:

jobs:
  build:
    strategy:
      matrix:
        os:
          - windows-latest
          - macos-latest
          - ubuntu-latest

    runs-on: ${{ matrix.os }}

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 22

      - run: npm install

      - run: npm run build

然后:

                    GitHub
                       │
                       ▼
                  GitHub Actions
                       │
          ┌────────────┼────────────┐
          ▼            ▼            ▼
       Windows        macOS        Ubuntu
          │            │            │
          ▼            ▼            ▼
        EXE           DMG         AppImage

一次提交,三个平台同时构建。

对于开发者来说,这个体验非常接近真正的云端 CI/CD。


八、还能自动发布 GitHub Release

实际上我觉得 GitHub Actions 最有价值的地方,并不是“帮你编译”。

而是:

编译 + 自动发布,可以串起来。

例如:

git tag v1.0.0
        ↓
GitHub Actions
        ↓
构建
        ↓
EXE
DMG
APK
AppImage
        ↓
GitHub Release
        ↓
自动上传所有安装包

于是以后发布版本可能只需要:

git tag v1.0.0
git push origin v1.0.0

剩下的全部自动完成。


九、甚至可以做到“发布即构建”

例如 Workflow:

on:
  push:
    tags:
      - 'v*'

意思就是:

当我推送 v1.0.0v1.1.0 这种版本标签的时候,自动开始发布。

流程:

修改代码
   ↓
git commit
   ↓
git push
   ↓
git tag v1.0.0
   ↓
git push --tags
   ↓
GitHub Actions
   ↓
自动构建
   ↓
自动发布

以后发布软件的体验会变成:

打一个 Tag = 发布一个版本。


十、GitHub Actions 最大的价值,其实是“临时开发环境”

以前软件开发经常是:

我要打 Android 包
↓
我的电脑必须装 Android 环境

现在可以变成:

我要打 Android 包
↓
GitHub 帮我开 Ubuntu
↓
安装需要的工具
↓
执行构建
↓
构建结束
↓
机器释放

这其实是一种思维方式的变化。

我不再需要:

“我的电脑必须具备完整的构建环境。”

而变成:

“我的代码只需要能够在 CI 环境中自动完成构建。”


十一、这对个人开发者尤其方便

对于公司来说,这种 CI/CD 很正常。

但是对于个人开发者,我以前反而容易忽略这一点。

例如:

只有 Windows

却想做:

Android
Windows
macOS
Linux
iOS

以前第一反应可能是:

Android → 安装 Android Studio

Windows → 配置 Windows 构建环境

macOS → 买 Mac

iOS → 买 Mac + Xcode

现在完全可以先考虑:

GitHub
  ↓
Actions
  ↓
云端 Runner
  ↓
不同平台分别构建

至少在构建环境这一层,GitHub 已经帮你解决掉了很大一部分问题。


十二、但不要把 GitHub Actions 理解成“万能免费电脑”

这里也有几个需要注意的地方。

1. Runner 是临时环境

每次执行通常都是一个新的构建环境。

所以不要把重要文件直接存在 Runner 里。

应该使用:

Artifacts

或者:

GitHub Releases

保存产物。


2. 构建时间会消耗 Actions 额度

GitHub Actions 并不是无限免费。

不同账号、仓库类型以及 Runner 类型,对应的免费额度和计费规则不同。

而且不同 Runner 的消耗倍率也可能不同。

所以如果项目需要频繁构建,比如:

每提交一次代码
↓
构建一次

一个月下来消耗还是可能很快的。

具体额度建议直接在 GitHub:

Settings → Billing & licensing → Usage

查看当前账号实际用量。


3. macOS Runner 成本通常更高

如果只是:

APK

一般没有必要使用 macOS Runner。

直接:

runs-on: ubuntu-latest

即可。

但如果需要:

DMG
IPA
Xcode
iOS

就需要考虑 macOS Runner。

因此可以根据平台合理拆分 Workflow。


十三、最适合我的工作流

如果以后我自己做一个跨平台软件,我可能会直接按照这种方式设计:

GitHub Repository
│
├── src/
├── package.json
└── .github/
    └── workflows/
        ├── android.yml
        ├── windows.yml
        ├── macos.yml
        └── ios.yml

然后:

                GitHub Push / Tag
                       │
                       ▼
              GitHub Actions
                       │
        ┌──────────────┼──────────────┐
        │              │              │
        ▼              ▼              ▼
     Ubuntu         Windows         macOS
        │              │              │
        ▼              ▼              ▼
       APK            EXE          DMG / IPA

最后统一进入:

GitHub Release

这样一套完整的自动发布体系就建立起来了。


十四、写在最后

我以前一直觉得:

想做 macOS 软件,首先得买 Mac。

但实际上需要区分两个事情:

开发环境构建环境并不是一回事。

我的本地电脑主要负责:

写代码
↓
测试
↓
提交 GitHub

真正的:

编译
↓
打包
↓
签名
↓
发布

完全可以大量交给 GitHub Actions。

所以 GitHub Actions 对个人开发者来说,真正有价值的地方并不只是“免费 CI”。

而是它让:

“我没有某个平台的电脑”

不再必然意味着:

“我无法构建某个平台的软件”。

特别是对于 Electron、Tauri、Flutter、React Native、Android、iOS 等项目,这种云端构建思路非常值得尝试。

以前看到 GitHub Actions,我想到的可能只是:

自动测试
自动部署

现在才发现,它其实还可以当成一套:

云端编译服务器

来使用。

对于个人开发者来说,这个能力确实非常实用。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐