近期做了部署了一个基于Hugo的静态网站,每次更新完文章要手动生成网站,推送至服务器很麻烦,因此决定借助GitHub Actions进行CI/CD。
GitHub Actions官网简介,简而言之这是一款Github自带的CI/CD,帮助用户进行持续集成开发与部署。
GitHub Marketplace Actions里面包含了各种用于GitHub Action的模块,通过使用模块方便编辑yaml文件,省去很多造轮子的时间。
现有环境
- 服务器
- 静态网站文件夹/www/hugo/public
- 未转换前的Markdown文章文件夹/www/hugo/content/post
- 已安装hugo,在/www/hugo下执行hugo命令即可将Markdown文件转换为静态网页
- GitHub仓库
- content文件夹包含由本地推送到远程仓库的Markdown文件
流程分析
当新文章从从本地push到GitHub仓库或者新的pull request被合并时,将仓库的content文件夹镜像同步到服务器的/www/hugo/content文件夹并执行hugo命令生成静态网页。
yaml文件及分析
name: CI
#push时执行,由于pull request被合并时默认执行push,因此只限定push为触发行为即可
on:
push:
branches: [ master ]
#工作流
jobs:
# 命名为build的单个job
build:
# 选定运行环境为Ubuntu最新版本
runs-on: ubuntu-latest
#步骤
steps:
#uses用来调用GitHub Marketplace中的模块,此模块用于选择分支
- uses: actions/checkout@master
#此模块用于使用私钥访问远程主机
#key和known_host的值均在仓库的setting-sercerts中配置
#key为私钥,known_host使用ssh-keyscan host命令获取
- name: Install SSH Key
uses: shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_KEY }}
known_hosts: ${{ secrets.KNOWN_HOSTS }}
#执行同步任务,host在setting-sercerts中配置
- name: rsync
run: rsync -a --delete content/ ec2-user@${{secrets.HOST}:/www/hugo/content/
- name: make
run: ssh ec2-user@${{sercerts.HOST}} 'cd /www/hugo && sudo ./hugo'