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

news2025/1/15 7:13:19

在这里插入图片描述

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: build
  tags:
    - docker_test
  variables:
    GIT_CLEAN_FLAGS: -ffdx -e node_modules/
  script:
    - echo "Compiling the code..."
    # - make build
    - echo "Compile complete."
  only:
    - test
    # - dev

build-online-job:
  stage: build
  tags:
    - docker_online
  variables:
    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:
#     - dev

deploy-test-job:
  stage: deploy-test
  # environment: production
  tags:
    - docker_test
  variables:
    GIT_CLEAN_FLAGS: -ffdx -e dist/ -e node_modules/
  script:
    - echo "Deploying application..."
    - make docker-deploy ENV=test
    - echo "Application successfully deployed."
  only:
    - test

deploy-online-job:
  stage: deploy-online
  tags:
    - docker_online
  variables:
    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
endif

IMAGES := ${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-build
	docker 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-build
	docker 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-environment
	docker 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 80

CMD ["/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.coloradmin.cn/o/2256683.html

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

相关文章

设计模式:20、状态模式(状态对象)

目录 0、定义 1、状态模式的三种角色 2、状态模式的UML类图 3、示例代码 0、定义 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。 1、状态模式的三种角色 环境&#xff08;Context&#xff09;&#xff1a;环境是一个类&#xff0…

Unity3D学习FPS游戏(13)玩家血量控制

玩家血量控制 血条UI玩家Canvas下的Slider血量逻辑控制 子弹攻击掉血子弹发射者的区分玩家受伤逻辑子弹碰撞检测 效果 血条UI 和之前我们前面介绍的玩家武器弹夹UI的思路是一样的&#xff0c;跟详细的细节可以参考博客Unity3D装弹和弹夹UI显示。 玩家Canvas下的Slider 之前玩…

【开源免费】基于SpringBoot+Vue.JS高校学科竞赛平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 075 &#xff0c;文末自助获取源码 \color{red}{T075&#xff0c;文末自助获取源码} T075&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

学在西电录播课使用python下载,通过解析m3u8协议、多线程下载ts视频块以及ffmpeg合并

本文涵盖的内容仅供个人学习使用&#xff0c;如果侵犯学校权利&#xff0c;麻烦联系我删除。 初衷 研究生必修选逃&#xff0c; 期末复习怕漏过重点题目&#xff0c;但是看学在西电的录播回放课一卡一卡的&#xff0c;于是想在空余时间一个个下载下来&#xff0c;然后到时候就…

基于php+mysql的旅游网站——记忆旅行 旅游分享 攻略分享 设计与实现 源码 配置 文档

旅游网站 1.项目描述2. 概述3.项目功能4.界面展示5.源码获取 1.项目描述 摘 要 随着互联网的不断发展&#xff0c;计算机网络逐渐普及到人们的生活&#xff0c;为人们带来了便捷。互联网的趋势扩大&#xff0c;运用到家家户户中。各行各业都在考虑利用互联网将自己的信息推广…

2024.12.6——攻防世界php_rce

知识点&#xff1a;PHP框架 RCE远程命令执行 PHP常用框架&#xff1a;php常用的7大框架_php框架-CSDN博客 1.小型项目&#xff1a;CodeIngiter 2.中型项目&#xff1a;CakePHP、Zend Framework、Laravel、Thinkphp 3.大型重量级项目&#xff1a;Yii、Symfony、Laravel 使用…

autogen 人工输入模式

一、Allowing Human Feedback in Agents 允许代理中的人类反馈 发起聊天 (initiate_chat) 功能&#xff1a;用于启动对话过程。 参数&#xff1a;max_turns&#xff1a;限制对话的最大回合数。如果设置为3&#xff0c;意味着对话将在第三个回合后自动终止&#xff0c;除非提前…

网络渗透实验四(渗透课)

实验目的和要求实验目的&#xff1a;通过对目标靶机的渗透过程&#xff0c;了解CTF竞赛模式&#xff0c;理解CTF涵盖的知识范围&#xff0c;如MISC、PPC、WEB等&#xff0c;通过实践&#xff0c;加强团队协作能力&#xff0c;掌握初步CTF实战能力及信息收集能力。熟悉网络扫描、…

C++_关于异常处理throw-try-catch

文章目录 作用1. 无异常捕获2. 有异常捕获 作用 简单说&#xff0c;异常处理机制主要作用是让程序能够继续执行&#xff0c;或者以一种可控的方式终止&#xff0c;而非让程序因为错误直接崩溃 一个简单的动态数组类&#xff0c;来看看有异常捕获和无异常捕获的区别 1. 无异常…

LabVIEW氢同位素单质气体定量分装系统

氢同位素单质气体在多个行业中有重要应用&#xff0c;如能源和化工。传统的分装方法面临精度和自动化程度不足的问题。为此&#xff0c;开发了一套基于LabVIEW和质量流量控制器的定量分装系统&#xff0c;提高分装精度和效率&#xff0c;同时减少资源浪费和环境污染。 项目背景…

第427场周赛: 转换数组、用点构造面积最大的矩形 Ⅰ、长度可被 K 整除的子数组的最大元素和、用点构造面积最大的矩形 Ⅱ

Q1、转换数组 1、题目描述 给你一个整数数组 nums&#xff0c;它表示一个循环数组。请你遵循以下规则创建一个大小 相同 的新数组 result &#xff1a; 对于每个下标 i&#xff08;其中 0 < i < nums.length&#xff09;&#xff0c;独立执行以下操作&#xff1a; 如…

华为服务器使用U盘重装系统

一、准备工作 下载官方系统&#xff08;注意服务器CPU的架构是x86-64还是aarch64&#xff0c;不然可能报意想不到的错&#xff09;制作启动U盘&#xff08;下载rufus制作工具&#xff0c;注意文件系统选FAT32还是NTFS&#xff09; 二、安装步骤 将U盘插入USB接口重启服务器…

java八股-流量封控系统

文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制&#xff0c;比如 x 秒请…

Nginx限流实践-limit_req和limit_conn的使用说明

注意&#xff1a; 本文内容于 2024-12-07 19:38:40 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;Nginx限流实践。感谢您的关注与支持&#xff01; 一、限流 之前我有记录通过CentOS7定时任务实…

centos9升级OpenSSH

需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2&#xff08;根据需求进行升级&#xff09; 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…

【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 ✔️ 11.2.2.…

16-02、JVM系列之:内存与垃圾回收篇(二)

JVM系列之&#xff1a;内存与垃圾回收篇(二) ##本篇内容概述&#xff1a; 1、堆Heap Area 2、方法区Method Area 3、运行时数据区总结 4、对象的实例化内存布局和访问定位一、堆 Heap Area 1、堆的核心概念 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心…

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势&#xff0c;帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇&#xff0c;审校为邱雪和许东舟。 一、会议介绍 ICPR…

网络安全知识:网络安全网格架构

在数字化转型的主导下&#xff0c;大多数组织利用多云或混合环境&#xff0c;包括本地基础设施、云服务和应用程序以及第三方实体&#xff0c;以及在网络中运行的用户和设备身份。在这种情况下&#xff0c;保护组织资产免受威胁涉及实现一个统一的框架&#xff0c;该框架根据组…

树莓集团是如何链接政、产、企、校四个板块的?

树莓集团作为数字影像行业的积极探索者与推动者&#xff0c;我们通过多维度、深层次的战略举措&#xff0c;将政、产、企、校四个关键板块紧密链接在一起&#xff0c;实现了资源的高效整合与协同发展&#xff0c;共同为数字影像产业的繁荣贡献力量。 与政府的深度合作政府在产业…