GitHub Actions 是 GitHub 提供的 CI/CD 服务,早在 2018 年 10 月就已推出,但我一直未曾使用。最近遇到一个需求(如何更优雅地部署博客),才终于想起了它。目前我的站点放在自己的服务器上,每次都要先在本地编译,再手动打包上传到服务器,接着解压到 public 文件夹,整个过程有点繁琐。而博客的源码已经托管在 GitHub 上,我想,如果每次 push 后都能自动完成部署,那就太好了。于是研究了下 Github Actions,顺便把一些内容记录下来,方便日后查阅

Table of contents
Open Table of contents
Github Actions 是什么
一个 CI/CD 流程里要做的事情可多了,比如运行测试、登录 SSH、发布应用等等。GitHub 把这些具体任务都叫作 Actions。很多基础操作,我们没必要自己造轮子,直接在 GitHub Actions 市场里搜一下就好。要是有人已经写好了,直接拿来用
- Github Actions 市场:
https://github.com/marketplace?type=actions
Github Actions 术语
| # | 术语 | 描述 |
|---|---|---|
| 1 | workflow | 持续集成一次运行的过程,就是一个 workflow |
| 2 | job | 一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务 |
| 3 | step | 每个 job 由多个 step 构成,一步步完成 |
| 4 | action | 每个 step 可以依次执行一个或多个命令(action) |
workflow 文件

Actions 配置文件叫 workflow 文件,放在代码根目录 .github/workflows 下,workflow 使用的是 YAML 格式,比如 deploy.yml。Github 只要发现 .github/workflows 下有 .yml 文件就会自动允许这个文件。另外,workflow 配置文件有很多字段,详见官方文档,本文只记录这次我需要用的字段。
(1)name
name字段是 workflow 的名称,如果省略该字段,默认为当前 workflow 的文件名
(2)on
指定触发 workflow 的条件,通常是某些事件,GitHub Actions 也支持外部事件触发,或者定时运行
on.<push|pull_request>.<tags|branches>:指定触发事件时,可以限定分支或标签
# 只有main分支发生push事件时,才会触发 workflow
on:
push:
branches:
- main
(3)jobs
workflow 文件的主体是jobs字段,表示要执行的一项或多项任务。
jobs.<job_id>.name
# jobs 包含2个任务,job_id分别是 m_1_job 和 m_2_job
jobs:
m_1_job:
name: my first job
m_2_job:
name: my second job
jobs.<job_id>.needs
needs 字段指定当前任务的依赖关系,即运行顺序,下面这 3 个 job,job2 必须等待 job1 执行完才会执行,job3 必须等待 job1 和 job2 执行完才会执行
jobs:
m_1_job:
name: my first job
m_2_job:
name: my second job
needs: [m_1_job]
m_3_job:
name: my third job
needs: [m_1_job,m_2_job]
jobs.<job_id>.runs-on
指定运行所需要的虚拟机环境
# 指定它运行在 Ubuntu 最新版环境
runs-on: ubuntu-latest
jobs.<job_id>.steps
指定每个 Job 的运行步骤,可以包含一个或多个步骤。每个步骤都可以指定以下字段:
jobs.<job_id>.steps.name名称jobs.<job_id>.steps.run命令或actionjobs.<job_id>.steps.env环境变量jobs.<job_id>.steps.uses选哪个工具jobs.<job_id>.steps.with传递参数,with 只能用在 uses 后面(即调用第三方 Action 时)
steps:
- name: 拉代码
uses: actions/checkout@v4
- name: 安装 Node
uses: actions/setup-node@v4 # 使用 GitHub 官方提供的 setup-node 动作
with:
node-version: 20 # 告诉它装 Node 20 版本
我的 workflow 配置文件
name: Deploy Blog
# 只有main分支发生push事件时,才会触发 workflow
on:
push:
branches:
- main
jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- name: 拉代码
uses: actions/checkout@v4
- name: 安装 Node
uses: actions/setup-node@v4
with:
node-version: 20
- name: 安装依赖
run: npm install
- name: 构建
run: npm run build
- name: 清空服务器目录
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
rm -rf /opt/1panel/www/sites/mgrowup.com/index/*
- name: 上传文件
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
source: "dist/*"
target: "/opt/1panel/www/sites/mgrowup.com/index".github/workflows/deploy.yml
Github仓库配置环境变量
打开Github仓库,点击设置,在左侧找到 “Secrets and variables”
