前端项目使用gitlab-cicd+docker实现自动化部署

在这里插入图片描述

GitLab CI/CD 是一个强大的工具,可以实现项目的自动化部署流程,从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。

前言

为什么使用cicd+docker?

目前我们公司开发环境使用的shell脚本部署,一是要登录服务器,二是要去手动执行脚本,要是部分同事不懂运行脚本的话还得教他,费时费力;但是搭建好了cicd之后只需要提交合并代码就会完成自动化部署不需要人工介入、使用docker是因为可以环境互不干扰(例如node14,node15,node16等不同版本都可以在一台服务器运行)

前置准备

GitLab 仓库:确保代码已经推送到 GitLab 仓库。
部署服务器:一台可以通过 SSH 访问的服务器,用于部署你的前端项目。
工具准备:GitLab Runner、docker
项目文件:.gitlab-ci.yml、Makefile、dockerfile


持续集成 (CI)

持续集成是一种开发实践,开发人员将代码频繁地合并到共享的代码仓库中,通常每天多次。每次代码合并后,都会触发自动化的构建和测试流程。

  • 频繁集成:开发人员定期将新代码合并到主分支。
  • 自动化测试:每次合并都会运行测试,确保新代码不会破坏已有功能。
  • 快速反馈:测试失败或构建失败时立即通知开发者。
  • 发现问题更快,因为每次小的更改都会被立即验证。
  • 减少了“大规模集成”带来的风险和时间消耗。

持续交付 (CD - Continuous Delivery)

持续交付是在持续集成的基础上,进一步自动化了将软件交付到生产环境之前的所有流程。代码在通过构建和测试后,自动部署到一个可运行的环境(通常是预发布环境),但部署到生产仍需要手动触发。

  • 自动化部署:代码经过验证后可以自动部署到预发布环境。
  • 人为审核:生产环境的部署通常需要手动批准。
  • 可随时交付:开发团队确保软件在任何时间点都可以部署到生产。
  • 缩短了发布周期。
  • 提高了软件交付的可靠性和稳定性。
  • 可轻松在不同环境(如开发、测试、预生产)中验证软件。

持续部署 (CD - Continuous Deployment)

持续部署是持续交付的进一步延伸,完全自动化了整个交付过程。通过所有测试的代码会自动部署到生产环境,无需人工干预。

  • 全自动化:不需要人为批准,代码直接进入生产环境。
  • 高测试要求:需要非常可靠的自动化测试体系。
  • 快速交付:代码从开发到上线的周期极短。
  • 开发团队可以快速将新功能交付到用户手中。
  • 减少人为操作导致的错误。
  • 提高了产品的敏捷性。

GitLab Runner 是什么?

GitLab Runner 是一个开源的应用程序,用于执行 GitLab CI/CD 中定义的任务(也称为作业)。它是 GitLab CI/CD 的核心组件之一,用于从 GitLab 获取作业、执行作业,并将结果反馈给 GitLab。

GitLab Runner 的功能

执行 CI/CD 流水线作业:从 .gitlab-ci.yml 文件中获取任务配置并执行。
支持多种执行器:支持不同的环境运行作业,如 Docker、Shell、Kubernetes 等。
跨平台支持:可以安装在多种操作系统上,包括 Linux、Windows 和 macOS。
分布式运行:可以在多个 Runner 上并行执行流水线任务。
负载均衡:当有多个 Runner 注册到 GitLab 项目时,任务会自动分配。

GitLab Runner 安装

GitLab Runner 教程


部署

.gitlab-ci.yml教程

要使用 GitLab CI/CD,您需要:

  • 托管在 Git 仓库中的应用程序代码。
  • 仓库根目录中名为 .gitlab-ci.yml 的文件,其中包含 CI/CD 配置。

这是我自己项目中的.gitlab-ci.yml

