借助 GitHub Actions + 语义化提交,实现自动版本发布

从手动打 tag 到自动识别版本,让发布流程更加智能和规范

在软件开发中,版本发布是一个重要但容易出错的环节。传统的流程往往包括:

  • 手动更新版本号
  • 手动打 tag
  • 手动编写 Release Notes
  • 手动上传构建产物

这不仅繁琐,还容易出错。

本文将介绍如何借助 GitHub Actions 和语义化提交,实现一套安全、自动、可维护的版本发布流程。

语义化提交:为自动发布打好基础

语义化提交(Semantic Commits)是一种结构化的提交信息规范,通过关键词标识更改类型:

  • feat: 添加新功能 → 触发 次版本号 增加
  • fix: 修复缺陷 → 触发 修订号 增加
  • BREAKING CHANGE: 破坏性变更 → 触发 主版本号 增加

例如:

1
2
3
feat: 添加用户登录功能
fix: 修复登录页面样式问题
BREAKING CHANGE: 重构用户认证系统

配合工具或脚本,就能自动推断版本号。

自动识别版本号与标签

我们使用 commit message 中的 [release/v1.2.3] 格式来明确版本发布意图:

1
2
3
4
5
6
7
8
9
10
- name: Determine Release Type
id: determine-release
run: |
if [[ "${{ github.event.head_commit.message }}" =~ \[release\/v([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?)\] ]]; then
echo "RELEASE_TYPE=release" >> $GITHUB_OUTPUT
echo "TAG_NAME=v${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
else
echo "RELEASE_TYPE=ci" >> $GITHUB_OUTPUT
echo "TAG_NAME=ci-${GITHUB_RUN_NUMBER}" >> $GITHUB_OUTPUT
fi

这样可以区分正式版本(用于发布)与 CI 版本(用于预览或测试)。

自动创建 Release 并上传构建产物

借助 GitHub CLI,可以在 CI 中创建 Release 并上传构建产物:

1
2
3
4
5
6
7
8
9
10
- name: Create Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TYPE: ${{ steps.determine-release.outputs.RELEASE_TYPE }}
run: |
gh release create "${{ steps.determine-release.outputs.TAG_NAME }}" \
--title="${{ github.repository }} ${{ steps.determine-release.outputs.TAG_NAME }}" \
--generate-notes \
$([[ "$RELEASE_TYPE" == "ci" ]] && echo "--prerelease") \
./release.tar.gz

优势:

  • 自动生成 Release Notes
  • 支持 CI 预发布 vs 正式版本区分
  • 支持上传多个构建产物

与自动部署流程集成

配合部署步骤,可以实现完整的“一键发布”效果:

1
2
3
4
5
6
7
8
9
10
11
deploy:
needs: build
runs-on: ubuntu-latest
if: ${{ needs.build.outputs.release_type == 'release' }}
steps:
- name: Download Release
uses: robinraju/release-downloader@v1
with:
repository: ${{ github.repository }}
tag: ${{ needs.build.outputs.tag_name }}
fileName: release.tar.gz

随后可使用前文介绍的 rsync + 动态密码机制完成部署,做到:

  • 自动拉取构建产物
  • 使用临时密码安全上传
  • 成功后自动清理,失败自动重试

安全注意事项

  • 使用 GITHUB_TOKEN 避免暴露 Personal Access Token
  • 配置最小权限(repo、release)
  • 设置 PR 模板提醒 commit message 规范
  • 日志中屏蔽 IP 和敏感信息
  • 配合动态密码机制,部署环节无长期凭证

总结

通过这一流程,我们实现了:

  • ✅ 使用 commit message 自动控制版本行为
  • ✅ 自动打 tag + 生成 Release
  • ✅ 上传构建产物并触发自动部署
  • ✅ 全流程无人工干预、安全可追踪

建议:

  • 在团队中推广语义化提交(可用 lint 工具强制)
  • 在 PR 中加入版本提示或校验逻辑
  • 定期审查发布日志,确保流程稳定
  • 为发布流程设立回滚策略(如上传版本记录)

写在最后

头图素材来源:Katie Moum on Unsplash