我的站点:Subranium的小站
我的Github:Github
之前我们已经介绍过了,我们的hugo博客是部署在阿里云服务器上,并通过nginx服务器进行对外代理,现在使用Github Action实现将代码push到Github后自动构建并推送到云服务器,实现自动部署的功能
Github Actions
基础内容可以参考阮一峰老师的:GitHub Actions 入门教程
在这里主要推荐一下Github Actions的Marketplace,在这里你可以快速的找到你需要的操作,例如你想要查找关于ssh,Github Action是怎么操作的,可以直接搜索

我们这里主要介绍一下当前博客部署的工作
自动部署部分
在介绍之前先介绍一下我的服务器结构,访问站点后nginx代理到/root/public目录,所以我们要实现的功能如下:
- 代码push到github触发Github Actions流程
- 通过Github Actions先删除云服务器上已经存在的public文件夹
- 将最新版本的hugo博客生成的public文件夹推送到云服务器
push代码触发流程
首先我们点击Actions,首次接触可以选择simple workflow。

首先我们要做一些准备工作,例如构建环境,hugo生成public文件。
# 获得源码
- name: Checkout
uses: actions/checkout@master
with:
submodules: true
fetch-depth: 1
# 构建hugo站点
- name: Build site
uses: jakejarvis/hugo-build-action@master
with:
args: --minify
# 生成public文件夹-可选?
- name: artifact
uses: actions/upload-artifact@master
with:
name: public
path: './public'
Github Actions删除云服务器文件夹
我们这里使用ssh登陆到远端服务器,然后执行一个我们编辑好的shell脚本 shell脚本del.sh如下
if [ ! -d "/root/public/" ];then
echo "文件夹不存在"
else
rm -rf /root/public
fi
然后通过ssh-action登陆到运城服务器执行script里的命令
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.ALIYUN_HOST }}
username: ${{ secrets.ALIYUN_USER }}
password: ${{ secrets.ALIYUN_PASSWORD }}
script: bash /root/del.sh
注意:为了保护隐私需要将你的敏感数据保存到sercet里,然后通过${{}}形式读取 配置方式如下

Github Action推送public文件夹到云服务器
- name: copy file via ssh password
uses: appleboy/scp-action@master
with:
host: ${{ secrets.ALIYUN_HOST }}
username: ${{ secrets.ALIYUN_USER }}
password: ${{ secrets.ALIYUN_PASSWORD }}
source: "./public"
target: "/root"
在这里我们使用scp命令将public文件夹推送到云服务器上。
完整yml文件
name: CI
# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build-and-deploy:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- name: Checkout
uses: actions/checkout@master
with:
submodules: true
fetch-depth: 1
- name: Build site
uses: jakejarvis/hugo-build-action@master
with:
args: --minify
- name: artifact
uses: actions/upload-artifact@master
with:
name: public
path: './public'
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.ALIYUN_HOST }}
username: ${{ secrets.ALIYUN_USER }}
password: ${{ secrets.ALIYUN_PASSWORD }}
script: bash /root/del.sh
- name: copy file via ssh password
uses: appleboy/scp-action@master
with:
host: ${{ secrets.ALIYUN_HOST }}
username: ${{ secrets.ALIYUN_USER }}
password: ${{ secrets.ALIYUN_PASSWORD }}
source: "./public"
target: "/root"