stages:- build # 编译# - deploy-dev            # 开发环境- deploy-test # 测试环境- deploy-online # 上线 - 推送镜像build-job:stage: buildtags:- docker_testvariables:GIT_CLEAN_FLAGS: -ffdx -e node_modules/script:- echo "Compiling the code..."# - make build- echo "Compile complete."only:- test# - devbuild-online-job:stage: buildtags:- docker_onlinevariables:GIT_CLEAN_FLAGS: -ffdx -e node_modules/script:- echo "Compiling the code..."# - make build ENV=prod- echo "Compile complete."only:- main# deploy-dev-job:
#   stage: deploy-dev
#   # environment: production
#   tags:
#     - docker_dev
#   variables:
#     GIT_CLEAN_FLAGS: -ffdx -e dist/ -e node_modules/
#   script:
#     - echo "Deploying application..."
#     - make docker-deploy ENV=dev
#     - echo "Application successfully deployed."
#   only:
#     - devdeploy-test-job:stage: deploy-test# environment: productiontags:- docker_testvariables:GIT_CLEAN_FLAGS: -ffdx -e dist/ -e node_modules/script:- echo "Deploying application..."- make docker-deploy ENV=test- echo "Application successfully deployed."only:- testdeploy-online-job:stage: deploy-onlinetags:- docker_onlinevariables:GIT_CLEAN_FLAGS: -ffdx -e dist/ -e node_modules/script:- echo "Compiling the code..."- make deploy-online ENV=prod- echo "Compile complete."only:- main

Makefile 是什么?

Makefile 是一种自动化构建工具的配置文件,用于定义如何编译和链接程序以及执行其他任务。它主要用于管理项目中的构建过程,例如将源代码编译为二进制文件。make 工具通过读取 Makefile 来执行任务。

尽管最初是为 C/C++ 项目设计的,Makefile 也可以用于任意任务的自动化,如压缩文件、运行测试、生成文档等。

Makefile教程

这是我自己项目中的Makefile

REGISTRY?=www.github.com/xxx
APP=demo
BACKEND_PORT:= 9300
PORT:= 8300
# 获取最近的 Git 标签作为版本号
RAW_VERSION := $(shell git describe --tags --always 2>/dev/null || echo dev)
VERSION := $(shell echo $(RAW_VERSION) | awk -F '-' '{print $$1}')
# 读取 VERSION 文件中的版本号
# version := $(shell cat VERSION 2>/dev/null || echo last)
# 打印版本号
print_version:@echo "The version is: $(VERSION)"
HOST := http://xxx.xxx.com
ifeq ($(ENV), dev)HOST = xxx.xxx.com
endif
ifeq ($(ENV), test)HOST = xxx.xxx.com
endif
ifeq ($(ENV), prod)HOST = xxx.xxx.com
endifIMAGES := ${REGISTRY}/${APP}:${VERSION}
.PHONY: build
## 构建应用
build: clean@echo "Building..."npm i; npm run build# 验证环境变量
check-environment:
ifndef ENV$(error ENV not set, allowed values - `staging` or `production`)
endif.PHONY: docker-build
## 构建docker镜像
docker-build:docker build -f Dockerfile2 -t ${IMAGES} ..PHONY: docker-deploy
## 部署docker容器 - 测试环境
docker-deploy: docker-builddocker stop ${APP} || true; docker rm ${APP} || true; docker run -p ${PORT}:80 -d -e BACKENDURL="${HOST}:${BACKEND_PORT}/" --name ${APP} ${IMAGES}.PHONY: deploy-online
## 部署docker容器 - 生产环境
deploy-online: docker-builddocker stop ${APP} || true; docker rm ${APP} || true; docker run -p ${PORT}:80 -d -e BACKENDURL="${HOST}:${BACKEND_PORT}/" --name ${APP} ${IMAGES}.PHONY: docker-push
## 推送docker镜像 - 测试环境
docker-push: check-environmentdocker build -f Dockerfile -t ${IMAGES} .## docker push ${IMAGES}.PHONY: help
## 帮助命令
help:@echo "Usage: \n"@sed -n 's/^##//p' ${MAKEFILE_LIST} | column -t -s ':' |  sed -e 's/^/ /'

Dockerfile

# 编译打包
FROM node:18-alpine as builder
WORKDIR /app
COPY package.json .
ENV NODE_OPTIONS=--openssl-legacy-provider
# RUN npm install
RUN npm config set registry https://registry.npmmirror.com/ && npm install
COPY . .
RUN npm run build# 运行应用
FROM nginx:latest
COPY --from=builder /app/dist /usr/share/nginx/html
COPY container/nginx.conf.template /etc/nginx/nginx.conf.template
COPY container/init.sh /init.sh
RUN chmod 777 init.sh
EXPOSE 80CMD ["/bin/bash", "/init.sh"]

dockerfile中包含的文件

container/nginx.conf.template

