Github Action实践

本篇记录利用github action实现自动化构建和部署的过程。

本站除了部署在github page上,还部署在本人的服务器上,懒惰的ddl直到现在才去上手实验,因此利用在github action中实现两种部署方式。

Github Action是Github提供的持续集成服务,可以在代码仓库中配置workflow,实现自动化构建、测试、部署等功能。

有一些术语需要了解:

  • Workflow:一个workflow由一个或多个job组成,可以在不同的操作系统环境中运行。
  • Job:一个job由一系列step组成,可以在同一个runner上运行。
  • Step:一个step由一个或多个action组成,可以在同一个runner上运行。
  • Action:一个action是一个独立的任务,可以在不同的runner上运行。

这里我使用的是github action自带的SSH Deploy action,使用ssh链接远程服务器,将代码部署到服务器上。使用方法可以参考这里

首先需要在服务器上生成一个SSH Key,用于github action登录服务器。

1
ssh-keygen -m PEM -t rsa -b 4096

key的生成过程中会提示输入密码,可以不输入,直接回车,默认保存在/root/.ssh目录下(这个可能不同的服务器环境会有区别,具体的默认位置在生成ssh-key的时候命令行有提示。

生成的key包含一个私钥id_rsa和一个公钥id_rsa.pub,私钥保存在本地,我们需要将公钥添加到服务器的/root/.ssh/authorized_keys文件中。

1
cat ./id_rsa.pub >> /root/.ssh/authorized_keys 

考虑到我们并不想把私钥暴露在github公开仓库上,我们需要将私钥id_rsa添加到github的secrets中。

在仓库的Settings->Security->Secrets and variables->Actions中,选择New repository secret,添加一个SSH_PRIVATE_KEY,将私钥内容粘贴进去。

再新建三个secrets,分别是REMOTE_HOSTREMOTE_USERREMOTE_TARGET,分别对应服务器的地址、用户名、目标路径。

在代码仓库的.github/workflows目录下创建一个.yml文件,文件名可以自定义,如deploy.yml

一个库可以有多个workflow,github只要发现.github/workflows目录下有.yml文件,就会自动运行workflow。

内容可以参考如下:

 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
name: Deploy

# 触发条件
on:
  push:
    branches: [ main ]
  workflow_dispatch: # 手动触发

jobs:
  deploy:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Install Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '16.x'
    - name: ssh deploy
      uses: easingthemes/ssh-deploy@v5.0.3
      with:
        SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
        ARGS: "-rlgoDzvc -i"
        SOURCE: ""
        REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
        REMOTE_USER: ${{ secrets.REMOTE_USER }}
        TARGET: ${{ secrets.REMOTE_TARGET }}

向github仓库push代码之后,我们在Actions选项卡中可以看到workflow的运行情况。假如运行失败,可以点进去查看具体的错误信息,进行调试。

之后每次push到main分支或者手动触发workflow,github action就会自动运行workflow,将代码部署到服务器上。