什么?2024年你还不会用GitHub Actions?

概述

GitHub Actions 是一个用来自动化软件开发工作流的工具。它的用途包括但不限于 CI/CD、生成文档、自动发布 Release、操作 Issue 等。它类似于 GitLab CI/CD、Jenkins 等 CI/CD 工具,有丰富的文档和社区支持,很适合用来入门。接下来我简单讲述一个最简单的构建 Go Web 应用并发布 docker 镜像到 DockerHub 的过程。

配置 GitHub Actions 需要一个 yaml 文件。一般有以下几个部分:

  • name 这个 action 的名称
  • on 触发条件
  • jobs 要运行的任务

触发条件

有很多事件可以触发工作流运行,详情可以看 Events that trigger workflows - GitHub Docs。列举几个常用的:

  • push:tags 标签触发,可以在 push 标签的时候触发构建、创建 Release 等
  • push:branches 某分支触发,可以在测试期间实现 push 代码后自动构建并部署
  • workflow_dispatch 在网页上手动触发

示例如下:

yaml 复制代码
on:
  push:
    tags:
      - "v*"
  workflow_dispatch:

任务

一个工作流(workflow)可以有多个任务(job),每个任务又有多个步骤(step)。

一般来说,需要定义任务运行的环境和其步骤。步骤中又可以使用 action,或运行指定的指令等。一个简单的示例如下:

yaml 复制代码
jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
	  - name: Login to DockerHub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Run Make
        run: make build-docker

runs-on 定义了这个job 的运行环境(操作系统和架构),完整的列表可以看这里

steps 定义了这个job 要执行的步骤。示例中的 actions/checkout@v4 docker/login-action@v3 均为预先写好的 action,是可以复用的一小段步骤。更多的 action 可以在 GitHub Marketplace 中找到。

对于预先写好的 action,一般会提供一些参数供你定义,使用 with 关键字即可传入这些参数。你也可以运行一些简单的命令,使用 run 关键字即可。

一开始理解"步骤"可能会比较模糊,你可以这么想:

  • 每个 job 会给你分配一台空白的机器,拥有一个空白的目录
  • 每个 step 相当于在这个空白机器上运行一条命令(或对于actions 来说是一个脚本)

因此你会在一个 job 的开头看到一些拉取代码,配置环境的 actions,然后再对代码进行运行单测、编译、发布等等。

Secrets

在运行工作流的过程中,可能会遇到一些需要传入敏感信息(例如上面的 dockerhub 的账号密码等)的情况,把这些敏感信息写在 yaml 明文里是不安全的,因此 GitHub 提供了 Secrets 功能。可以在项目中配置 secrets,并在工作流的 yaml 中通过 ${{ secrets.XXX }} 获取。

完整例子

这是我的 Go Web 应用脚手架的 workflow,完整文件可以见 这里

yaml 复制代码
name: release

on:
  push:
    tags:
      - "*"

permissions:
  contents: write

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - run: git fetch --force --tags
      - uses: actions/setup-go@v4
        with:
          go-version: stable
      - name: Docker Login
        uses: docker/login-action@v3.0.0
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - uses: goreleaser/goreleaser-action@v5
        with:
          distribution: goreleaser
          version: latest
          args: release --clean
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

可以看到这个 workflow 的基础信息:名叫 release,在推送 tag 的时候触发。同时他定义了一个 job,叫 goreleaser ,有若干步骤。

  • 检出代码,相当于把代码拉取到构建机器。
  • 配置 Go 环境。
  • 登录到 DockerHub
  • 运行 goreleaser

GoReleaser 是一个 Go 的构建发布工具,能够把 Go 应用程序发布到 GitHub、DockerHub 等等,同时由于 Go 的跨平台特性,通过 GoReleaser 构建发布的二进制、镜像等也能支持多个平台。

配置好后,当 push 一个 tag 到 GitHub 时,这个 workflow 会自动运行,并发布。其效果如 Release v0.1.1 · LeslieLeung/gin-application-template · GitHub

Ref

相关推荐
passerby606115 小时前
完成前端时间处理的另一块版图
前端·github·web components
草梅友仁17 小时前
墨梅博客 1.4.0 发布与开源动态 | 2026 年第 6 周草梅周报
开源·github·ai编程
学电子她就能回来吗18 小时前
深度学习速成:损失函数与反向传播
人工智能·深度学习·学习·计算机视觉·github
xuhe21 天前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr
宇宙帅猴1 天前
GitHub 私有仓库认证完整指南:告别密码错误,使用 PAT 令牌
github
前端市界1 天前
用 React 手搓一个 3D 翻页书籍组件,呼吸海浪式翻页,交互体验带感!
前端·架构·github
happyprince1 天前
2026年02月07日热门github项目
github
CoderJia程序员甲1 天前
GitHub 热榜项目 - 日榜(2026-02-06)
人工智能·ai·大模型·github·ai教程
荔枝吻1 天前
忘记服务器密码,在Xshell7中查看已保存密码
运维·服务器·github
tod1131 天前
TCP全连接队列与tcpdump抓包
网络·网络协议·tcp/ip·github·tcpdump