介绍
我们可以使用Github Actions很方便的实现CI/CD
工作流,我们可以实现一系列自动化的操作。在GitHub Actions中,当我们运行jobs时会触发workflow文件中定义的 action 。当一个workflow被触发后,GitHub Actions会创建一个新的虚拟环境来运行workflow文件中定义的Action。这个虚拟环境可以是预设的操作系统和软件环境,也可以是自定义的Docker镜像。
在执行Action的过程中,GitHub Actions会按照workflow文件中定义的步骤依次执行不同的操作,如下载代码仓库、安装依赖包、编译打包等。最终,Action的执行结果将被输出到日志中,用户可以通过查看日志来了解Action的详细执行情况。如果Action执行成功,workflow将继续执行下一步或结束;如果Action执行失败,workflow将停止执行并输出错误信息。
本文将介绍使用Github Actions实现自动部署hexo到Github Pages。接下来会简要说明一下原始的博客部署方案以及存在的问题,并且使用GitHub Actions是如何解决这些问题的。
原本方案:在自己的笔记本上安装hexo
环境,先将需要发布的博客md
文件放到_post
目录中,然后在目录下使用Git bash here
执行如下指令,
1 | # 本地4000端口预览: |
但是这种情况下只能在单机上进行博文的撰写,在其他的设备上发文则需要另外配置相同的hexo
环境,并进行文件的同步。此外,我们还可能遇到本地的Node.js
版本和Hexo
不兼容的问题,若是使用Github Actions进行部署,文章都是通过同一个容器的环境进行渲染,不会出现上述的问题。
自动化部署
本文假设你已经拥有了自己的hexo
博客,此处只介绍自动化部署的设置,博客搭建的教程请详见其他教程。
创建代码仓库
新建一个blog
仓库用来存放Hexo
项目的源码,仓库的类型为private
。
勾选Add a README file
完成repository
的初始化
生成部署秘钥
本地桌面已安装Git
,在新建文件夹中右击Git Bash here
生成秘钥:
1 | # 生成秘钥 |
一直回车直到成功并结束。
当前目录下会有两个文件,私钥文件 github-deploy-key
和 公钥文件github-deploy-key.pub
。
配置部署秘钥
复制 github-deploy-key
文件内容,在 blog
仓库 Settings -> Secrets -> Add a new secret
页面上添加。
- 在
Name
输入框填写HEXO_DEPLOY_PRI
。 - 在
Value
输入框填写github-deploy-key
文件内容。
复制 github-deploy-key.pub
文件内容,在 your.github.io
仓库 Settings -> Deploy keys -> Add deploy key
页面上添加。
- 在
Title
输入框填写HEXO_DEPLOY_PUB
。 - 在
Key
输入框填写github-deploy-key.pub
文件内容。 - 勾选
Allow write access
选项。
同步代码
进入原来Hexo
目录下,将目录下的文件提交到blog
仓库。
1 | # 把文件添加到版本库中 |
如果要同步到本地,可以执行下面的命令进行拉取
1 | # 同步下拉代码 |
使用Git进行提交时可能会出现这样的错误:
出现此种错误的原因是,在当前的git的项目中,存在其中的子文件夹隶属于别的git项目地址,即存在git文件夹。
解决方法就是,即删除子文件夹中的git目录即可。如果仍然想要保留子文件夹原git的地址,可以将原来的git文件夹中config拷贝出来保留下来,里面有git原地址相关信息。
编写GitHub Actions代码
在 blog
仓库根目录下创建 .github/workflows/deploy.yml
文件,目录结构如下。
1 | blog (repository) |
deploy.yml
的内容如下:
主要修改的位置是
env
和dependencies
;依赖安装指定版本与本地一致本地查看
hexo
插件命令:Npm ls -dept 0
1 | # Action 的名字 |
模版参数说明
- name 为此 Action 的名字
- on 触发条件,当满足条件时会触发此任务,这里的
on.push.branches.$.master
是指当master
分支收到push
后执行任务。 - env为环境变量对象
- env.GIT_USER 为 Hexo 编译后使用此 git 用户部署到仓库。
- env.GIT_EMAIL 为 Hexo 编译后使用此 git 邮箱部署到仓库。
- env.THEME_REPO 为您的 Hexo 所使用的主题的仓库,这里为
sanonz/hexo-theme-concise
。 - env.THEME_BRANCH 为您的 Hexo 所使用的主题仓库的版本,可以是:branch、tag 或者 SHA。
- env.DEPLOY_REPO 为 Hexo 编译后要部署的仓库,例如:
sanonz/sanonz.github.io
。 - env.DEPLOY_BRANCH 为 Hexo 编译后要部署到的分支,例如:master。
- jobs为此 Action 下的任务列表
- jobs.{job}.name 任务名称
- jobs.{job}.runs-on 任务所需容器,可选值:
ubuntu-latest
、windows-latest
、macos-latest
。 - jobs.{job}.strategy 策略下可以写
array
格式,此 job 会遍历此数组执行。 - jobs.{job}.steps一个步骤数组,可以把所要干的事分步骤放到这里。
- jobs.{job}.steps.$.name 步骤名,编译时会会以 LOG 形式输出。
- jobs.{job}.steps.$.uses 所要调用的 Action,可以到 https://github.com/actions 查看更多。
- jobs.{job}.steps.$.with 一个对象,调用 Action 传的参数,具体可以查看所使用 Action 的说明。
第三方 Actions
使用第三方 Actions 语法 {owner}/{repo}@{ref}
或者 {owner}/{repo}/{path}@{ref}
例如:
1 | jobs: |
一、调用 actions/checkout@v2
可以实现 Checkout 一个 git 仓库到容器。
例如 Checkout 当前仓库到本地,with.repo
不填写默认为当前仓库。
1 | jobs: |
例如 Checkout 第三方仓库 git@github.com:sanonz/hexo-theme-concise.git
的 master
分支到容器 themes/concise
目录。
1 | jobs: |
二、调用 actions/setup-node@v1
可以配置容器 Node.js 环境。
例如安装 Node.js 版本 v12 到容器中,with.node-version
可以指定 Node.js 版本。
1 | jobs: |
可以在这里查找更多 Actions 以及使用方式 官方 Actions 市场。
触发部署
只要将 md
文件通过 Add file
–> Upload files
上传到仓库,就会自动触发自动部署。发文地址地址指向了 blog
仓库中的 _post
目录。
目前的发布时间都在 3
分钟以内。
参考文档
利用 Github Actions 自动部署 Hexo 博客 | Sanonz
地址:https://sanonz.github.io/2020/deploy-a-hexo-blog-from-github-actions/用GitHub Actions自动部署Hexo | 老苏的blog
地址:https://laosu.ml/2022/01/24/用GitHub Actions自动部署Hexo/?highlight=github#创建代码仓库