利用GitHub备份和自动化部署hexo
概述
在部署好了hexo后,由于上传的静态页面与hexo源文件不同,源文件缺失的情况下,从GitHub上clone下来的网页文件无法重制hexo。
准备工作(常规部署hexo到public repo)
- 在GitHub官网建立一个名为Username.github.io的仓库
- 命令行激活仓库
1
2
3
4
5git init
touch README.md
git add README.md
git commit -m "first commit"
git push -u https://github.com/Username/Username.github.io.git main - 参考另一篇文章设置好hexo,打开目录内的_config.yml,找到deploy,参考如下填入
1
2
3
4deploy:
type: git
repo: https://Username:Password@github.com/Username/Username.github.io.git
branch: main - 测试一下是否能够成功部署
1
2
3hexo new helloworld
hexo g
hexo d备份源文件(hexo文件夹备份至另一个private repo)
- 在GitHub官网建立一个backup的私有仓库(本人使用了另外一个GitHub账号建立)
- 如上激活仓库
- 命令行上传所有hexo文件夹的源文件,因为是pravite库,所以_config.yml中的账号密码不会暴露
1
2
3git add 你的hexo文件夹路径下的所有文件
git commit -m #上传源文件
git push https://github.com/Username/backup.git main - 到此已经做到了hexo d可部署,git push可备份。不是强迫症的已经可以安心使用了。不过就是还有一些小麻烦,每次写完都要git add来备份。所以我打算使用GitHub action,只进行 (git) add commit push的操作,在push到私有库后,云服务器自动安装node.js hexo环境并自动执行clone ,hexo g,hexo d等命令来实现自动化部署
折腾
开始我尝试了public库来备份,好处是blank.yml内的自动执行git clone不会报错,但问题在于隐私泄漏非常严重,GitHub的账号和密码都被暴露在外。我大部分时间也浪费在了修复这个问题上。但是都没有直接使用private库来的简单粗暴。唯一一个git clone无权限的问题也很好解决。
编辑.github/workflows/blank.yml
- 首先点击action-New workflow-Set up this workflow-Start commit-Commit new file,直接在默认分支里编辑。
- 我是两个账户两个仓库,我还得在backup私有库的 repo Settings 里 Manage Access 栏邀请 另一个账户来允许下载备份,因为我在私有库的blank.yml里填的是公有库的账户来git clone,至于为什么不直接用私有库的账号密码来clone,是因为其中一个账户的密码末尾的@导致push时链接无效。
- 修改blank.yml,参考用,不能复制粘贴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22on:
push:
branches: [ master ]
#只需要在push时触发这个action
build:
runs-on: macos-latest
#运行环境为macOS
steps:
- name: install node.js
uses: actions/setup-node@v1
#安装Node.js环境
- name: Run a multi-line script
run: |
npm install hexo-cli -g #安装hexo全局框架
git clone https://Username:Password@github.com/Username/backup.git #获取刚刚上传的源文件
cd backup/blog #到达hexo文件夹
npm install #安装Node.js
hexo generate #生成静态文件
hexo deploy #完成上传
2021-1-18更新
- 在clone到新电脑后,hexo service等命令可能会遇到如下报错这是因为本地没有该hexo文件夹记录,解决办法就是在hexo文件夹中再次安装node.js
1
2
3ERROR Cannot find module 'hexo' from '/Users/cb/Desktop/github/cblog/blog'
ERROR Local hexo loading failed in ~/Desktop/github/cblog/blog
ERROR Try running: 'rm -rf node_modules && npm install --force'完成重新安装后,hexo s命令成功运行。hexo d和hexo g待测试。1
2cd 你的hexo博客文件夹
npm install - hexo d和hexo g均可正常生成静态文件并上传。接下来测试是否能成功运行push到backup仓库后的aciton。
- 在本地运行hexo d上传过页面后,仍然支持git push备份以及最主要的backup仓库运行action自动部署网页。
总结
只需要执行npm install重新安装Node.js , 就可以实现git push后的GitHub Aciton的备份并部署和hexo d常规部署方式
2021-1-24更新
- 由于hexo d是强制上传,若push前没有进行pull补全文章,可能会导致博客内容丢失。
2021-2-6更新
- 从默认主题转换为Butterfly主题,但是在_config.yml中更改theme名后,hexo s本地启动失败,报错一串英文,百度后npm安装如下插件可解决该问题。在另一台电脑上需要重新执行该命令,将backup下载到本地后也会出现一样的hexo s启动失败的报错。
1
npm install --save hexo-renderer-jade hexo-generator-feed hexo-generator-sitemap hexo-browsersync hexo-generator-archive
- 在Butterfly主题的博客页面中,上一篇,下一篇的默认背景图片在theme的_config.yml中没有找到对应的修改处,所以只能打开Safari开发者工具,而后发现其图片路径名所在的.js文件位于/Butterfly/scripts/filters/random_cover.js这里,删掉其获取默认背景图片的http路径即可,然后发现默认背景图片变成了/Butterfly/source/img/404.jpg这张,将纯色替换这张图片,博客看起来就清爽多了。。。
- hexo如何安装Butterfly主题
2021-2-23更新
- 安装从DNSPOD白嫖的证书
- 编辑nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html.git/;
index index.html index.htm;
}
} - 下载.key和.crt证书文件,通过百度的在线转换器合成.pem文件,将.key和.pem放入nginx/conf文件夹
- 实现自动化部署到云服务器
- 服务器搭建git仓库
1
2
3
4
5
6cd /usr/local/nginx #进入nginx目录(该教程默认为/usr/local/nginx)
git clone --bare https://github.com/xxxx/xxxx.github.io.git html.git #从github.io复制一个可供Hexo上传的仓库,命名为html.git。
echo "git --work-tree=/usr/local/nginx/html.git --git-dir=/usr/local/nginx/html.git checkout -f" > ./html.git/hooks/post-receive #就是把push到仓库的文件(还在objects中的源代码)转储至html.git内...,
#(仅输入git checkout的命令还有恢复工作树文件的效果)
chmod +x ./html.git/hooks/post-receive #给hooks下的文件添加执行权限 - 因为git要求仓库名后缀为.git,所以只能在nginx/conf/nginx.conf中修改root文件夹为html.git
- 修改/blog/_config.yml,添加push给服务器的git仓库
1
2
3
4
5
6
7
8deploy:
- type: git
repo: https://cb9919:cb19990614@github.com/cb9919/cb9919.github.io.git
branch: main
- type: git
repo: root@你的服务器IP:/usr/local/nginx/html.git
branch: main - 首先在本地macOS电脑中使用ssh-keygen生成一对密钥公钥,并删除~/.ssh/known_hosts,然后打开终端 “ssh 你的服务器ip地址”,会询问是否记录主机 输入yes,会生成一个known_hosts,把密钥和known_hosts文件上传到hexo源代码文件夹根目录下,将.pub后缀的公钥内容写入(重定向)到服务器中的~/.ssh/authorized_keys,再ssh链接测试一下能否不用输入密码,若不用输入密码即算成功。可进行接下来的操作。但是注意接下来只适用于GitHub action选择了macOS环境的情况。
修改/.github/workflow/blank.yml1
2
3
4
5
6
7
8
9
10
11
12
13- name: Run a multi-line script
run: |
npm install hexo-cli -g # 安装环境
git clone https://xxxxx:xxxxx@github.com/xxxxx/xxxxx.git # 克隆hexo源文件夹
cp cblog/id_rsa ~/.ssh/ # 替换密钥
chmod 700 ~/.ssh/id_rsa # 使权限正确
cp cblog/id_rsa.pub ~/.ssh/
rm ~/.ssh/known_hosts #删除以覆盖
cp cblog/known_hosts ~/.ssh/ #添加主机记录,不然还需要输入yes才能继续
cd cblog/blog
npm install
hexo generate
hexo deploy
2021-5-2更新
- 添加备案号
在blog/themes/Butterfly/layout/includes/footer.pug的theme.footer.copyright下添加1
2
3
4<br />
<a href="http://beian.miit.gov.cn/" style="color:black" target="_blank">浙ICP备xxxxxxxxxx号</a>
<br />
<a href="https://beian.miit.gov.cn" style="color:black" target="_blank">信息产业部备案管理系统</a> - _config.yml中deploy栏下git type的部署方式更换ssh默认的22为2021原:服务器如果默认ssh22端口会有很多登陆请求
1
2
3- type: git
repo: ssh://hostname@xxx.xx.xxx.xxx:2021/usr/local/nginx/html.git
branch: main1
2
3- type: git
repo: hostname@xxx.xx.xxx.xxx:/usr/local/nginx/html.git
branch: main
2021-8-22更新
- github关闭了push的账号密码验证方式
所以换用密钥,将id_rsa.pub填入GitHub的setting - 修改hexo的config
1
2
3
4deploy:
- type: git
repo: ssh://git@github.com:22/cb9919/cb9919.github.io.git
branch: main
2021-12-15更新
- 添加了一台新服务器,但是用之前的known_hosts无法通过验证,需要将连接过这台新服务器的Mac电脑中的known_hosts覆盖原文件
同时也需要将id_rsa.pub的后缀改为新服务器的名称<–不需要,请看2022-5-8更新
2022-1-14更新
2022-5-8更新
若ci一直报错hostkey验证错误,编辑/etc/ssh/sshd_config,将StrictModes改为no
1 | StrictModes no |
2023-6-29更新
补充部署到自己的云服务器的方法(实测有效)
- 以上的方法是将本地(GitHub CI)的公钥.pub写入服务器的authoried_key。
- 现在详述一下优化后的过程: 先在云服务器里运行以下代码(这将部署端的.pub记录到部署端的authorized_keys),然后将云服务器(部署端)的id_rsa密钥下载到本地(GitHub CI)里运行,简单来说就是只用了一对云服务器自己的密钥公钥。
1
2cat ~/.ssh/id_rsa.pub | ssh user@server 'cat >> ~/.ssh/authorized_keys'
ssh user@server #测试一下是否能直接不输密码连接自己 - 仍需要一份known_hosts来过第一次连接时的提示。。。
- 注意echo “git –work-tree=/usr/local/nginx/html.git –git-dir=/usr/local/nginx/html.git checkout -f” > ./html.git/hooks/post-receive时,路径名都要跟着改
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 不知名小驿站!