开发提效之cicd平台搭建(多环境构建+发布时配置)

1,051 阅读9分钟

导读

本文将介绍如何搭建cicd平台,且支持以下功能

  • 不同构建环境并存的打包(eg: 同时支持多个node版本)
  • 构建时决定不同配置环境的打包(eg: test环境&&prod环境)
  • 发布时决定每个不同租户的个性化配置(eg: 常见sass项目私有化部署,不同的租户代表不同的公司,每个公司可能有自己的个性化配置,像logo,api地址,oss地址等,这些都可以在发布阶段来动态注入)

背景

笔者上家公司是个小公司,前端的发布是本地构建,然后将构建好的包发给运维再丢到服务器上面,操作步骤非常繁琐,于是便搭建了支持多构建环境打包的cicd平台。

选型

关于为什么选用spug作为cicd平台?

因为它有一套完整的发布工作流(工作流其实非常重要,它规范了我们每个角色职责,减少因人为操作的出错,也能减少运维的工作量)它能创建不同的角色,为角色分配不同的功能,它还有告警,发版审核,权限控制,可视化操作界面等等功能。对很多小公司来说,投入产出比是非常重要的考量,最终选择了这个可用,功能齐全的成品来作为我们开发的cicd平台,而没有选择Jinkens。

具体详情可参见官网 www.spug.cc/docs/about-…

DooD

spug作为cicd平台很强大,它能提供平台帮助我们构建项目,但是大家的构建环境都不一样,有的可能依赖node12,有的依赖node16。有的java8,有的java18。

我们在一个环境进行所有项目的打包,是很难同时存在以上多种环境。而环境隔离最好的工具就是docker,但是我们的spug是用docker搭建的容器,在容器中使用docker,那么就得引出我们的DooD概念

DooD(Docker outside of Docker):运行在Docker容器外部的Docker,即在容器内部操作外部的Docker服务端。

详情可见blog.csdn.net/qq_42482078…

有了DooD后,我们就能够放心的构建而不用担心会对其他项目的构建造成影响了。在接下来的步骤中,笔者也会特别标注DooD相关改造

搭建步骤

笔者演示环境 CentOS7 docker23

  1. 在服务器的空文件夹spug创建docker-compose.yml vi docker-compose.yml
version: "3.3"
services:
  db:
    image: mariadb:10.8.2
    container_name: spug-db
    restart: always
    command: --port 3306 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - /data/spug/mysql:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=spug
      - MYSQL_USER=spug
      - MYSQL_PASSWORD=spug.cc
      - MYSQL_ROOT_PASSWORD=spug.cc
  spug:
    image: openspug/spug-service
    container_name: spug
    privileged: true
    restart: always
    volumes:
      - /data/spug/service:/data/spug
      - /data/spug/repos:/data/repos
      # DooD: 需要将宿主机 的docker.sock 挂载进容器
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      # 如果80端口被占用可替换为其他端口,例如: - "8081:80"
      - "80:80"
    environment:
      - MYSQL_DATABASE=spug
      - MYSQL_USER=spug
      - MYSQL_PASSWORD=spug.cc
      - MYSQL_HOST=db
      - MYSQL_PORT=3306
    depends_on:
      - db

2.启动容器 docker compose up -d

3.创建管理员账号docker exec spug init_spug 账号 密码 账号和密码替代为你自己的

4.在浏览器打开我们的可视化页面 http://localhost:80 ,用上面创建好的账号密码就能登录了

image.png

5.DooD: 为了使我们的spug容器能够使用docker, 我们还需为其安装docker。 首先进入spug容器 docker exec -it spug bash

然后安装docker相关依赖 sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

其它系统的安装可参考docs.docker.com/engine/inst…

6.下面我们用nginx镜像验证是否成功

拉取镜像:docker pull nginx

运行镜像:docker run --name nginx-container -p 8080:80 -d nginx

image.png

查看运行结果:验证成功

image.png

主机配置

平台搭建好后,我们需要进行主机配置。

首先什么是主机?

主机可以理解为服务器

主机配置就是给spug我们服务器的账号密码,让它有权限能够在服务器上进行拉取代码,操作打包,构建产物存放等

我们来到主机管理页面,配置一台主机

image.png

点击保存后会输入一次密码,输入完后就会生成配置信息,我们在右上角web终端可以直接操作远程服务器

image.png

image.png

创建应用

每一个git仓库可以理解为一个应用,每个应用下可以配置多个环境,测试环境,生产环境等,我们可以为不同环境配置不同变量

1.首先我们新建一个应用

image.png

2.然后来到环境配置,新建测试和生产环境

image.png

3.回到应用设置,给我们的应用配置环境变量 image.png

4.环境变量类似于我们vite项目的配置文件env.test, env.prod,但是它更强大,我们不仅可以应用于我们构建时,也能应用到发布时(可以想象,我们一套代码要部署多个私有化环境,传统方案是设置多个env.xxx, 然后打包多次。当我们能用上发布时变量后,我们只需要打包一次,变量由发布环境决定,大大加快速度) image.png

5.然后我们来到发布配置,选择新建一个发布

image.png

6.然后我们选择常规发布 image.png

