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 版本信息
下载测试
根据自己的系统,下载对应的目标可执行文件,添加可执行权限进行验证,能跑、构建没有问题