Github Actions介绍&自动构建Github Pages博客

本文将主要讲述如何创建一个自定义的 Github Actions, 并且使用 Github Actions 完成 CI/CD 的操作

故事的起因就是,github 的私有仓库免费了, 打算将 blog 仓库切换为私有仓库,这样可以同时将笔记和博客放在一块,利用 hugo 的 draft 功能,将不想发布的文章设置 true 即可。

修改之后由于之前使用 Travis CI 自动构建博客的静态页面,而 Travis CI 对于私有仓库只能试用 100 次,正好之前获得了 Github Actions 的测试资格,但是一直都还没有使用过,本次记录一下 Github Actions 的使用过程

Actions

actions 可以用来作为 CI/CD 使用,但是它不只是 CI/CD,因为它其实是一组 docker 容器所组成的 Workflow,Workflow 的触发条件,公共仓库目前仅支持 push,私有仓库则支持 check_run、create、delete、issue comment, commit comment, pull request 等许多事件, 通过这些事件,可以完成除了 CI/CD 之外的许多自动化操作,例如接收到 issue comment 之后使用 telegram bot 发送通知等等

创建一个 Workflow

如果你有权限的话,在你的仓库下应该可以看到一个 Actions 的菜单

Workflow GUI

如下图所示

  1. 切换视图,从左到右分别是,GUI 的方式编辑,直接编辑文件,查看变动
  2. workflow 区域,一个 main.workflow 文件下可以包含多个 workflow,每一个 workflow
  3. 每个 workflow 具体的编辑区域,每个 workflow 可以关联多个 action,每个 action 都有头尾两个点,点击下拉即可连接起来
  4. 保存提交按钮

Workflow edit

如下图所示,workflow 只有两个可选的修改项,分别是 Name 以及触发条件,触发条件公共仓库目前仅支持 push,私有仓库则支持 check_run、create、delete、issue comment, commit comment, pull request 等许多事件。完整的触发条件可以查看 Events supported in workflow files

action edit

如下图所示

  1. uses 使用的 docker 镜像, 在 https://github.com/actions 提供了一些常用的 actions 可以直接使用
    1. {user}/{repo}/{path}@{ref} 直接使用公开的仓库,仓库里必须包含 dockerfile, path 为可选项,没有 path 默认为根路径,e.g actions/heroku@master, `actions/aws/ec2@v2.0.1`
    2. ./path/to/dir当前仓库的相对路径
    3. docker://{host}/{image}:{tag} docker 镜像地址,host 为可选项,不填 host 默认从 dockerhub 拉取,e.g docker://mohuishou/hugo:0.53, docker://gcr.io/cloud-builders/gradle
  2. label 就是标签
  3. runs 覆盖 dockerfile 中的 entrypoint
  4. args 覆盖 dockerfile 中的 cmd
  5. secret 读取该仓库保存的秘密变量,将以环境变量的形式注入到运行的容器中
  6. env 注入到运行的容器中的环境变量,是可见的

创建 Action

Action 其实就是 Docker 镜像,按照 Docker 镜像的写法即可,需要关注以下几点

1. Dockerfile Lables

github actions 会读取 dockerfile 的 label 在 Workflow GUI 上做一些展示

1
2
3
4
5
6
7
8
LABEL "com.github.actions.name"="" #Github action 的名字
LABEL "com.github.actions.description"="desc" #说明
LABEL "com.github.actions.icon"="mic" #GUI上展示的图标
LABEL "com.github.actions.color"="purple" # GUI上展示的颜色

LABEL "repository"="http://github.com/mohuishou/hugo-action" # 仓库地址
LABEL "homepage"="http://github.com/mohuishou" # 主页
LABEL "maintainer"="mohuishou <1@lailin.xyz>" # 作者

2. Env

默认的环境变量,以及如何读取

默认环境变量

所有的默认值可以参考这里 Environment variables

常用的主要有

Environment variableDescription
GITHUB_ACTOR用户的名字
GITHUB_REPOSITORY用户和仓库的地址 例如 mohuishou/hugo-action
GITHUB_WORKSPACEgithub 的工作区, 默认值为 /github/workspace
GITHUB_TOKENworkflow 的 github token 可以用来 clone 拉取数据,但是没有 push 的权限
读取环境变量

读取环境变量时需要注意,环境变量是在容器运行时注入的,所以在 dockerfile 里面没有办法直接使用

使用 hugo-action 自动 build&push 博客

https://github.com/mohuishou/hugo-action

遵循以下约定

  1. 你的博客源代码地址和 github pages 地址不同
  2. github pages 仓库地址为 youname.github.io

使用

创建文件 .github/main.workflow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
workflow "blog ci/cd" {
on = "push"
resolves = ["hugo"]
}

action "hugo" {
uses = "docker://mohuishou/hugo-action:0.53"
secrets = [
"TOKEN",
]
env = {
EMAIL = "1@lailin.xyz"
}
}

环境变量

KeyValueMust
TOKEN你的 github token,需要有 push 权限,保存在密码变量中yes
EMAIL你的邮箱

参考链接

  1. 官方文档
  2. GitHub Actions 介绍,了解一下?
  3. Github Actions Repo

关注我获取更新

wechat
知乎
开发者头条
github

猜你喜欢


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议,转载请注明出处,禁止全文转载