常规发布由 Spug 负责应用代码的打包、传输和更新,但提供了各个阶段可自定义的钩子 拉取代码,提供钩子在spug容器中进行命令操作,传输文件,。

配置项

  • 发布环境 为哪个环境创建的发布配置,例如:测试环境 / 生产环境等。
  • Git仓库地址 该应用的 Git 仓库地址(请确保部署运维平台的服务器有权限通过给定的地址克隆仓库)。
  • 发布审核 开启后创建的发布申请单需要审核后才可以进行发布。
  • 目标主机部署路径 应用部署的路径,例如:静态网站部署在目标服务器的 /var/www/html
  • 目标主机仓库路径 用于存储应用的历史版本,可自定义任意目录,例如:/data/spug/repos
  • 保留历史版本数量 即如上边的例子中 /data/spug/repos 保留的历史版本数量,超过后早起的版本会自动删除,以节约存储空间。
  • 发布目标主机 可以选择一个或多个主机进行发布。
  • 文件过滤 可选 仅包含 或 排除 指定的文件,会从克隆的 Git 仓库的源代码中根据指定的规则过滤出符合条件的文件进行发布。
  • 自定义全局变量 可在后边的钩子命令内使用,Spug 本身也包含一些内置全局变量。
  • 代码迁出前执行 在部署 Spug 的服务器上运行,可以执行任意自定义命令。
  • 代码迁出后执行 在部署 Spug 的服务器上运行,当前目录为检出后待发布的源代码目录,可执行任意自定义命令。
  • 应用发布前执行 在发布的目标主机上运行,当前目录为目标主机上待发布的源代码目录,可执行任意自定义命令。
  • 应用发布后执行 在发布的目标主机上运行,当前目录为已发布的应用目录,可执行任意自定义命令。

自定义发布, Spug 仅负责按顺序依次执行记录的动作。

  1. 接下来我们进行具体的配置,首先选择 发布环境,部署的目标主机,配置git地址和权限等等 image.png

这里比较简单,都是选择和配置,这里笔者只演示主流程了,审核,消息通知就先不配置

  1. 继续下一步

image.png

文件过滤规则 是指最终会被传输到服务器的目录,因为前端一般打包目录默认是dist,所以这里也配置dist

代码检查后执行

在这里我们可以注入我们配置的环境变量到.env文件中,做到区分test和prod环境。

然后我们将使用docker打包构建,这里我们仅提供步骤。每个项目需要自己编写Dockfile, 在执行docker镜像构建时会读取项目的Dockfile来决定如何打包构建

步骤具体的代码如下

echo "===============代码检出后执行==================="

echo "注入环境变量到我们项目.env文件"
# env | grep _SPUG_ | sed 's/^_SPUG_VUE_DEMO_//g' 
env | grep _SPUG_ | sed 's/^_SPUG_VUE_DEMO_//g' > .env

echo "开始用镜像打包项目"
docker build -t $SPUG_APP_KEY .

echo "复制镜像打包产物到当前dist目录"
container_id=$(docker create $SPUG_APP_KEY)
echo $container_id
docker cp -a $container_id:/app/dist ./
docker rm -f "$container_id"

echo "=================打包成功======================="
  1. 配置完后我们接着下一步配置,这里比较简单,只需要配置就行。 如果需要做到发布时决定的话,可以在应用发布后将我们的变量注入到window

image.png

具体项目

配置完后我们再来看看我们的具体项目,这个项目其实在配置前先创建了,只是单独放一个章节方便观看。

此项目由下面命令快速创建 npm create vue@latest

其中主要包含.env文件(vite构建时会读取其中配置的变量)

image.png

然后包含Dockerfile

image.png

  # 设置node版本
  from node:16

  # 设置工作目录
  WORKDIR /app

  # 先复制 package.json 和 package-lock.json 到工作目录,
  # 此操作可以利用docker镜像缓存,当依赖没有变化时,npm i 直接使用缓存
  COPY package*.json ./

  # 安装依赖
  RUN npm install

  # 在复制其余文件到工作目录
  COPY . .

  # 执行打包
  RUN npm run build

  # 清除镜像中node_modules目录,减小镜像体积
  RUN rm -rf node_modules

新建一个发布

1.所有环境准备完毕后,来到发布申请点击新建申请来发布我们的第一个应用

image.png

image.png

2.选择发布分支,部署的目标主机等等信息后点击确定

image.png

3.然后在回到列表点击发布

image.png

接下来会出现一个弹窗显示我们构建信息

image.png

4.发布成功后我们再用nginx服务来测试验证

我们在目标主机启动一个nginx镜像,且镜像目录指向我们部署路径 docker run --name nginx -p 8080:80 -v /www/vue_demo/dist:/usr/share/nginx/html:ro -d nginx

image.png

然后在浏览器打开发现验证成功,且使用了环境配置的变量

image.png

image.png

搭建过程遇到的问题

1.docker镜像拉取报错,安装报错

最近受到政策要求,docker hub被墙导致很多镜像拉不下来。笔者也是找了很久,才找到几个还没被下掉的镜像源。大家如果在安装过程中需要docker镜像源,可以私聊笔者获取。