概述
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。