【前端github actions CI/CD实战】通过github actions自动化部署web项目

3,386 阅读5分钟

背景

简单、快捷、安全、方便永远独立开发者的第一选择。由于我们的团队项目在Github存储和管理,对比与jenkins Travis CICircleCI第三方平台,最终选择了用GitHub Actions轻量级的自动化部署来实现CI/CD。

项目案例部署 DooringX

项目搭建框架 Dooringx

GitHub Actions

github actions 官方传送门

GitHub 提供预配置的工作流程模板,您可以自定义以创建自己的持续集成工作流程。 GitHub 分析代码并显示可能适用于您的仓库的 CI 模板。您也可以从marketplace查询选择您需要的Actions CI;

举例:查询文件copy 与scp相关的actions,如下所示:

marketplace 官方传送门

image.png

workflow 基本概念

workflow

工作流程,持续集成一次运行的过程,就可以称之为一个workflow

name
>工作流程的名称(可空),如果设置,则会在GitHub的操作页面上显示工作流的名称
on

触发工作流的事件名称。譬如发起的push/pull_request等操作触发。可以只监听某一个事件string,或者多个事件。可以触发工作流程的事件

```
# 示例:使用单一事件监听push操作,任意push都会被触发
on: push

#  示例:使用事件列表 监听任意的push和pull_request
on: [push, pull_request]

以上俩个示例我们在仓库的任意分支执行push或者pull_request都会触发相应的actions 流程,实际开发中会新建很多分支,而且为了更好的管理流程,test/dev/uat/release等等一系列的对应指定环境的分支名称和发布动作,这时候就不仅需要监听操作,同时也要监听对应的分支名称,来实现定制化的部署配置;


   #  示例:使用具有活动类型或配置的多个事件,监听main分支上的push事件

  on: 
    push: 
      branches: 
        - main
    
 ```
job

任务,任务是工作流的主体,一个工作流由一个任务(job)或者多个任务(jobs)构成,表示一次持续集成的运行

job_id

每个任务都必须要有个id,其实就是一个字符串

runs-on

任务运行的虚拟环境,必须要指定,不然无法工作

```
# 目前可用的环境
Windows Server 2019     windows-latest  windows-2019
Ubuntu 20.04            ubuntu-20.04
Ubuntu 18.04            ubuntu-latest  ubuntu-18.04
Ubuntu 16.04            ubuntu-16.04
macOS Catalina 10.15    macos-latest  macos-10.15

# 使用
runs-on: ubuntu-latest
```
steps

步骤,每个任务由多个step构成,通过一个多或者多个步骤完成一个任务。可以在运行命令、运行任务、运行仓库中的操作、docker注册表中发布操作。

注意点: 不是所有的step都会运行操作,但是所有的操作都会作为step运行,每个step在虚拟环境中都会有个独立的进程,可以访问工作区和文件系统。

name

步骤名称

run

该步骤运行的命令或者 action

env

该步骤所需的环境变量

uses

选择任务步骤中一部分运行的操作。其实就是步骤使用的actions,可以是一个或多个

项目实战

我们以实战项目案例为例:

  • 如果 .github/workflows 目录不存在,请在 GitHub 的仓库中创建此目录。

  • 在 .github/workflow 目录中,创建一个名为 build.yml 的文件。 更多信息请参阅“创建新文件”。

  1. 将以下 YAML 内容复制到 build.yml 文件中:
name: build
on: 
  push: 
    branches: 
      - main
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout 🛎️
        uses: actions/checkout@v2 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly.
        with:
          persist-credentials: false

      - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built.
        run: |
          lerna bootstrap  # 安装依赖
          lerna run build  # 执行打包
          cd ./packages/demoPro/ # 切换到 dist 目录
          tar -czvf dist.tar dist # 目标文件进行打包
      - name: Deploy 🚀
        uses: cross-the-world/ssh-scp-ssh-pipelines@latest # 因为构建之后,需要把代码上传到服务器上,所以需要连接到ssh,并且做一个安全拷贝(security copy)操作
        env:
          WELCOME: "ssh scp ssh pipelines"
          LASTSSH: "Doing something after copying"
        with:
         host: ${{ secrets.DR_HOST }}
         user: ${{ secrets.DR_USER }}
         pass: ${{ secrets.DR_PASS }}
         port: ${{ secrets.DR_PORT }}
         connect_timeout: 10s
         first_ssh: |
            rm -rf /usr/local/webserver/nginx/html/dist
            mkdir -p /usr/local/webserver/nginx/html/dist
         scp: |
           './packages/demoPro/dist.tar' => /usr/local/webserver/nginx/html
         last_ssh: |
            cd /usr/local/webserver/nginx/html # 切换到部署目录
            tar -xzvf dist.tar  # 将 tar 打包文件进行解压到当前部署目录
           

由于我们的项目使用monorepo 基于lerna的多包管理项目:

特别注意

scp 安全copy 的dist文件是相对于项目根目录的路径;'./packages/dooring-v2-editor/dist/*'

Install and Build 🔧

安装依赖和打包使用执行如下命令:

 lerna bootstrap  # 安装依赖  npm install
 lerna run build  # 执行打包  npm run build

打包优化 🔧

使用 tar 命令对目标文件进行打包压缩

tar -czvf <压缩文件名称> 目标压缩文件

 cd ./packages/demoPro/ # 切换到 dist 目录
 tar -czvf dist.tar dist # 目标文件进行打包压缩

使用 tar 命令对目标包进行解压

tar -xzvf dist.tar

  cd /usr/local/webserver/nginx/html # 切换到部署目录
  tar -xzvf dist.tar  # 将 tar 打包文件进行解压到当前部署目录

Deploy 🚀

将打包后的dist文件部署到我们指定的远程服务器路径,我们需要ssh连接服务器,并通过scp将打包后的文件安全copy到服务器路径:

我们目前使用的是如下action,您也可以根据自己的需要在marketplace选择自己需要的action:

action 官方传送门

cross-the-world/ssh-scp-ssh-pipelines@latest

变量定义以及命名

如果是public repo,为了保护隐私,就需要借助GitHub的Secrets,以变量的方式访问build.yml文件内容; 如下所示: image.png

特别注意

如果您的项目为private repo,可以直接将host/port/user/pass等变量值设置为明文; 变量含义以及定义需要根据我们选定的action文档命名即可: action 官方传送门

image.png

Done

如上完成了一个相对简单的基于github actions的CI/CD;我们可以通过触发main分支的push事件,来测试打包以后的文件是否部署到服务器指定目录;

查看执行结果

登录服务器执行查看命令

cd  /usr/local/webserver/nginx/html/

查看执行action

image.png

相关

【nginx前端部署】如何在同一台服务器部署多个不同的web项目

【前端Docker部署实战】Docker镜像+Nginx配置部署 Vue 项目