利用Github自动化部署代码

2,568 阅读1分钟

Github Actions 是一个 Github 提供的自动化流程控制工具。打包、测试、登录远程服务器、发布第三方等等皆可操作。

GitHub Actions Documentation

Actions 语法

GitHub 操作的上下文和表达语法

主要用的就几个,直接看下面例子基本能看懂。

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