之前github pages 一直都是用 travis-ci 部署的,除了慢一点没什么毛病,所以一直没有转向Github Actions的念头。
但是最近又重新买了个服务器,正好趁这个时间学一下 Actions,Actions对比travis有个很大的亮点就是他的生态很好,你要用什么插件搜一下直接就可以用了,减少很多工作。
access token
因为我们构建完需要Push到仓库,所以得有个 Github access token,可以直接点进链接申请,勾选repo的选项 ,然后点击生成Token,这时候先别关闭页面,后面要用到这个token。
secrets
进入要部署的项目的setting,左边有个导航进 secrets,在这里生成Actions需要用到的所有秘钥,只要你觉得有隐私的或者需要保密的全都在这里定义字段,然后配置文件直接使用就好。
我的Secrets总共有四个,如果只是部署到 github pages的话,你只需要token一个就够了
- token: 存放上一步生成的 access token
- SSH_PRIVATE: 存放SSH到服务器的私钥
- USERNAME: 要登录服务器的用户
- HOST: 要登录的服务器host
Action workflow
点击项目顶部导航进入 Actions,随便点一个模板进去,或者直接 set up workflow yourself新建一个新的
我的workflow基本就是搬 travis 的,按照github actions的格式改了下而已。
大概流程是: 拉取代码,初始化环境,生成静态资源,推送到目标仓库 或 部署到目标服务器
name: Blog deployer # 当前workflow的名字
# 触发的时机 当 master 分支有 push 的操作时执行
on:
push:
branches:
- master
jobs: # jobs一般都是并行执行
build:
name: Build and publish
runs-on: ubuntu-latest # 运行环境
steps:
# 使用 actions/checkout 这个插件 用于拉取当前仓库的master分支
- uses: actions/checkout@master
# 使用 actions/setup-node@v1 插件配置node环境
- name: Use Node.js 10.x
uses: actions/setup-node@v1
with:
node-version: 10.x
# 安装 hexo-cli 与项目所需的 node_modules
- name: Setup Hexo env
run: |
npm install hexo-cli -g
npm install
# 生成静态资源
- name: Generate public files
run: |
hexo clean
hexo g
# 部署到 Github Pages 这里没有用到 hexo的 Deploy
- name: Deploy To Github Pages
env:
GH_REF: github.com/jsonz1993/jsonz1993.github.io
run: |
# 配置本地git
git config --global user.name "Jsonz1993"
git config --global user.email "jsonz@qq.com"
# 生成 commit message 默认抓取最后一次提交信息
git log --pretty=format:"CI: %s" --date=short -n 1 > commit-message.log
git clone https://${GH_REF} .deploy_git
cd .deploy_git
git checkout master
cd ../
mv .deploy_git/.git/ ./public/
cd ./public/
git add .
git commit -F ../commit-message.log
git push --force --quiet "https://${{ secrets.token }}/@${GH_REF}" master:master
# 部署到自己的服务器
- name: Deploy to Private Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_PRIVATE }}
script: |
cd ${{ secrets.SERVER_PATH }} && git pull