add new articles #59
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # ========================================== | |
| # 第一部分:工作流的基本信息 | |
| # ========================================== | |
| # 这个名字会显示在你的 GitHub 仓库的 "Actions" 网页标签下。 | |
| # 随便起,一般叫 "Build" 或 "CI/CD"。 | |
| name: Build | |
| # 设置 GITHUB_TOKEN 的权限,允许创建 Release | |
| permissions: | |
| contents: write # 写入权限:创建 release、上传文件 | |
| actions: read # 读取权限:下载 artifacts | |
| # `on` 是触发器(Trigger)。它决定了“什么时候”去执行下面配置的那些任务。 | |
| on: | |
| # `push` 意味着当有代码被推送到 GitHub 仓库时触发。 | |
| push: | |
| # 进一步限制:只有推送到下面这几个分支时,才触发这个工作流。 | |
| # 比如你推送到一个叫 "test-bug" 的分支,就不会触发,节省资源。 | |
| branches: | |
| - main | |
| - master | |
| - release/* # 这里的 * 是通配符,代表匹配所有以 release/ 开头的分支,比如 release/v1.0 | |
| # 进一步限制:除了指定分支,如果你推送了版本标签(Tag),也会触发。 | |
| # 程序员发版时通常会打个标签,比如 `git tag v1.0.0` 然后 `git push --tags`。 | |
| tags: | |
| - "v*" # 匹配所有以 v 开头的标签,比如 v1.0.0, v2.1.3 等。 | |
| # `workflow_dispatch` 是一个非常实用的开关。 | |
| # 加上这行之后,你的 GitHub Actions 页面会多出一个 "Run workflow" 的按钮, | |
| # 允许你哪怕不推送代码,也能随时手动点击按钮来强行运行一次打包。 | |
| workflow_dispatch: | |
| # ========================================== | |
| # 第二部分:具体要执行的任务(Jobs) | |
| # ========================================== | |
| # `jobs` 里面定义了具体要干什么活儿。 | |
| # 默认情况下,这里面定义的多个任务(比如 build-macos 和 build-windows)是“同时并行”开始的。 | |
| jobs: | |
| # ---------------------------------------- | |
| # 任务 1:构建 macOS 版本程序 | |
| # ---------------------------------------- | |
| build-macos: | |
| # `runs-on` 指定这个任务运行在什么操作系统的云端服务器上。 | |
| # `macos-latest` 表示由 GitHub 提供一台最新版的苹果 Mac 虚拟机。 | |
| runs-on: macos-latest | |
| # `steps` 是这个任务的具体执行步骤,必须按顺序一步步来。 | |
| steps: | |
| # 【步骤 1】拉取代码:把你的项目代码从 GitHub 克隆到这台 Mac 虚拟机里。 | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| # 【步骤 2】安装 Go 语言环境(根据你本地环境同步为 1.26)。 | |
| - name: Setup Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: "1.26" # 保持与你本地一致的 Go 版本 | |
| cache: true # 魔法开启:自动缓存下载过的 Go 依赖包,下次运行大幅提速! | |
| # 【步骤 3】安装 Node.js 环境(Wails 的前端需要,同步为 24)。 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: "24" # 保持与你本地一致的 Node 版本 | |
| # 【步骤 4】安装 pnpm 前端包管理器(同步为 10)。 | |
| - name: Install pnpm | |
| uses: pnpm/action-setup@v4 | |
| with: | |
| version: 10 # 保持与你本地一致的 pnpm 版本 | |
| # 【步骤 5】提速魔法:尝试从云端缓存里找以前编译好的 Wails 命令行工具。 | |
| - name: Cache Wails CLI | |
| id: cache-wails # 给这步起个 ID,方便下一步获取它的结果 | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/go/bin/wails # 去这个路径下找缓存文件 | |
| key: ${{ runner.os }}-wails-cli-v2.11.0 # 缓存的唯一名字,包含系统名字防止冲突 | |
| # 【步骤 6】安装 Wails 命令行工具。 | |
| # `if` 判断:如果上一步的缓存魔法没有命中(比如第一次运行,或者缓存过期),才真正执行安装。 | |
| - name: Install Wails | |
| if: steps.cache-wails.outputs.cache-hit != 'true' | |
| run: go install github.com/wailsapp/wails/v2/cmd/wails@v2.11.0 | |
| # 【步骤 7】核心构建:使用 Wails 把你的 Go + 前端代码编译成 macOS 程序。 | |
| # darwin/universal 表示打包出的程序同时支持 Intel 和 M1/M2/M3/M4 芯片。 | |
| - name: Build macOS app | |
| run: wails build -platform darwin/universal | |
| # 【步骤 8】安装 create-dmg 工具 | |
| # 这是一个强大的第三方 DMG 制作工具,支持自定义背景图和精细的布局控制 | |
| - name: Install create-dmg | |
| run: brew install create-dmg | |
| # 使用 create-dmg 工具进行带背景图的精细化打包 | |
| # 【步骤 9】创建 DMG 安装包 (增强安全兼容性) | |
| - name: Create DMG Installer | |
| run: | | |
| cd build/bin | |
| # 1. 确保可执行文件拥有运行权限 | |
| # Wails 默认生成的可执行文件在 Contents/MacOS/ 目录下 | |
| chmod +x "loris-tunnel.app/Contents/MacOS/loris-tunnel" | |
| # 2. 清除可能存在的隔离属性和多余元数据 | |
| # 防止打包进去的 App 自带“待核实”标记 | |
| xattr -cr "loris-tunnel.app" | |
| # 3. 进行 Ad-hoc 签名(伪签名) | |
| # 这是最关键的一步!对于没有开发者证书的开源项目,这能告诉 macOS: | |
| # “虽然我没公证,但我经过了完整的本地签名校验”,这能极大减少“损坏”报错。 | |
| codesign --force --deep --sign - "loris-tunnel.app" | |
| # 4. 执行原有的 create-dmg | |
| create-dmg \ | |
| --volname "loris-tunnel" \ | |
| --background "../../dmg-bg.png" \ | |
| --window-pos 200 120 \ | |
| --window-size 600 400 \ | |
| --icon-size 100 \ | |
| --icon "loris-tunnel.app" 110 200 \ | |
| --hide-extension "loris-tunnel.app" \ | |
| --app-drop-link 490 200 \ | |
| "loris-tunnel.dmg" \ | |
| "loris-tunnel.app" | |
| # 【步骤 10】打包收尾:把编译出来的 DMG 文件上传到 GitHub 的后台。 | |
| # 因为虚拟机用完马上就会被销毁,不上传的话打包出来的东西就全没了。 | |
| - name: Upload macOS artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: loris-tunnel-macos | |
| path: build/bin/loris-tunnel.dmg | |
| # ---------------------------------------- | |
| # 任务 2:构建 Windows 版本程序 | |
| # (逻辑和 macOS 一模一样,只是环境变成了 Windows) | |
| # ---------------------------------------- | |
| build-windows: | |
| # 换成 Windows 最新版虚拟机 | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: "1.26" | |
| cache: true | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: "24" | |
| - name: Install pnpm | |
| uses: pnpm/action-setup@v4 | |
| with: | |
| version: 10 | |
| # Windows 下去找缓存的路径斜杠方向不同,且最后是 wails.exe | |
| - name: Cache Wails CLI | |
| id: cache-wails | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~\go\bin\wails.exe | |
| key: ${{ runner.os }}-wails-cli-v2 | |
| - name: Install Wails | |
| if: steps.cache-wails.outputs.cache-hit != 'true' | |
| run: go install github.com/wailsapp/wails/v2/cmd/wails@latest | |
| # 编译出 Windows 64 位程序 | |
| - name: Build Windows app | |
| run: wails build -platform windows/amd64 | |
| # 上传后缀为 .exe 的文件到后台 | |
| - name: Upload Windows artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: loris-tunnel-windows | |
| path: build/bin/*.exe | |
| # ---------------------------------------- | |
| # 任务 3:自动发布 Release 版本 | |
| # ---------------------------------------- | |
| release: | |
| # `needs` 非常关键:它告诉 GitHub,这个任务必须等 build-macos 和 build-windows 都成功干完活,才能开始。 | |
| needs: [build-macos, build-windows] | |
| # 发布任务不耗性能,用最便宜、启动最快的 Ubuntu Linux 就行 | |
| runs-on: ubuntu-latest | |
| # `if` 拦截器:只有当触发本次工作流的是一个以 "v" 开头的 Tag (比如 v1.0.0) 时,才执行发布。 | |
| # 也就是说,平时只 push 代码的话,前面两个 build 任务跑完就结束了,这一步会被自动跳过。 | |
| if: startsWith(github.ref, 'refs/tags/v') | |
| steps: | |
| # 【步骤 1】从刚才的 build-macos 任务的后台存档里,把打包好的苹果软件下载过来。 | |
| - name: Download macOS artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: loris-tunnel-macos | |
| path: artifacts/macos # 下载后放到当前服务器的这个文件夹里 | |
| # 【步骤 2】把 Windows 软件也下载过来。 | |
| - name: Download Windows artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: loris-tunnel-windows | |
| path: artifacts/windows | |
| # 【步骤 3】终极步骤:调用 GitHub 官方提供的发布插件,自动创建一个 Release 发布页。 | |
| - name: Create Release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| # 把刚才下载到 artifacts 文件夹里的所有文件,统统作为附件上传到 Release 页面 | |
| files: artifacts/**/* | |
| draft: false # false 表示直接发布,不存草稿 | |
| prerelease: false # false 表示这是正式版,不是预发布版 | |
| env: | |
| # 给这个插件发一张“通行证”,证明它有权限在你的仓库里创建 Release。 | |
| # GITHUB_TOKEN 是 GitHub Actions 自动生成并提供给你的,直接用就行。 | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |