Github自动编译上传s3发布Release
使用 GitHub Actions 自动化 Go 二进制文件构建、S3 上传和 GitHub Release
在本教程中,我们将详细介绍如何使用 GitHub Actions 自动化构建 Go 二进制文件,上传到 Cloudflare R2(S3 兼容存储),并创建包含这些二进制文件的 GitHub Release。这个自动化流程非常适合需要跨平台分发的 Go 项目,能够节省时间并确保一致性。
先决条件
在开始之前,请确保您已准备好以下内容:
GitHub 账户和仓库:
- 您需要一个 GitHub 账户和一个包含 Go 项目的仓库。
- 确保仓库中有一个主入口文件,例如
main.go
。
Go 项目:
- 您的 Go 项目应包含可编译为二进制文件的代码。
- 本教程假设主文件名为
main.go
,如果不同,请相应调整。
Cloudflare R2 账户:
- 注册 Cloudflare R2 账户。
- 创建一个存储桶(例如
cfrescan
)用于存储二进制文件。 - 获取 R2 的访问密钥 ID 和秘密访问密钥。
GitHub Secrets:
- 在您的 GitHub 仓库中,转到 Settings > Secrets and variables > Actions。
- 添加以下 Secrets:
R2_ACCESS_KEY_ID
:您的 R2 访问密钥 ID。R2_SECRET_ACCESS_KEY
:您的 R2 秘密访问密钥。
设置 GitHub Actions
GitHub Actions 是一个强大的自动化工具,允许您在 GitHub 仓库中定义工作流。我们将创建一个工作流来构建、上传和发布 Go 二进制文件。
步骤 1:创建工作流文件
在您的 GitHub 仓库中,创建一个新文件,路径为 .github/workflows/build-and-release.yml
。这个文件将包含工作流的 YAML 配置。
步骤 2:编写工作流 YAML
以下是完整的工作流 YAML 文件。我们将在后续部分逐一解释每个部分。
name: Build and Release Go Binary
on:
push:
tags:
- 'v*'
jobs:
build-and-release:
permissions:
contents: write
runs-on: ubuntu-latest
environment: s3
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Install UPX
run: |
sudo apt-get update
sudo apt-get install -y upx
- name: Build binaries
run: |
export LDFLAGS="-s -w"
GOOS=windows GOARCH=amd64 go build -ldflags="$LDFLAGS" -trimpath -o dddd64.exe main.go && upx -9 dddd64.exe
GOOS=windows GOARCH=386 go build -ldflags="$LDFLAGS" -trimpath -o dddd.exe main.go && upx -9 dddd.exe
GOOS=linux GOARCH=amd64 go build -ldflags="$LDFLAGS" -trimpath -o dddd_linux64 main.go && upx -9 dddd_linux64
GOOS=linux GOARCH=arm64 go build -ldflags="$LDFLAGS" -trimpath -o dddd_linux_arm64 main.go && upx -9 dddd_linux_arm64
GOOS=darwin GOARCH=amd64 go build -ldflags="$LDFLAGS" -trimpath -o dddd_darwin64 main.go
GOOS=darwin GOARCH=arm64 go build -ldflags="$LDFLAGS" -trimpath -o dddd_darwin_arm64 main.go
ls -l # Log binaries for debugging
- name: Move binaries to dist
run: |
mkdir dist
mv dddd64.exe dist/
mv dddd.exe dist/
mv dddd_linux64 dist/
mv dddd_linux_arm64 dist/
mv dddd_darwin64 dist/
mv dddd_darwin_arm64 dist/
- name: Upload to R2
env:
AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
run: |
aws s3 sync dist/ s3://cfrescan/ --endpoint-url https://2ad876964b531a6f45b6155745233768.r2.cloudflarestorage.com --checksum-algorithm CRC32 --force
- name: Upload to GitHub Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ github.ref_name }}
name: "Release ${{ github.ref_name }}"
body: |
Auto-generated release for commit ${{ github.sha }}
Binaries built for multiple platforms.
draft: false
prerelease: false
files: |
dist/dddd.exe
dist/dddd64.exe
dist/dddd_linux64
dist/dddd_linux_arm64
dist/dddd_darwin64
dist/dddd_darwin_arm64
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
工作流解释
以下是工作流中每个部分的详细说明:
- name:工作流名称,设置为“Build and Release Go Binary”。
- on:定义触发工作流的事件。本例中,工作流在推送新标签(匹配
v*
,如v1.0.0
)时触发。要仅在特定分支(如main
)触发,可以修改为:on: push: branches: - main
- jobs:定义要运行的任务。本例中有一个名为
build-and-release
的任务。 - permissions:授予任务写入仓库内容的权限,用于创建 GitHub Release。
- runs-on:指定运行环境为最新的 Ubuntu 系统(
ubuntu-latest
)。 - environment:设置环境为
s3
,可用于环境特定的 Secrets。 - steps:按顺序执行的步骤列表。
步骤详细说明
检出代码:
- 使用 actions/checkout@v4 检出仓库代码。
设置 Go 环境:
- 使用 actions/setup-go@v4 设置 Go 环境,指定版本为 1.21。
- 您可以根据需要更改
go-version
,例如设置为1.20
。
安装 UPX:
- 安装 UPX,一个用于压缩可执行文件的工具,以减小二进制文件大小。
构建二进制文件:
- 设置链接器标志
-s -w
以剥离调试信息,-trimpath
移除源代码路径,减小二进制文件大小。 - 为以下平台和架构构建二进制文件:
dddd64.exe
:Windows 64 位 (amd64)dddd.exe
:Windows 32 位 (386)dddd_linux64
:Linux 64 位 (amd64)dddd_linux_arm64
:Linux ARM64dddd_darwin64
:macOS 64 位 (amd64)dddd_darwin_arm64
:macOS ARM64
- 使用 UPX 压缩 Windows 和 Linux 二进制文件。macOS 二进制文件未使用 UPX,因为 UPX 对 macOS 的支持有限。
- 注意:确保将
main.go
替换为您项目的实际主文件,并根据需要调整二进制文件名。
- 设置链接器标志
移动二进制文件到 dist 目录:
- 创建
dist
目录并将所有二进制文件移动到该目录,便于后续上传。
- 创建
上传到 R2:
- 使用 AWS CLI 的
s3 sync
命令将dist
目录中的文件同步到 R2 存储桶。 - 通过 GitHub Secrets 设置 AWS 凭证(
R2_ACCESS_KEY_ID
和R2_SECRET_ACCESS_KEY
)。 - 注意:替换
s3://cfrescan/
为您的实际 R2 存储桶名称,并确保 endpoint URL 正确。
- 使用 AWS CLI 的
创建 GitHub Release:
- 使用 softprops/action-gh-release@v1 创建 GitHub Release。
- 标签名称设置为
${{ github.ref_name }}
,即触发工作流的标签(如v1.0.0
)。 - 包含
dist
目录中的所有二进制文件。 - 注意:确保触发工作流的标签符合预期,避免在分支推送时创建不必要的 Release。
测试和验证
要测试工作流,请按照以下步骤操作:
推送代码:
- 创建一个新标签(例如
git tag v1.0.0
和git push origin v1.0.0
)以触发工作流。
- 创建一个新标签(例如
监控工作流:
- 转到仓库的 Actions 选项卡,查看工作流运行状态。
验证 R2 上传:
- 登录 Cloudflare R2 控制台,检查存储桶中是否包含所有二进制文件。
验证 GitHub Release:
- 转到仓库的 Releases 部分,确认新 Release 已创建并包含所有二进制文件。
故障排除
以下是一些常见问题及其解决方法:
二进制文件未找到:
- 确保
go build
命令成功运行,检查main.go
是否存在。 - 在
Build binaries
步骤中添加ls -l
以记录生成的二进制文件。
- 确保
R2 上传失败:
- 验证
R2_ACCESS_KEY_ID
和R2_SECRET_ACCESS_KEY
是否正确设置。 - 确保存储桶名称和 endpoint URL 正确。
- 验证
Release 未创建:
- 检查
GITHUB_TOKEN
是否正确设置(通常由 GitHub Actions 自动提供)。 - 确保触发工作流的标签符合
v*
模式。
- 检查
macOS 二进制文件未压缩:
- macOS 二进制文件未使用 UPX,因为 UPX 对 macOS 的支持有限。如果需要压缩,可以探索其他工具。
结论
通过本教程,您可以设置一个 GitHub Actions 工作流,自动构建 Go 二进制文件,上传到 Cloudflare R2,并创建 GitHub Release。这个自动化流程可以显著提高开发效率,确保您的二进制文件始终是最新的,并且易于分发。
RecoveryAshes Blog