显示 / 隐藏 文章目录 ]

Github自动编译上传s3发布Release

上次更新: 2025-06-24 16:22:05

使用 GitHub Actions 自动化 Go 二进制文件构建、S3 上传和 GitHub Release

在本教程中,我们将详细介绍如何使用 GitHub Actions 自动化构建 Go 二进制文件,上传到 Cloudflare R2(S3 兼容存储),并创建包含这些二进制文件的 GitHub Release。这个自动化流程非常适合需要跨平台分发的 Go 项目,能够节省时间并确保一致性。

先决条件

在开始之前,请确保您已准备好以下内容:

  1. GitHub 账户和仓库

    • 您需要一个 GitHub 账户和一个包含 Go 项目的仓库。
    • 确保仓库中有一个主入口文件,例如 main.go
  2. Go 项目

    • 您的 Go 项目应包含可编译为二进制文件的代码。
    • 本教程假设主文件名为 main.go,如果不同,请相应调整。
  3. Cloudflare R2 账户

    • 注册 Cloudflare R2 账户。
    • 创建一个存储桶(例如 cfrescan)用于存储二进制文件。
    • 获取 R2 的访问密钥 ID 和秘密访问密钥。
  4. 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:按顺序执行的步骤列表。

步骤详细说明

  1. 检出代码

  2. 设置 Go 环境

    • 使用 actions/setup-go@v4 设置 Go 环境,指定版本为 1.21。
    • 您可以根据需要更改 go-version,例如设置为 1.20
  3. 安装 UPX

    • 安装 UPX,一个用于压缩可执行文件的工具,以减小二进制文件大小。
  4. 构建二进制文件

    • 设置链接器标志 -s -w 以剥离调试信息,-trimpath 移除源代码路径,减小二进制文件大小。
    • 为以下平台和架构构建二进制文件:
      • dddd64.exe:Windows 64 位 (amd64)
      • dddd.exe:Windows 32 位 (386)
      • dddd_linux64:Linux 64 位 (amd64)
      • dddd_linux_arm64:Linux ARM64
      • dddd_darwin64:macOS 64 位 (amd64)
      • dddd_darwin_arm64:macOS ARM64
    • 使用 UPX 压缩 Windows 和 Linux 二进制文件。macOS 二进制文件未使用 UPX,因为 UPX 对 macOS 的支持有限。
    • 注意:确保将 main.go 替换为您项目的实际主文件,并根据需要调整二进制文件名。
  5. 移动二进制文件到 dist 目录

    • 创建 dist 目录并将所有二进制文件移动到该目录,便于后续上传。
  6. 上传到 R2

    • 使用 AWS CLI 的 s3 sync 命令将 dist 目录中的文件同步到 R2 存储桶。
    • 通过 GitHub Secrets 设置 AWS 凭证(R2_ACCESS_KEY_IDR2_SECRET_ACCESS_KEY)。
    • 注意:替换 s3://cfrescan/ 为您的实际 R2 存储桶名称,并确保 endpoint URL 正确。
  7. 创建 GitHub Release

    • 使用 softprops/action-gh-release@v1 创建 GitHub Release。
    • 标签名称设置为 ${{ github.ref_name }},即触发工作流的标签(如 v1.0.0)。
    • 包含 dist 目录中的所有二进制文件。
    • 注意:确保触发工作流的标签符合预期,避免在分支推送时创建不必要的 Release。

测试和验证

要测试工作流,请按照以下步骤操作:

  1. 推送代码

    • 创建一个新标签(例如 git tag v1.0.0git push origin v1.0.0)以触发工作流。
  2. 监控工作流

    • 转到仓库的 Actions 选项卡,查看工作流运行状态。
  3. 验证 R2 上传

  4. 验证 GitHub Release

    • 转到仓库的 Releases 部分,确认新 Release 已创建并包含所有二进制文件。

故障排除

以下是一些常见问题及其解决方法:

  • 二进制文件未找到

    • 确保 go build 命令成功运行,检查 main.go 是否存在。
    • Build binaries 步骤中添加 ls -l 以记录生成的二进制文件。
  • R2 上传失败

    • 验证 R2_ACCESS_KEY_IDR2_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