概述

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 在网页上手动触发

示例如下:

on:
  push:
    tags:
      - "v*"
  workflow_dispatch:

使命

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

一般来说,需求界说使命运转的环境和其步骤。步骤中又可以运用 action,或运转指定的指令等。一个简略的示例如下:

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,完好文件可以见 这里

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