初始化 GitHub 仓库

Github上新建一个名为iwyang.github.io的仓库。

配置ACTIONS_DEPLOY_KEY

生成公钥

Windows 上安装 Git for Windows 之后在开始菜单里打开 Git Bash 输入:

1
2
git config --global user.name "你的用户名"
git config --global user.email "你的电子邮箱"
1
2
3
4
cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa

在系统当前用户文件夹下生成了私钥 id_rsa 和公钥 id_rsa.pub

上传id_rsa.pub

点击博客仓库的Settings->Deploy keys->add deploy key,Title填写ACTIONS_DEPLOY_KEY,Key填写id_rsa.pub文件的内容。

上传id_rsa

点击博客仓库的Settings->Secrets->Add a new secret,Name填写ACTIONS_DEPLOY_KEY,Value填写id_rsa文件的内容。

利用FTP-Deploy-Action上传文件

这里在Github actions里利用FTP-Deploy-Action上传文件到服务器。项目地址:SamKirkland/FTP-Deploy-Action

首先是搭建ftp服务器。

安装vsftpd

1
sudo yum install vsftpd -y

安装软件包后,启动vsftpd,并使其能够在引导时自动启动:

1
2
sudo systemctl start vsftpd
sudo systemctl enable vsftpd

配置vsftpd

1
vi /etc/vsftpd/vsftpd.conf

userlist_enable=YES下面,加上:

1
2
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO

创建FTP用户

  • 创建一个新用户,名为git:
1
2
sudo adduser git
sudo passwd git
  • 将用户添加到允许的FTP用户列表中:
1
echo "git" | sudo tee -a /etc/vsftpd/user_list
  • 设置正确的权限

为了使ftp用户可以上传网站文件到相应目录:

1
2
sudo chmod 755 /var/www/hexo
sudo chown -R git: /var/www/hexo
  • 重启vsftpd服务。

保存文件并重新启动vsftpd服务,以使更改生效:

1
sudo systemctl restart vsftpd

配置FTP_MIRROR_PASSWORD

点击博客仓库的Settings->Secrets->Add a new secret,Name填写FTP_MIRROR_PASSWORD,Value填写用户密码。

配置 Github actions

在博客根目录新建.github/workflows/gh_pages.yml文件。代码(不添加缓存)如下:最好使用下面添加了缓存的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
name: GitHub Page Deploy

on:
push:
branches:
- develop
jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout master
uses: actions/checkout@v2.3.4
with:
submodules: true # Fetch Hugo themes (true OR recursive)
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2.5.0
with:
hugo-version: 'latest'
extended: true

- name: Build Hugo
run: hugo --minify

- name: Deploy Hugo to gh-pages
uses: peaceiris/actions-gh-pages@v3.8.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
PUBLISH_BRANCH: master
PUBLISH_DIR: ./public
# cname:

- name: Deploy Hugo to Server
uses: SamKirkland/FTP-Deploy-Action@4.1.0
with:
server: 104.224.191.88
username: git
password: ${{ secrets.FTP_MIRROR_PASSWORD }}
local-dir: ./public/
server-dir: /var/www/hexo/

添加缓存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
name: GitHub Page Deploy

on:
push:
branches:
- develop
jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout master
uses: actions/checkout@v2.3.4
with:
submodules: true # Fetch Hugo themes (true OR recursive)
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2.5.0
with:
hugo-version: 'latest'
extended: true

- name: Cache resources # 缓存 resource 文件加快生成速度
uses: actions/cache@v2
with:
path: resources
# 检查照片文件变化
key: ${{ runner.os }}-hugocache-${{ hashFiles('content/**/*') }}
restore-keys: ${{ runner.os }}-hugocache-

- name: Build Hugo
run: hugo --minify --gc

- name: Deploy Hugo to gh-pages
uses: peaceiris/actions-gh-pages@v3.8.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
PUBLISH_BRANCH: master
PUBLISH_DIR: ./public
# cname:

- name: Deploy Hugo to Server
uses: SamKirkland/FTP-Deploy-Action@4.1.0
with:
server: 104.224.191.88
username: git
password: ${{ secrets.FTP_MIRROR_PASSWORD }}
local-dir: ./public/
server-dir: /var/www/hexo/

第三方:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
name: GitHub Page

on:
push:
branches:
- master # master 更新触发

jobs:
deploy:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
submodules: true # clone submodules
fetch-depth: 0 # 克隆所有历史信息

- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: "0.87.0" # Hugo 版本
extended: true # hugo插件版 Stack主题 必须启用

- name: Cache resources # 缓存 resource 文件加快生成速度
uses: actions/cache@v2
with:
path: resources
# 检查照片文件变化
key: ${{ runner.os }}-hugocache-${{ hashFiles('content/**/*') }}
restore-keys: ${{ runner.os }}-hugocache-

