什么是GitHub Actions?

GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。

GitHub Actions简单来说就是一个可以帮你自己跑脚本的机器,并且你写的脚本和别人写的脚本都放在一个仓库里面,GitHub把这个仓库公开,大家可以互相用别人写好的脚本,并且,GitHub还提供Linux、Windows、macOS虚拟机来运行工作,极大提高开发效率(当然,主要是免费)。

Actions

actions可以说是一个工作流程,比如一个项目的构建需要用到一些操作,构建代码、运行测试、登录远程服务器、发布到第三方服务器等等,GitHub将这些操作称之为Actions,也就是执行一个项目的完整流程的脚本叫做Actions

我们在使用的时候,如果需求不复杂,我们完全可以去找别人写好的actions来用就行,减少自己编写脚本的时间,将各种actions组合在一起,就变成一个新的工作流了。这也是GitHub Actions比较特别的地方,真的做到简洁、提高开发效率的方法。

GitHub也做了一个Actions官方市场,可以搜索到别人提交的Actions,还有另外一个Awesome Actions的仓库,也可以找到不少的action

01-actions-20230331-551

上面说了,每个 action 就是一个独立脚本,因此可以做成代码仓库,使用userName/repoName的语法引用 action。比如,actions/setup-node就表示github.com/actions/setup-node这个仓库,它代表一个 action,作用是安装 Node.js。事实上,GitHub 官方的 actions 都放在 github.com/actions 里面。

既然 actions 是代码仓库,当然就有版本的概念,用户可以引用某个具体版本的 action。下面都是合法的 action 引用,用的就是 Git 的指针概念,详见官方文档

1
2
3
actions/setup-node@74bc508 # 指向一个 commit
actions/setup-node@v1.0 # 指向一个标签
actions/setup-node@master # 指向一个分支

基本概念

GitHub Actions 有一些自己的术语。

  1. workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。

  2. job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。

  3. step(步骤):每个 job 由多个 step 构成,一步步完成。

  4. action (动作):每个 step 可以依次执行一个或多个命令(action)。

GitHub Actions使用需知

GitHub Actions的工作流文件存储在/.github/workflows/XXX.ymlXXX表示任意文件名,只要在该目录下创建任何的文件,并且文件后缀是.yml默认是GitHub Actions

${{ secrets.XXX }}表示的是私有变量,需要自己手动添加,该变量可以保证变量的值暴露给他人,保证安全。

00-文件位置-Blog20230205-953

发送邮件

使用场景

用于项目构建结果通知,我的Hexo博客放在GitHub Actions构建,在工作流最后使用邮件通知,如果在博客构建过程中出错,则不会发送邮件通知,如果构建成功,则会通过邮件通知我构建成功。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
- name: 发送邮件
uses: dawidd6/action-send-mail@v2
with:
server_address: smtp.163.com # 发送端的服务器地址
server_port: 465 # 发送端服务器的端口号
# 账号 授权码
username: ${{secrets.EMAIL_USERNAME}} # 发送的邮箱号(发送端)
password: ${{secrets.EMAIL_PASSWORD}} # 发送的邮箱授权码(发送端)
subject: ${{secrets.EMAIL_TITLE}} # 邮件内容标题
body: ${{secrets.EMAIL_BODY}} # 邮件内容,支持HTML
to: ${{secrets.EMAIL_TO}} # 接收邮件账号(接收端)
from: ${{secrets.EMAIL_FROM}} # 发送的邮箱号(发送端)
content_type: text/html #内容请求类型

不知道发送服务器地址和端口号看这篇文章 https://blog.hikki.site/dd7ff60b.html

发送邮件的GitHub Actions有很多现成的案例,比如:https://github.com/marketplace/actions/send-mailer,根据自己的喜好选择自己的。

将Actions虚拟机文件部署到服务器

使用场景

在Hexo博客构建时生成的HTML文件在/public下,将该文件夹内容同步到服务器。

代码实现