user root;
events {worker_connections 4096; ## Default: 1024
}http {# 设置超时时间proxy_connect_timeout 60s;proxy_send_timeout 7200s;proxy_read_timeout 7200s;client_max_body_size 200M;include /etc/nginx/mime.types;sendfile on;server {listen 80;listen [::]:80;add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requested-With,access-token,Access-Token,Refresh-Token,Accept,Content-Type,User-Agent;add_header Access-Control-Allow-Methods GET,POST,OPTIONS;location / {root /usr/share/nginx/html;index index.html;try_files $uri $uri/ /index.html;}# sse推送的特定接口的配置location /api/admin/channelAccount/getMetrics {rewrite ^/api/(.*)$ /$1 break;  # 去除 /api 前缀proxy_pass $BACKENDURL; #后端实际服务器地址proxy_http_version 1.1;proxy_buffering off;proxy_cache off;chunked_transfer_encoding off;}location ^~/api/ {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-NginX-Proxy true;proxy_pass $BACKENDURL; #后端实际服务器地址add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requested-With,access-token,Access-Token,Refresh-Token,Accept,Content-Type,User-Agent;add_header Access-Control-Allow-Methods GET,POST,OPTIONS;}}
}

container/init.sh

#!/bin/bash
BACKENDURL=$BACKENDURL
export "BACKENDURL"=$BACKENDURL
envsubst '$BACKENDURL' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf && nginx -g 'daemon off;'

gitlab创建runner

新建runner
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

服务器执行命令、执行器选择shell

gitlab-runner register  --url https://gitlab.xxx.com  --token glrt-t3_zBQiLoAqysRDEgfiexUZ --executor "shell"

在这里插入图片描述

完成

提交代码到test分支后就可以看到构建记录了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…

DApp开发前端框架选择:React还是Vue?

在区块链DApp开发中&#xff0c;前端框架的选择对用户体验和开发效率至关重要。React和Vue作为两大主流前端框架&#xff0c;各自拥有广泛的开发者基础和丰富的生态支持。那么在DApp开发中&#xff0c;该如何选择适合自己的框架呢&#xff1f;下面我们来比较一下&#xff0c;看…

6. 一分钟读懂“抽象工厂模式”

6.1 模式介绍 书接上文&#xff0c;工厂方法模式只能搞定单一产品族&#xff0c;遇到需要生产多个产品族时就歇菜了。于是&#xff0c;在需求的“花式鞭策”下&#xff0c;程序员们再次绷紧脑细胞&#xff0c;创造出了更强大的抽象工厂模式&#xff0c;让工厂一次性打包多个产品…

gulp应该怎么用,前端批量自动化替换文件

背景 最近公司准备把所有项目中用到的国际化相关的key规范化&#xff0c;原因是: 一直以来公司的app和web端 在针对相同的需求以及相同的国际化语言&#xff0c;需要设置不同的两份国际化文件&#xff0c;难以维护旧版的国际化文件中&#xff0c;存在的大量值重复&#xff0c…

UML箭线图的理解和实践

在软件开发的世界里&#xff0c;UML&#xff08;统一建模语言&#xff09;作为一种标准化的建模语言&#xff0c;扮演着举足轻重的角色。UML类图更是软件开发设计和架构过程中的核心工具&#xff0c;它不仅能帮助开发者明确系统中的类及其关系&#xff0c;还能为后续的代码实现…

hive 行转列

行转列的常规做法是&#xff0c;group bysum(if())【或count(if())】 建表: CREATE TABLE table2 (year INT,month INT,amount DOUBLE );INSERT INTO table2 (year, month, amount) VALUES(1991, 2, 1.2),(1991, 3, 1.3),(1991, 4, 1.4),(1992, 1, 2.1),(1992, 2, 2.2),(1992…

【NoSQL数据库】Hbase基本操作——数据库表的增删改查

目录 一、Hbase原理 二、HBase数据库操作 三、遇到的问题和解决方法 一、Hbase原理 HBase的数据模型&#xff1a; 行键 时间戳 列族&#xff1a;contents 列族&#xff1a;anchor 列族&#xff1a;mime “com.cnn.www” T9 Achor:cnnsi.com”CNN” T8 Achor:…

【ETCD】ETCD用户密码认证

目录 概述 特殊用户和角色 root用户 root角色 用户操作 角色操作 启用身份验证 使用etcdctl进行身份验证 使用TLS通用名称 概述 etcd 2.1中增加了身份验证功能。etcd v3 API对身份验证功能的API和用户界面进行了轻微修改&#xff0c;以更好地适应新的数据模型。本指南…

王道考研编程题总结

