其实两年前就心血来潮实现过,不过当时没有记录,以致于现在想再次实现又需要查阅资料。知识需要沉淀。
原先实现是通过Github Action + 宝塔面板Webhook 实现:
本地代码提交到 Github 后触发 Github Action,构建 Hugo,将构建代码推送到 pulic 分支。public 通过 webhook 与宝塔面板通信,宝塔面板收到通知后 git pull 拉取 public 分支的代码到网站的目录下。实现自动部署。
现在使用 1panel 并不支持 webhook,但能实现的方法还有很多。例如通过 Github Action SSH 服务器,在服务器中执行拉取代码执行或者文件传输指令;用 Github Action rsync 进行文件同步。直接在 Github Action 中就能完成,流程更加简单了。
这次用的是 rsync 进行实现:
具体实现方法:
Github Workflow 配置:
name: Nav Deploy Hugo
on:
push:
branches:
- main
jobs:
build-deploy:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.145.0'
extended: true
- name: Build
run: hugo --minify
- name: rsync deployments
uses: burnett01/rsync-deployments@7.0.2
with:
switches: -avzr --delete
path: public/
remote_path: ${{ secrets.DEPLOY_PATH }}
remote_host: ${{ secrets.DEPLOY_HOST }}
remote_port: ${{ secrets.DEPLOY_PORT }}
remote_user: ${{ secrets.DEPLOY_USER }}
remote_key: ${{ secrets.DEPLOY_KEY }}
测试运行结果
第一次同步很慢,7分多钟(总共不到50M文件)
第二次快了很多(仅修改了一个文件的内容)
但是两次都出现报错
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.4.0]
虽然报错,但网站功能正常,应该是不影响功能的错误。
找到错误位置:
rsync: [generator] failed to set times on "***.": Operation not permitted (1)
原因是SSH的用户没有权限去修改目标文件的时间戳,修改时间戳需要目标文件的所属用户和所属组都是操作用户才行。将我的操作目录chown修改后,不再报错。
完成!
其他部署选择
将文件部署到个人服务器上,除了rsync,还有其他选择,例如SCP 、git pull 以及 ftp 等。
不过使用SSH类的选择会触发服务器厂商的高危告警:美国异地登录。
Action
actions/checkout@v4
官方action,用于将代码检出到Action运行环境,待后续操作
ref
:指定要检出的分支、标签或提交哈希,默认为当前触发工作流的分支。submodules
:是否检出子模块,可选值为true
、recursive
或false
,默认为false
。fetch-depth
:指定要获取的提交历史的深度,设置为0
表示获取所有历史记录,默认为1
。
peaceiris/actions-hugo
安装hugo到Action运行环境
hugo-version
: 指定hugo版本extended
:使用hugo扩展版
burnett01/rsync-deployments
用于执行rync同步命令
remote_host
、remote_user
、remote_port
:目标主机地址、用户名、端口号remote_key
:SSH 私钥path
:源路径,默认为 GITHUB_WORKSPACE 并且相对于它switches
:指定rsync的执行选项
其他
新建 action 变量:
仓库Settings -> Secrets and variables -> Actions
新建 token(未用到):
账户Setttings -> Developer Settings -> Personal access token -> token(classic) -> select repo&workflow
参考
https://docs.github.com/zh/actions/writing-workflows/workflow-syntax-for-github-actions
https://github.com/peaceiris/actions-hugo?tab=readme-ov-file#%EF%B8%8F-create-your-workflow
https://zephyrbd.github.io/p/howtobuildablog/#github-action%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2
wl
05 / 07用上了!谢!
From Nginx Proxy Manager 登录出错 Bad gateway