使用 Github Action 自动构建 Release 版本

Published: 2024-04-10

Tags: CI/CD EasyCmd

本文总阅读量

Github 上的很多开源软件、工具都有 Release,用户可以直接从上面下载编译好的软件包。

虽然 Github Release 页面提供了手动发布的页面,但这么多不同平台的软件包,没有人愿意逐个构建再上传到平台发布、不仅容易出错误,同时效率及其低下。

本文配置参考自 yq 项目的 CI/CD,配置 Github Action,让其在某个时刻(例如打标签)自动打包,并创建 Release 的 Draft 草稿。

添加配置文件和脚本

首先,创建文件 .github/workflows/release.yml

name: Release EasyCmd
on:
  push:
    tags:
      - 'v0.*'
      - 'draft-*'

jobs:
  publishGitRelease:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: '^1.20'
          check-latest: true

      - name: Cross compile
        run: |
          sudo apt-get install rhash -y
          go install github.com/mitchellh/gox@v1.0.1
          mkdir -p build
          ./scripts/xcompile.sh

      - name: Release
        uses: softprops/action-gh-release@v1
        with:
          files:  build/*
          draft: true
          fail_on_unmatched_files: true

Action 配置文件描述了在用户打 v0. 及 draft- 标签的时候会触发 CI/CD 自动运行,具体做的事情是启动一个 Ubuntu 系统执行指令,检出仓库代码、安装 Golang 1.20 版本。

编译的时候有几条命令,rhash 用来生成 checksums 软件哈希信息,gox 用来将代码编译为不同架构目标

sudo apt-get install rhash -y
go install github.com/mitchellh/gox@v1.0.1
mkdir -p build
./scripts/xcompile.sh

./scripts/xcompile.sh 是具体的编译脚本,在项目的根目录新建 scripts 文件夹并新增文件 xcompile.sh

#!/bin/bash
set -e
# you may need to go install github.com/mitchellh/gox@v1.0.1 first
echo $VERSION
CGO_ENABLED=0 gox -ldflags "-s -w ${LDFLAGS}" -output="build/easycmd_{{.OS}}_{{.Arch}}" --osarch="darwin/amd64 darwin/arm64 linux/386 linux/amd64 linux/arm linux/arm64"

cd build

rhash -r -a . -o checksums

rhash -r -a --bsd . -o checksums-bsd

rhash --list-hashes > checksums_hashes_order

内容很好理解,不再说明,唯一需要注意的是在提交代码前,先为 xcomile.sh 添加可执行权限

$ chmod +x ./.github/scripts/xcompile.sh

如果已提交,可以执行命令

$ git update-index --chmod=+x ./.github/scripts/xcompile.sh
$ git commit -m "Add execute permission to .github/scripts/xcompile.sh"
$ git push

将新增的两个文件提交。这个是我的测试 PR Cicd/add release action #2 可供参考

关于 Pipeline 配置中的 Release 步骤,简单说明一下:

  • files 参数用于指定哪些文件会被发布,即我们可以生成任意目标文件,放置到 build 目录下即可
  • draft 设置为 true 表示创建一个 Release 草稿,我们需要再核对补充下再真正发布
  • fail_on_unmatched_files 如果没有目标文件,则失败停止发布

除以上使用的几个参数,action-gh-release@v1 还支持不少参数。如:

  • name 设置 Release 名称,默认为 tag 名
  • prerelease 设置本次发布是否为 prerelease 版本
  • generate_release_notes 是否自动生成 Release Notes

更多参考:action-gh-release@v1#customizing

打标签触发构建 Release

在 Commit 上打标签 “draft-0.0.4” 进行测试,到 Github Action 页面可以看到 Action 在运行。

成功执行后

这时候在 Release 页面会显示一个版本,版本旁有 Draft 标记,表示这是一个草稿,需要手动编辑再发布

编辑草稿状态的 Release,可以点击 “Generate Release Notes” 可以自动生成版本说明,而后点击发布

最后,在首页也可以看到 Release 版本信息

下载测试

根据自己的系统,下载对应的目标可执行文件,添加可执行权限进行验证,能跑、构建没有问题

参考