利用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了。