GitHub Actions Workflows 部署 Hexo
Github Action
是Github 提供的免费可持续集成服务,在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。 可以发现、创建和共享操作以执行任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。
GitHub Actions 简单易用,在仓库根目录下建立.github/workflows
文件夹,把workflows工作流文件(YAML
)放到这个目录下,就可以使用Github Action服务了
workflows 文件
由多个job组合而成,其指定了持续集成要完成的工作,每个工作流文件代表着一个持续集成工程
- 每个
workflow
由多个job
组成,每个job
就是你指定的任务 - 每个
job
由多个step
组成,每个step
代表任务的具体步骤 - 每个
step
由多个action
组成,代表具体要执行的指令,actoin
是workflows
中的最小单位
Action
GitHub提供了大量方便的工具,使你可以轻松的完成各种任务。比如克隆仓库并检出,向仓库提交内容,安装各种语言环境,同步文件等等,都有对应的工具,它们就是 Action,只需要调用它们就可以了,几乎不用写任何命令,你需要的在Action市场几乎全部可以找到。如 actions/checkout
是用来checout仓库的,actions
表示这个工具是官方的,如果是其它名称,则表示是第三方提供的
Hexo 发布到 Github Pages 及 Ailyun
没有使用 GitHub Actions 的发布流程
push
- 生成静态页:Hexo或hugo,Jekyll等静态博客生成器
push
静态页,在github pages
上完成发布- 登录远程服务器,拉取静态页,在自己的站点完成发布
使用 GitHub Actions 的发布流程
push
后面的工作完全自动化完成
- 你不需要在你的本机上安装Hexo等静态站点生成器运行环境
- 文章的Build的工作在GitHub 的
work runner
中完成,不需要占用的你电脑的资源 - 在GitHub 上构建速度快,软硬件兼容性问题也少
- 可以随时随地的部署:比如你发布后发现有个错别字要改,那么你用手机登录Github,直接在页面上修改,提交后就会触发部署,甚至都不需要打开电脑,方便快捷。
建立SSH密钥对
博客涉及到三个仓库:
- Hexo.git,用来存放Hexo项目和文章
- next.git博客主题
- gagahappy.github.io 用来存放发布的HTML页,设置为 Github Pages
为什么会用到密钥对
Aliyun服务器:构建过程中要远程登录到Aliyun服务器,要用密钥进行身份验证,需要用到密钥对
Github Pages:Github的建议是把源文件即Hexo.git放到master分支,把gagahappy.github.io放到gh-pages分支。但Github Pages必须是公开仓库才可以发布,这样就让存放源文件的Hexo.git也可以被访问,这显然是不安全的,所以没有把这两个仓库放在一起,那么对gagahappy.github.io进行发布就需要使用密钥对,才能对仓库进行操作。如果你遵循了Github的建议,那这么在发布Github pages时就不用设置密钥对了。
生成密钥对
ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f gh-pages -N ""
# You will get 2 files:
# gh-pages.pub (public key)
# gh-pages (private key)
把gh-pages.pub
中的内容添加到远程服务器的~/.ssh/authorized_keys
中或把文件上传到~/.ssh/
目录,执行
cat gh-pages.pub >> authorized_keys
chmod 600 -R ~/.ssh # 设置~/ssh目录权限
设置 github Secrets
Secrets 是用来存放敏感信息的,如数据库的密码,用户名,密钥,等信息,不会让这些信息在日志输出中暴露出来,会以星号(*)代替这些敏感信息。
在Hexo.git仓库的首页点击 settings
,在左侧找到Secrets
,点击右上New repository secret
,name
填写ACTIONS_DEPLOY_KEY
,value
填写密钥gh-pages
的内容, 点击Add secret
,这样就创建了一个secret
。之后可以用这个secret
操作 gagahappy.github.io 仓库。
你还可以创建其它的secret
,比如MySQL连接的密码,可以新建一个名称为mysql_passwd
,内容为MySQL密码的Secret
。更多信息可以查看官方 Secrets 帮助
# secret 在日志中使用 * 号输出敏感信息
SOURCE: public/
REMOTE_HOST: ***
REMOTE_USER: ***
TARGET: ***
SSH_PRIVATE_KEY: ***
设置 Deploy keys
打开gagahappy.github.io
仓库,在仓库的首页点击 settings
,在左侧找到Deploy keys
,把gh-pages.pub
的内容复制进去,勾选下面的Allow write access
,点击Add Key
,这样在之后的部署过程中,Hexo.git仓库所在的runner
就可以通过secrets.ACTIONS_DEPLOY_KEY
对其进行操作了。
编写工作流文件
在Hexo.git项目根目录下建立.github/wrokflows
文件夹,在这个文件夹下创建以yml
结尾的文件build.yml
。每当你push
到github后,github会自动寻找仓库根目录下的.github/wrokflows
中扩展名为yml
的所文件,运行其中的指令,完成自动部署。
mkdir -p .github/workflows
touch .github/workflows/build.yml
需要持续集成完成的工作有
- Checkout
hexo.git
中的内容 - Checkout
next.git
主题内容到 theme目录 - 安装
node.js
环境 - 安装Hexo
- 使用Hexo生成静态页面
- 发布静态页面到
gagahappy.github.io
- 同步静态页到Aliyun服务器
把以上内容翻译为要执行的配置命令就是
on:
push:
branches: [master] # 在master分支push时触发部署
paths-ignore: # 以下文件的变更不触发部署
- README.md
workflow_dispatch:
env: # 统一设置环境变量
GIT_USER: git
GIT_EMAIL: email@example.com
THEME_REPO: git/next # 你使用的主题仓库地址
THEME_BRANCH: master
DEPLOY_REPO: git/gagahappy.github.io # 你用来发布github pages的仓库地址
DEPLOY_BRANCH: master
jobs:
build: # job_id,其它job可以引用,比如两个job有先后顺序
name: Build Github Page And Deploy On Aliyun # job名称
runs-on: ubuntu-latest # 构建使用的系统,支持 linux/mac/windows
timeout-minutes: 5 # job超时时间,超过后job会被停止运行
steps: # 一个job由多个 step 组成,本博的由7个step组成
# 1. Checkout hexo.git 中的内容
- name: Checkout Hexo repo
# 检出项目,如果不指定名称,默认使用运行Github Action 的仓库,即hexo.git
uses: actions/checkout@v2
# 2. Checkout next.git 主题内容到 theme目录
- name: Checkout Theme repo
# actions/checkout 就是Acton工具,实现checkout项目,每个action也是一个git仓库
# 可以直接通过 github.com/工具名称进行访问,即github.com/actions/checkout
uses: actions/checkout@v2
with:
repository: ${{ env.THEME_REPO }} # 要checkout的仓库地址
ref: ${{ env.THEME_BRANCH }}
path: themes/next # 要checkout到的路径
# 3. 安装 node.js 环境
- name: Use Node.js ${{ matrix.node }}
uses: actions/setup-node@v2 # 使用actions/setup-node安装nodejs
with:
node-version: ${{ matrix.node }}
# 4. 安装Heox
- name: Install Hexo
run: | # 运行command命令
npm install -g hexo-cli
npm install
# 5. 使用Hexo生成静态页面
- name: Generate Blog
run: |
hexo generate
# 6. 发布静态页面到 gagahappy.github.io
# 使用 peaceiris/actions-gh-pages 第三方Action工具,发布静态内容到 github pages
# 重要:
# 如果你的源码文件与Html文件在两个仓库,请在源码文件仓库设置
# secrets 的 ACTIONS_DEPLOY_KEY 值为密钥内容,
# 在html文件仓库即youname.github.io中设置 Deploy keys 的值设置为公钥内容,
# 在构建过程中会使用密钥对youname.github.io进行操作
- name: Deploy Github Page
uses: peaceiris/actions-gh-pages@v3
with:
# 在 hexo.git 上设置的私钥
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} # ACTIONS_DEPLOY_KEY 不能修改
external_repository: ${{ env.DEPLOY_REPO }} # Hexo.git 的仓库地址
publish_branch: ${{ env.DEPLOY_BRANCH }}
publish_dir: ./public # 使用Hexo/hugo等生成静态页面的目录
user_name: ${{ env.GIT_USER }}
user_email: ${{ env.GIT_EMAIL }}
# 7. 同步静态页到Aliyun服务器
- name: Deploy Github Page on Aliyun
uses: easingthemes/ssh-deploy@main
env:
SSH_PRIVATE_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
ARGS: "-rltgoDzvO --delete"
SOURCE: "public/" # 使用Hexo/hugo等生成静态页面的目录
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
可以点击仓库主页上的Actions
,查看正在运行的workflows
,里面有详细的日志信息
参考链接
- GitHub 官方市场
- https://github.com/actions
- Action awesome actions 仓库
- https://help.github.com/en/articles/about-actions
- https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions
- https://github.com/peaceiris/actions-gh-pages
- https://docs.github.com/en/actions/reference/encrypted-secrets
- https://docs.github.com/cn/actions