利用GitHub Action实现自动发布编译产品

目录

  1. 1. 命名
  2. 2. 触发条件
  3. 3. 环境变量
  4. 4. 搭建环境
  5. 5. 打包
  6. 6. 发布
  7. 7. Action,启动!

最近听说 GitHub Action 可以实现云编译,连忙把Hypereal 的驱动这个项目安排上。花了两天时间来了解和编写相应的 Workflow 脚本,实现 检查->编译->打包->发布 全自动云端一条龙执行。这样就可以把 C 盘的 3A 大作级软件 VS2022 干掉了。

不负责任的名词解析:Action 是 Github 的功能,Action 内部可以拥有多个 workflow,每个 workflow 中可以实现基于不同事件触发的多套操作流程。

命名

既然用的是巨硬的编译器编译,那么就简单给这个 workflow 起名 MSBuild

name: MSBuild

触发条件

我希望每次向主分支加入新代码的时候,都可以执行云端的编译,因此添加:

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]

环境变量

有些编译相关的配置可以单独抽离出来作为环境变量。当然这些不是,这些部分是我从别处复制过来的时候就有的。

env:
  # Path to the solution file relative to the root of the project.
  SOLUTION_FILE_PATH: ./revive_hypereal.sln

  # Configuration type to build.
  # You can convert this to a build matrix if you need coverage of multiple configuration types.
  # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
  BUILD_CONFIGURATION: Release

搭建环境

首先确定一下项目需求。这个驱动的代码使用 C++编写,需要在 Windows 环境下使用 VS2022 编译成动态运行库。

那么 Action 的编译环境应该选择 Windows+msvc 编译器。

这个环境对应的 Action 的话微软在 Github 上有成品 microsoft/setup-msbuild,直接拿来作为基底修改。

这部分忘了是从哪里粘贴过来的,部署的时候发现 NuGet 这个步骤没有什么用但是很耗时,于是就注释掉了。

jobs:
  build:
    runs-on: windows-latest

    steps:
      - uses: actions/checkout@v3

      - name: Add MSBuild to PATH
        uses: microsoft/setup-msbuild@v1

      # - name: Restore NuGet packages
      #   working-directory: ${{env.GITHUB_WORKSPACE}}
      #   run: nuget restore ${{env.SOLUTION_FILE_PATH}}

      - name: Build
        working-directory: ${{env.GITHUB_WORKSPACE}}
        # Add additional options to the MSBuild command line here (like platform or verbosity level).
        # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
        run: msbuild ${{env.SOLUTION_FILE_PATH}} -t:rebuild -property:Configuration=${{env.BUILD_CONFIGURATION}}

打包

一开始本来想打成 7z 压缩包,但是简单 Google 一圈没看到能正常在 windows-latest 环境下正常用的 7z Action,想打 zip 的包,也没看到有可以正常使用的 zip Action。最后在万能的 stackoverflow上找到了答案

Create Zip file of Github Reporitory using a workflow which runs on [windows-latest]

我要打包的目录是 revive_hypereal

- name: Package
  working-directory: ${{env.GITHUB_WORKSPACE}}
  run: Compress-Archive -Path .\revive_hypereal -Destination prebuild_driver.zip

发布

据我查到的一些资料,似乎 github 官方已经不再维护自动发布 release 的 Action,只好使用第三方维护的 Action:action-gh-release。虽说是第三方,这个 Action 的使用文档也挺全面,照着抄就可以。我希望任意 commit 或者 pull request 都可以触发提交,因此注释掉了检查是否为 tag 的检查条件。

- name: Release
  uses: softprops/action-gh-release@v1
  # if: startsWith(github.ref, 'refs/tags/')
  with:
    token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
    tag_name: prebuild_driver
    name: Release ${{ github.sha }}
    body: 由提交${{ github.sha }}自动触发编译生成的Release。
    draft: false
    prerelease: false
    files: |
      prebuild_driver.zip

Action,启动!

组合一下,我们得到如下的文件:

name: MSBuild

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]

env:
  SOLUTION_FILE_PATH: ./revive_hypereal.sln
  BUILD_CONFIGURATION: Release

jobs:
  build:
    runs-on: windows-latest

    steps:
      - uses: actions/checkout@v3

      - name: Add MSBuild to PATH
        uses: microsoft/setup-msbuild@v1

      - name: Build
        working-directory: ${{env.GITHUB_WORKSPACE}}
        run: msbuild ${{env.SOLUTION_FILE_PATH}} -t:rebuild -property:Configuration=${{env.BUILD_CONFIGURATION}}

      - name: Package
        working-directory: ${{env.GITHUB_WORKSPACE}}
        run: Compress-Archive -Path .\revive_hypereal -Destination prebuild_driver.zip

      - name: Release
        uses: softprops/action-gh-release@v1
        with:
          token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
          tag_name: prebuild_driver
          name: Release ${{ github.sha }}
          body: 由提交${{ github.sha }}自动触发编译生成的Release。
          draft: false
          prerelease: false
          files: |
            prebuild_driver.zip

把这个文件保存为 .github/workflows/msbuild.yml,然后提交到 Github 上,我们就可以看到 Action 已经开始启动了。不出意料的话,过两分钟,我们就可以在项目的 Release 页面看到一个新的 Release 了。