Github Actions Workflows 使用

Github Actions workflows

  • Workflows 是一个可以配置的自动化流程
  • 它通过 YAML 文件定义,存放在仓库的 .github/workflows 目录中
  • 可以有多个工作流,可以手动触发也可自动触发
  • 免费版本每月有 2000 分钟的使用资源,也足够用了

如果想要系统的学习 Github Actions,可以直接查看👉 📘官方文档 👈进行学习

后面的内容就基于基本的文件内容和本人遇到的实际需求来写了,存个档方便以后忘了回来 Ctrl CV 🤔

yml 工作流配置文件

  • 第一步在仓库的 .github/workflows 下随便创建一个 .yml 文件 (例如 demo.yml)
  • 直接从官方文档上复制的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 这里 name 是可选项,如果指定了 name, 它会显示在 Github 仓库的 Actions 页面里,实际操作一下就晓得了
name: learn-github-actions
# 这里 run-name 也是可选项(从来没用过, 需要了解的话官方文档里有解释)
run-name: ${{ github.actor }} is learning GitHub Actions
# on 用来指定这个工作流的触发器(也就是什么时候执行工作流)
on: [push]
# jobs 里头指定要执行的作业任务
jobs:
# 这里是定义了一个名为 check-bats-version 的作业 (这个名可以随便起
check-bats-version:
# runs-on 定义这个作业运行在什么系统环境下
runs-on: ubuntu-latest
# steps 下面是这个作业的执行步骤
steps:
# 第一步调用 actions/checkout@v3 这个操作
- uses: actions/checkout@v3
# 第二步调用 actions/setup-node@v3 这个操作,并携带运行参数
- uses: actions/setup-node@v3
with:
node-version: '14'
# 第三步执行命令
- run: npm install -g bats
# 第四步执行命令
- run: bats -v

on 触发工作流

1
2
3
4
5
6
7
8
9
on:
workflow_dispatch:
schedule:
- cron: "0 */24 * * *"
push:
branches:
- master
tags:
- v*
  • workflow_dispatch: 可指定手动触发工作流,效果看📘这里
  • schedule: 可在计划时间触发工作流(crontab),具体说明看📘这里
  • push: 这里指定的是在 master 分支上有人推送时或有人推送以 v 开头的 tag 时会触发,具体的说明看这里

job 作业内容

  • 在 Github 👉 Marketplace 上有很多 actions
    • 可以直接在上面搜关键词寻找满足自己需求的操作
      • 例如环境配置

一些常用的 actions:

Secrets

在一些 actions 的使用模板中可能会看到类似这样的内容:

1
2
3
4
5
6
steps:
- shell: bash
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "$SUPER_SECRET"
  • 这里的 secrets 可以认为是 Github Actions 工作流程的变量值,这个值只能有仓库管理员进行添加修改,可以用于传递密码、限制权限等
  • ⚠️ 注意这里有一个特别的 secret 👉 secrets.GITHUB_TOKEN
    • 这是 Github 自动创建的一个唯一的 secret(不能手动创建),可以在工作流中进行身份验证,详细说明看📘这里
    • 使用到这个值的操作可能需要写权限,默认是只读权限,添加写权限需要到操作的仓库设置中的 Actions -> General -> Workflow permissions 中将其值修改为 Read and write permissions

实例

自动编译并发布

  • 例如需要将一个 Go 的项目自动编译并发布 Release
    • 具体需求是当用户将以 v 开头的 tag push 到仓库时自动执行:
      • 编译该项目并将编译的程序 target 压缩为 target-linux-amd64.tar.gz
      • 发布一个同 tag 名的 Release,并将打包好的 tar.gz 文件上传到 Release 中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
name: build
on:
push:
tags:
- "v*"
jobs:
build_and_publish:
name: Build and Publish Release
runs-on: ubuntu-latest
steps:

- name: Checkout
uses: actions/checkout@v4
- name: Build and Compress
run: |
go build -o target .
tar zcvf target-linux-amd64.tar.gz target
- name: Crate a Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
- name: Upload Release Asset
id: upload-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./target-linux-amd64.tar.gz
asset_name: target-linux-amd64.tar.gz
asset_content_type: application/gzip

TODO