摘要: 在刚开始使用Hexo
的时候安装的脚本、插件、引用的样式和文章等都比较少,编译部署起来就还好,时间也不长,但是当哪些越来越多的时候,编译时间也越来越久,而且Gitee Pages
在仓库部署完毕后,还需要手动点击更新,才能完成页面的部署,不免就有些麻烦了,本文将介绍Github
自带的自动部署工具Github Actions
来实现静态网站的自动部署。
1.Github Actions
介绍 Github Actions
是GitHub
于 2018 年 10 月推出的一个CI/CD
服务。那什么是CI/CD
呢?CI/CD
其实说的是三件事情:
持续集成(Continuous Integration)
持续交付(Continuous Delivery)
持续部署(Continuous Deployment)
按照自己的理解,就是一个可以在Github
仓库中自动执行一些命令的工具,它的配置文件为yaml
格式。本文不是主要详细介绍它的语法,而是介绍如何使用这个工具来完成自动部署,所以这里就不写更多关于语法的啦(主要原因还是自己也不是特别了解😭),更多详细介绍可以查看官方介绍文档:Github Actions
2.Github Actions
使用
注意:若是直接复制以下代码,还请替换[UserName]
为自己的Github
或者Gitee
名字,另外就是那些环境变量一定要在自己站点源码的Secrets
中配置好。
2.1创建仓库 在一切的一切开始之前肯定是需要一个仓库啦😄,我这里存放源码的是创建的私人仓库,这里就不写如何创建仓库、建立远程连接和上传源码了。
2.2获取Token
Token
就是Personal access tokens
,即私人访问令牌,看自己的源码仓库是放在Github
还是其他平台了,我的是在Github
上,Gitee
作为镜像站,所以我只需要在Github
上进行操作,这里简单记录一下如何在这两个平台获取Token
的方式。
2.3在源码仓库创建环境变量 不想在文件中直接写私人令牌的话,可以在自己存放源码的仓库中添加环境变量:【Settings】→【Secrets】→【New repository secret】,在这里添加完之后,便可以在Github Actions
的配置文件中通过${{ secrets.[Environment secrets name] }}
来引用,更加的安全一些。
2.4创建Github Actions
的配置文件 在站点[blogRoot]
文件夹下也就是根目录下创建.github/workflows
工作流程文件夹,一共创建2个文件夹workflows
为.github
的子文件夹,然后再工作流程文件夹下创建自动部署配置文件autodeploy.yml
,名字任取,是yml
格式文件即可。
yaml [blogRoot]/.github/workflows/autodeploy.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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 name: 自动部署 on: push: branches: - master release: types: - published jobs: deploy: runs-on: ubuntu-latest steps: - name: 检查分支 uses: actions/checkout@v2 with: ref: master - name: 安装 Node uses: actions/setup-node@v1 with: node-version: "12.x" - name: 安装 Hexo run: | export TZ='Asia/Shanghai' npm install hexo-cli -g - name: 缓存 Hexo uses: actions/cache@v1 id: cache with: path: node_modules key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}} - name: 安装依赖 if: steps.cache.outputs.cache-hit != 'true' run: | npm install --save - name: 生成静态文件 run: | hexo clean hexo generate - name: 部署Github env: TIME_ZONE: Asia/Shanghai DEPLOY_REPO: [UserName ]/[UserName].github.io DEPLOY_BRANCH: master GITHUB_PERSONAL_TOKEN: ${{ secrets.GITHUBPERSONALTOKEN }} GITHUB_USER_NAME: ${{ secrets.GITHUBUSERNAME }} GITHUB_USER_EMAIL: ${{ secrets.GITHUBUSEREMAIL }} run: | cd ./public && git init git config user.name "$GITHUB_USER_NAME" git config user.email "$GITHUB_USER_EMAIL" git add . git commit -m "Automated Deployment By GitHub Actions @ $(date '+%Y-%m-%d %H:%M:%S') ${TIME_ZONE}" git push --force --quiet "https://$GITHUB_PERSONAL_TOKEN@github.com/$DEPLOY_REPO" master:$DEPLOY_BRANCH
2.5添加gulp
压缩功能 本地的时候有gulp
压缩代码功能,自然也是可以实现Github Actions
自动部署的时候进行静态压缩啦,在autodeploy.yml
配置文件的job
中部署Github
之前添加以下内容,若是有报错之类的,可以将安装gulp
相关内容移动到安装依赖
之前。
yaml [blogRoot]/.github/workflows/autodeploy.yml 1 2 3 4 5 6 7 - name: 安装gulp run: | npm install gulp - name: gulp压缩站点文件 run: | gulp
2.6同步自动部署Gitee Pages
有大神编写了插件以便于实现Gitee Pages
的自动部署,相关文章和相关的Github
项目在文章开头已经说过,可以参考,另外仓库的说明文档中也写了具体的使用方法。
第一步:添加个人私钥和Gtiee的登陆密码到站点私有仓库的环境变量中
个人私钥和公钥都在.ssh
文件夹内,私钥为~/.ssh/id_rsa
文件内,使用时将文件内所内容,包括-----BEGIN RSA PRIVATE KEY-----
和-----END RSA PRIVATE KEY-----
在内的全部内容都存放到变量值里。 Gitee
密码就是自己的登录密码。
在结尾添加以下内容:
yaml [blogRoot]/.github/workflows/autodeploy.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 - name: 同步到 Gitee uses: wearerequired/git-mirror-action@master env: SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }} with: source-repo: "git@github.com:[UserName]/[UserName].github.io.git" destination-repo: "git@gitee.com:[UserName]/[UserName].git" - name: 构建 Gitee Pages uses: yanglbme/gitee-pages-action@master with: gitee-username: [UserName ] gitee-password: ${{ secrets.GITEE_PASSWORD }} gitee-repo: [UserName ]/[UserName] branch: master
脚本的原理是用程序代替人工去点击Gitee Pages
的更新按钮。所以需要先手动做一次页面部署,确保有那个更新按钮在,脚本才有生效的前提。
Gitee
用Github Actions
自动部署更新收到短信,提示异地登录需要验证码。
因为Github Actions
使用的是美国的服务器,所以,使用 Github Actions
来远程更新Gitee
的站点部署时,会收到异地登陆的短信,提示需要验证码。这个在脚本作者的issues
里有相应的解决方案:登陆失败 #6 我是直接之前绑定过微信的,所以每次只有异地登陆提醒,还没有收过验证码,如果之前没有绑定过的话,在微信上搜索Gitee
微信公众号,可以在微信公众号内绑定自己的Gitee
账号,这样虽然还是会有异地登录提示,但是发过来的消息不再需要填写验证码。