hugo利用Github Actions自动构建博客
初始化 GitHub 仓库
Github上新建一个名为iwyang.github.io
的仓库。
配置ACTIONS_DEPLOY_KEY
生成公钥
Windows 上安装 Git for Windows 之后在开始菜单里打开 Git Bash 输入:
1 | git config --global user.name "你的用户名" |
1 | cd ~ |
在系统当前用户文件夹下生成了私钥 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 | sudo systemctl start vsftpd |
配置vsftpd
1 | vi /etc/vsftpd/vsftpd.conf |
在userlist_enable=YES
下面,加上:
1 | userlist_file=/etc/vsftpd/user_list |
创建FTP用户
- 创建一个新用户,名为git:
1 | sudo adduser git |
- 将用户添加到允许的FTP用户列表中:
1 | echo "git" | sudo tee -a /etc/vsftpd/user_list |
- 设置正确的权限
为了使ftp用户可以上传网站文件到相应目录:
1 | sudo chmod 755 /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 | name: GitHub Page Deploy |
添加缓存:
1 | name: GitHub Page Deploy |
第三方:
1 | name: GitHub Page |
提交源码
初始化git,新建并切换到develop
分支,将源码提交到develop
分支。稍等片刻,github action会自动部署blog到master
分支。
1 | git init |
最终部署脚本
1 |
|
本地操作
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 | rm -rf /var/www/hexo |
出现问题
执行上一步可能会出现问题: Permission denied (publickey). Could not read from remote repository
。
解决方法:
服务器生成ssh key
1 | yum install rsync -y |
一路回车即可,会生成你的ssh key。然后再终端下执行命令:
1 | ssh -v git@github.com |
这时会报错,最后两句是:
1 | No more authentication methods to try. |
在终端再执行以下命令:
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 | crontab -e |
这样只要提交源码给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