最近听说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了。