GitHub Actions
引言
GitHub Actions是github推出的持续集成服务,它比 Travis CI更加强大方便;在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。您可以发现、创建和共享操作以执行您喜欢的任何作业(包括 CI/CD,并将操作合并到完全自定义的工作流程中。本文将通过一个hexo博客自动发布的例子来了解GitHub Actions。
GitHub Actions 基础入门
众所周知,自动化集成包括很多动作,如代码拉取,环境安装,数据库安装配置,打包,代码测试等等,这些操作就被定义为action。很多操作在不同项目中都是一样的,比如从github拉取代码,node环境安装等等,所以这些操作是可以共享的,这一点GitHub Actions设计者也想到了,所以我们是可以将一些公共的操作单独写发布在github仓库中供别人使用的。github官方也提供了一个action市场,在我们写我们自己的集成流程时,可以通过userName/repoName引用他人写好的actions来简化我们的action编写。
名词解释
- workflow(工作流程):一次集成的过程称为一个工作流程。
- jos(任务):一个workflow由多个job组成。
- step(步骤):一个job包含多个步骤。
- action(动作):每个 step 可以依次执行一个或多个命令(action)。
配置文件介绍
GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的
.github/workflows
目录,是一个 YAML 格式文件,一个workflow 文件由以上四个部分组成。
# name:工作流名称,不填 GitHub 将其设置为相对于仓库根目录的工作流程文件路径
name: hexo-ci
# on:触发流程的事件;必填
## 写法1:使用单一事件
on:push
## 写法2:使用事件列表
on: [push, pull_request]
## 写法3:使用具有活动类型或配置的多个事件
on
push:
branches: [master]
# jobs:任务
jobs:
# job id
job1:
......
job2:
# job id
name: bulid-name
# 识别在此作业运行之前必须成功完成的任何作业
needs:[job1]
# 必填。 要运行作业的机器类型
runs-on: ubuntu-latest
# 步骤
steps:
# 引用他人的actions
- uses: actions/checkout@v2
# 步骤名称
- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1
# 有些引用的action需要外部提供的一些参数;通过with传递
with:
version: ${{ matrix.node_version }}
- name: Setup hexo
# step环境变量
env:
ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_PRI }}
# 执行一些具体的命令(action)
run: |
mkdir -p ~/.ssh/
echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.email "youremail@.com"
git config --global user.name "your name"
npm install hexo-cli -g
npm install
- name: Hexo deploy
run: |
hexo clean
hexo d
上面只是列举了一些常用的字段,GitHub Action 的配置字段非常多,可以通过官方中文文档查阅
下面是一个自动部署hexo的例子
案例基本需求
有两个仓库git仓库A、B,A存放的是hexo博客的资源文件,即markdown文件,B仓库则是 github page 仓库,存放的是hexo编译之后的文件;通常情况下我们每次写完博客需要进行编译,然后把编译好的文件push到B仓库,同时把资源文件push到A仓库。这样显得比较繁琐,现在我们利用GitHub Actions实现在每次push资源文件到A仓库时,github自动编译资源文件,并且将编译好的文件发布到B仓库。
创建两个仓库
- blog:存放资源文件
- caiwuu.github.io:github page 静态文件仓库
生成公钥私钥
cd blog
ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f github-deploy-key -N ""
此时在当前目录下会生成两个文件github-deploy-key(私钥)和github-deploy-key.pub(公钥)
给caiwuu.github.io仓库添加公钥
给blog仓库添加secrets'变量HEXO_DEPLOY_PUB
这个变量存的就是私钥,这个变量在Github Action 中可以通过变量名获取
创建action脚本文件
GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的
.github/workflows
目录,是一个以yml为后缀的文件
name: CI
on
push:
branches: [master]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1
with:
version: ${{ matrix.node_version }}
- name: Setup hexo
env:
ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_PRI }}
run: |
mkdir -p ~/.ssh/
echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.email "youremail@.com"
git config --global user.name "your name"
npm install hexo-cli -g
npm install
- name: Hexo deploy
run: |
hexo clean
hexo d
Hexo deploy 配置
deploy:
type: 'git'
repository: git@github.com:caiwuu/caiwuu.github.io.git # 这里一定要用ssh地址
branch: master
验证
尝试修改一点博客的内容,然后提交,查看CI集成是否成功
action执行成功后可以看到编译的静态文件已经成功部署到了github page仓库,代开github page地址博客已经更新