- name: Build # 生成网页 删除无用 resource 文件 削减空行
run: hugo --minify --gc

- name: Deploy # 部署到 GitHub Page
uses: peaceiris/actions-gh-pages@v3
with:
# 如果在同一个仓库下使用请使用 github_token 并注释 deploy_key
# github_token: ${{ secrets.GITHUB_TOKEN }}
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}

# 如果在同一个仓库请注释
external_repository: # 你的 GitHub page 仓库 example/example.github.io

publish_dir: ./public
user_name: "github-actions[bot]"
user_email: "github-actions[bot]@users.noreply.github.com"
full_commit_message: Deploy from ${{ github.repository }}@${{ github.sha }} 🚀

提交源码

初始化git,新建并切换到develop分支,将源码提交到develop分支。稍等片刻,github action会自动部署blog到master分支。

1
2
3
4
5
6
git init
git checkout -b develop
git remote add origin git@github.com:iwyang/iwyang.github.io.git
git add .
git commit -m "备份源码"
git push --force origin develop

最终部署脚本

1
2
3
4
5
6
7
8
9
#!/bin/bash

echo -e "\033[0;32mDeploying updates to gitee...\033[0m"

# backup
git config --global core.autocrlf false
git add .
git commit -m "site backup"
git push origin develop --force

本地操作

1
git clone -b develop git@github.com:iwyang/iwyang.github.io.git blog --recursive

因为使用Submodule管理主题,所以最后要加上 --recursive,因为使用 git clone 命令默认不会拉取项目中的子模块,你会发现主题文件是空的。(另外一种方法:git submodule init && git submodule update

同步更新源文件

1
git pull

同步主题文件

1
git submodule update --remote

运行此命令后, Git 将会自动进入子模块然后抓取并更新,更新后重新提交一遍,子模块新的跟踪信息便也会记录到仓库中。这样就保证仓库主题是最新的。

服务器通过git拉取更新

2021.8.15 已经不用此方法,现在直接在Github actions利用FTP-Deploy-Action上传文件到服务器。

克隆仓库

1
2
rm -rf /var/www/hexo
git clone git@github.com:iwyang/iwyang.github.io.git /var/www/hexo

出现问题

执行上一步可能会出现问题: Permission denied (publickey). Could not read from remote repository

解决方法:

服务器生成ssh key

1
2
yum install rsync -y
ssh-keygen -t rsa -C "455343442@qq.com"

一路回车即可,会生成你的ssh key。然后再终端下执行命令:

1
ssh -v git@github.com

这时会报错,最后两句是:

1
2
No more authentication methods to try.  
  Permission denied (publickey).

在终端再执行以下命令:

1
ssh-agent -s 

接着在执行:

1
ssh-add ~/.ssh/id_rsa

出现问题:Could not open a connection to your authentication agent.

解决方法:使用:ssh-agent bash 命令,然后再次使用ssh-add ~/.ssh/id_rsa_name这个命令就没问题了。(注意:Identity added: …这是ssh key文件路径的信息,如/.ssh/id_rsa)

配置github

打开你刚刚生成的id_rsa.pub,将里面的内容复制,进入你的github账号,在settings下,SSH and GPG keys下new SSH key,然后将id_rsa.pub里的内容复制到Key中,完成后Add SSH Key。

验证Key

1
ssh -T git@github.com 

设置crontab定时任务:

1
2
crontab -e
*/5 * * * * git -C /var/www/hexo pull

这样只要提交源码给github,github action就会帮你部署博客到github page,服务器通过git pull定时拉取更新。换台电脑不用再搭建环境,直接在gtihub新建或者修改文章,剩下的工作就交给github action。注意回本地电脑先git pull拉取更新,再提交源码。

注意:好像先要从源码仓库clone一份源码到本地,才能利用git pull拉取github已有的更新。只有先拉取github已有的更新,再在本地提交源码,github上的更新才不会被删除

附:使用Git Submodule管理Hugo主题

  • 如果克隆库的时候要初始化子模块,请加上 --recursive 参数,如:
1
git clone -b develop git@github.com:iwyang/iwyang.github.io.git blog --recursive
  • 如果已经克隆了主库但没初始化子模块,则用:
1
git submodule update --init --recursive
  • 如果已经克隆并初始化子模块,而需要从子模块的源更新这个子模块,则:
1
git submodule update --recursive --remote

更新之后主库的 git 差异中会显示新的 SHA 码,把这个差异选中提交即可。


  • 其他命令:在主仓库更新所有子模块:git submodule foreach git pull origin master

参考链接