我还在完善中&#xff0c;边复习边完善&#xff08;这个只是根据我自身总结的&#xff09; 一、 线性表 1. 结构体 #define MaxSize 40 typedef struct{ElemType data[MaxSize]&#xff1b;int length; }SqList 2. 编程题 1. 删除最小值 题意 &#xff1a;从顺序表中删除…

Vue3技术开发,使用纯CSS3动手制作一个3D环绕的相册展示效果,支持传入任意图片.3D轮播相册的组件

主要讲述封装一个3D轮播相册的组件&#xff0c;效果图如下&#xff0c;仅仅传入一个图片的数组即可&#xff0c;效果如下&#xff1a; 使用Vue3技术开发&#xff0c;支持传入任意张数的图片。 使用方法 <template><Swiper :list"list" /> </templat…

本地运行打包好的dist

首先输入打包命令 每个人设置不一样 一般人 是npm run build如果不知道可以去package.json里去看。 打包好文件如下 命令行输入 :npm i -g http-server 进入到dist目录下输入 命令cmd 输入 http-server 成功

通过华为鲲鹏认证的软件产品如何助力信创产业

软件通过华为鲲鹏认证与信创产业有着密切的联系。鲲鹏认证是华为推动信创产业发展的一项重要举措&#xff0c;通过该认证&#xff0c;软件可以在华为的生态系统中实现更好的兼容性和性能优化&#xff0c;从而推动信创产业的全面发展和国产化替代。 鲲鹏认证的定义和重要性 鲲…

RabbitMQ介绍及安装

文章目录 一. MQ二. RabbitMQ三. RabbitMQ作用四. MQ产品对比五. 安装RabbitMQ1. 安装erlang2. 安装rabbitMQ3. 安装RabbitMQ管理界⾯4. 启动服务5. 访问界面6. 添加管理员用户7. 重新登录 一. MQ MQ( Message queue ), 从字⾯意思上看, 本质是个队列, FIFO 先⼊先出&#xff…

Vue生成类似于打卡页面

数据表格 <el-table :data"tableData" border height"calc(100vh - 240px)" :cell-style"cellFun"><el-table-column label"姓名" show-overflow-tooltip prop"name" align"center"/><el-table-co…

vscode上传本地文件到服务器

vscode上传本地文件到服务器 首先下载插件SFTP&#xff0c;我们通过ftp进行文件传输 VScode打开要传输的文件 使用快捷键 ctrlshiftP 打开搜索窗口&#xff0c;搜索SFTP 点击之后vscode文件夹下会生成对应json文件 我们编辑json信息根据远程的服务器情况填写&#xff0c;比如…

趣味数学 2.3.7 | 完全免费,无注册登录,简约纯净

趣味数学是一款完全免费的数学学习软件&#xff0c;支持安卓系统。它无需登录注册&#xff0c;界面简约纯净&#xff0c;分类详细&#xff0c;涵盖趣味数学、数学初练、应用计算、数字推理、图形推理、数字2048、题目练习和数学知识等多个分类。每个分类包含丰富的题目和关卡&a…

JavaScript 快速上手

目录 一. JavaScript 基本概念 二. JavaScript 基本语法 1. 三种引入方式 (1) 行内样式 (2) 内部样式 (3) 外部样式 2. 基础语法 (1) 变量 (2) 数据类型 (3) 运算符 3. JS 对象 (1) 数组 <1> 创建数组 <2> 数组操作 (2) 函数 <1> 普通函数 &…

php基础:文件处理2

1.文件属性 当我们在程序中操作文件时&#xff0c;可能会使用到文件的一些常见属性&#xff0c;比如文件的大小、类型、修改时间、访问时间以及权限等等。PHP 中提供了非常全面的用来获取这些属性的内置函数&#xff0c;如下表所示。 2.目录操作 新建目录&#xff1a;mkdir(路…

(二)FT2232HL调试器的驱动安装

1、FT2232HL调试器 FT2232HL调试器淘宝链接&#xff1a; http://e.tb.cn/h.TZH7byCQ1jwlqhy?tkdZo03JTjtwL ​ 2、软件下载 下载zadig-2.9.exe&#xff08;免安装&#xff09; 链接&#xff1a;https://www.filecroco.com/download-zadig/download/ ​ ​ 3、驱动安装 1…

远程debug

这里写自定义目录标题 一、首先配置idea二、配置jvm1、将刚才idea生成的jvm指令复制下来&#xff0c;就是如下内容&#xff08;注意要从你的idea中复制&#xff09;2、在粘贴之前&#xff0c;要拼接上java-jar命令&#xff0c;还有servery,suspendy命令&#xff0c;最后拼接项目…