Github Actions 是一个 Github 提供的自动化流程控制工具。打包、测试、登录远程服务器、发布第三方等等皆可操作。
Actions 语法
主要用的就几个,直接看下面例子基本能看懂。
uses
uses
的使用是最为关键的,它是各种操作(actions)的提供者,比如将项目通过SSH发送至远程服务器的easingthemes/ssh-deploy@v2.0.8
库,安装Node.js环境的actions/setup-node@v1.4.0
等等。
更多的第三方actions可以在GitHub Marketplace · Actions to improve your workflow · GitHub搜索。
服务器生成密钥
服务器需要生成一对密钥以供Github连接。
生成密钥
[root@host ~]$ ssh-keygen
安装公钥
[root@host ~]$ cd .ssh
[root@host .ssh]$ cat id_rsa.pub >> authorized_keys
权限设置
[root@host .ssh]$ chmod 600 authorized_keys
[root@host .ssh]$ chmod 700 ~/.ssh
开启密钥登录
vi /etc/ssh/sshd_config
确保设置有如下:
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes
重启SSH服务
[root@host .ssh]$ service sshd restart
复制私钥(包含BEGIN和END)并添加到 Github 的 Settings => secrets 处
[root@host .ssh]$ cat id_rsa
打包并部署至服务器
name: Deploy To Aliyun CI
# 在master分支push操作后触发该流程
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
# 一个让你的workflow能够访问到你仓库的actions
- name: Checkout
uses: actions/checkout@v2
# 指定环境 Node.js v12
- name: Use Node.js 12
uses: actions/setup-node@v1.4.0
with:
node-version: '12.x'
# 在GitHub服务器打包
- name: Build
run: |
yarn
yarn build
env:
CI: true
# 将打包结果拉至服务器
- name: Deploy to Server
uses: easingthemes/ssh-deploy@v2.0.8
env:
# settings => secrets 添加服务器私钥
SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_TOKEN }}
# 服务器地址,可以直接写,也可以在secrets创建(即私密不公开)
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
# 服务器ssh端口,默认22,改过端口才需要配置
REMOTE_PORT: ${{ secrets.REMOTE_PORT }}
# 登录账户
REMOTE_USER: ${{ secrets.REMOTE_USER }}
# 需要发送至远程服务器的文件 'build'为React打包产物
SOURCE: 'build/'
# 服务器存储位置
TARGET: '/www/Client'
# rsync参数,一般默认如下即可
ARGS: '-avzr --delete'
远程服务器拉取后再打包
之所以拉取到服务器再打包主要是因为在 Github 中打包每次下载node_modules
太费时间,并且首次打包过后node_modules
会有缓存,下次打包速度会加快。
以下是通过git pull
强制拉取覆盖本地,或者通过ssh-deploy
拉取master
当前commit
也行(需要配置rsync
不删除node_modules
文件夹,不然还是每次需要重新安装依赖)。
name: Deploy To Aliyun CI
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: SSH And Build
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
key: ${{ secrets.ALIYUN_TOKEN }}
port: ${{ secrets.REMOTE_PORT }}
# git fetch后再reset的操作是为了强制拉取(不考虑本地冲突直接覆盖)
script: |
cd /www/Client
git fetch --all
git reset --hard origin/master
yarn
yarn build