1
2
3
4
5
6
7
8
9
10
11
- name: 部署到服务器
uses: burnett01/rsync-deployments@4.1
with:
# 这里是 rsync 的参数 switches: -avzh --delete --exclude="" --include="" --filter=""
switches: -avzh
path: public/ # 将public文件夹同步到服务器下的 PATH 路径
remote_path: ${{ secrets.PATH }} #服务器的文件存放绝对路径
remote_host: ${{ secrets.DOMAIN }} #服务器域名或者IP地址
remote_port: ${{ secrets.EXPORT }} # ssh远程端口(如果没修改过ssh远程端口,默认是22)
remote_user: ${{ secrets.USER }} # 使用ssh登录的用户
remote_key: ${{ secrets.PC_PRIVATE_KEY }} #能够远程到服务器的电脑私钥
  • switches:第一个用于任何初始/必需的rsync标志,例如:-avzr --delete
  • rsh:远程shell命令
  • path :源路径。默认为GITHUB_WORKSPACE,并且相对于它
  • remote_path:部署目标路径
  • remote_host: 远程主机
  • remote_port:远程端口。默认为22
  • remote_user: 远程用户
  • remote_key: 远程ssh私钥
  • remote_key_pass :远程ssh密钥密码(如果有)

执行简单的Bash命令

使用场景

用于安装npm包或者打印某某文件。

代码实现

指定亚洲时区,安装hexo-cli

1
2
3
4
- name: 安装 Hexo
run: |
export TZ='Asia/Shanghai'
npm install hexo-cli -g

Hexo自动构建

使用场景

使用Hexo博客都知道,我们每次更新博客文章时,都需要在本地构建再推送文章到服务器或者GitHub pages,文章越多,构建时间越长。

为此,GitHub Actions的出现可以帮我们解决这个问题,我们可以将构建这部分放在GitHub Actions自动化,构建完成自动将文章推送到服务器或者GitHub Pages。

代码实现

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
name: Hexo自动部署
# 当有改动推送到master分支时,启动Action
on: # 触发该actions
push: # 当提交时触发该事件
branches: # 指定提交到某分支才触发事件
- main # 指定提交到main分支触发事件
#2020年10月后github新建仓库默认分支改为main,注意更改
release:
types:
- published

jobs:
deploy:
runs-on: ubuntu-latest # 该actions运行的环境,这里指定在Ubuntu系统环境下运行
steps:
- name: 检查分支
uses: actions/checkout@v2
with:
ref: main

- name: 安装 Node
uses: actions/setup-node@v1
with:
node-version: "16.x"

- name: 安装 Hexo
run: |
export TZ='Asia/Shanghai'
npm install hexo-cli -g

- name: 缓存 Hexo
uses: actions/cache@v1
id: cache
with:
path: node_modules
key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}}

- name: 安装依赖
if: steps.cache.outputs.cache-hit != 'true'
run: |
npm -v
node -v
npm install -g npm
npm install --save

- name: 生成静态文件
run: |
echo "开始清除html文件"
hexo clean
echo "开始生成html文件"
hexo generate


- name: 部署到服务器
uses: burnett01/rsync-deployments@4.1
with:
# 这里是 rsync 的参数 switches: -avzh --delete --exclude="" --include="" --filter=""
switches: -avzh
path: public/ # 将public文件夹同步到服务器下的 PATH 路径
remote_path: ${{ secrets.PATH }} #服务器的文件存放绝对路径
remote_host: ${{ secrets.DOMAIN }} #服务器域名或者IP地址
remote_port: ${{ secrets.EXPORT }} # ssh远程端口(如果没修改过ssh远程端口,默认是22)
remote_user: ${{ secrets.USER }} # 使用ssh登录的用户
remote_key: ${{ secrets.PC_PRIVATE_KEY }}

构建Hexo博客主要是前面50行代码,后面部署到服务器,和文章上面的一样。

前面部分可以直接复制去使用。

Hugo自动构建

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
name: Hugo自动部署
# 当有改动推送到hugo分支时,启动Action
on: # 触发该actions
push: # 当提交时触发该事件
branches: # 指定提交到某分支才触发事件
- hugo # 指定提交到hugo分支触发事件
#2020年10月后github新建仓库默认分支改为main,注意更改

jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-20.04
steps:
- name: 检出仓库代码
uses: actions/checkout@v2
with:
submodules: true # 包含子模块,也就是链接的主题
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod

- name: 安装hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: '0.85.0'
extended: true

- name: 开始构建
run: hugo --minify

- name: 部署到服务器
uses: burnett01/rsync-deployments@4.1
with:
# 这里是 rsync 的参数 switches: -avzh --delete --exclude="" --include="" --filter=""
switches: -avzh
path: ./public/ # 将public文件夹同步到服务器下的 PATH 路径
remote_path: /www/git/hexo/link/moments #服务器的文件存放绝对路径
remote_host: ${{ secrets.DOMAIN }} #服务器域名或者IP地址
remote_port: ${{ secrets.EXPORT }} # ssh远程端口(如果没修改过ssh远程端口,默认是22)
remote_user: ${{ secrets.USER }} # 使用ssh登录的用户
remote_key: ${{ secrets.PC_PRIVATE_KEY }} # 电脑的私钥


- name: 发送邮件
uses: dawidd6/action-send-mail@v2
with:
server_address: smtp.163.com # 发送端的服务器地址
server_port: 465 # 发送端服务器的端口号
# 不知道发送服务器地址和端口号看这篇文章 https://blog.hikki.site/dd7ff60b.html
# 账号 授权码
username: ${{secrets.EMAIL_USERNAME}} # 发送的邮箱号(发送端)
password: ${{secrets.EMAIL_PASSWORD}} # 发送的邮箱授权码(发送端)
subject: Hugo # 邮件内容标题
body: Hugo动态更新成功 # 邮件内容,支持HTML
to: ${{secrets.EMAIL_TO}} # 接收邮件账号(接收端)
from: ${{secrets.EMAIL_FROM}} # 发送的邮箱号(发送端)
content_type: text/html

推送文件到腾讯云COS

使用场景

我的博客部署在服务器上,由于静态资源过多,我想把部分的静态资源,如js、css、xml这些文件存储在腾讯云的对象存储上,降低服务器的压力。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
# action仓库:https://github.com/marketplace/actions/tencent-cos-and-cdn
- name: 推送文件到腾讯云COS或者CDN
uses: sylingd/tencent-cos-and-cdn-action@v1
with:
secret_id: ${{ secrets.TENCENTCLOUD_SECRET_ID }} # (必填)
secret_key: ${{ secrets.TENCENTCLOUD_SECRET_KEY }} # (必填)
cos_bucket: blog-1305702233 # (必填) COS 存储桶名称
cos_region: ap-guangzhou # (必填)COS 存储桶区域
local_path: public/search.xml # (必填)将要上传到 COS 的本地路径。可为文件夹或单个文件
remote_path: /static/search.xml # (必填)将文件上传到 COS 的指定路径
clean: false
cos_accelerate: false

secret_id:腾讯云 secret id,请使用加密环境变量

secret_key:腾讯云 secret key,请使用加密环境变量

cos_bucket:COS 存储桶名称

cos_region:COS 存储桶区域(如广州填写ap-guangzhou)

local_path:将要上传到 COS 的本地路径。可为文件夹或单个文件

remote_path:将文件上传到 COS 的指定路径

clean:设为true将会清除 COS 上不存在于本地的文件。默认为 false

cos_accelerate:设为true以使用加速域名进行上传(此选项与 CDN 无关)。默认为false

local_path是指你的GitHub Action的虚拟机里面的路径。 比如我的hexo构建后在当前文件夹生成一个/public文件夹,该文件夹存放的hexo的html文件,我想将该文件夹下的search.xml文件推送到对象存储的/static文件夹下,写法如上面代码

获取对象存储的秘钥
  1. 访问管理

03-打开用户信息-20230412-991

  1. 选择用户进入

05-点击进入账户-20230412-590

  1. 复制秘钥SecretIdSecretKey

06-秘钥-20230412-643

2023.4.12持续更新,后续更新可以点击原文查看博客最新