• 作者:老汪软件技巧
  • 发表时间:2024-08-20 15:03
  • 浏览量:

1. 概述

前端工程部署是一条将开发完成的Web应用程序发布的完整链条,其中涉及到NginxDockerJenkinsK8s等技术。这些环节相互配合,涉及用户请求的处理、资源文件的分发,集以资源后端后务的交互。这一环节涉及用户请求的处理、资源文件(HTML、CSS、JavaScript等)的分发,以及与后端服务的交互。

传统方式下,开发者需手动执行构建脚本,如使用Webpack打包代码,随后将打包好的文件通过FTP或SCP等工具上传至服务器指定目录。此过程不仅繁琐耗时,还容易出错,且难以自动化和版本管理,特别是在团队协作环境中,不同开发者间环境差异可能导致部署结果不一致。,下面就来简单介绍下其中涉及到的技术工具以及简单配置解析

2. Nginx

域名绑定、静态资源压缩、缓存、反向代理、支持https、负载均衡、高并发

# nginx.conf 文件找到 server 区域  
server {  
  # nginx 监听端口号,不能被其他应用占用  
  listen 80;  
  
  # nginx 绑定的域名  
  server_name localhost;  
  
  # access_log 指令指定所有访问日志存放的位置  
  access_log   logs/host.access.log   main;  
  
  # root 指令将请求映射到文件系统中的某个位置  
  root   C:/server/  
   
  # 开启 gzip 压缩,提高网络传输效率  
  gzip   on;  
  gzip_min_length 1k;  
  gzip_buffers 4 16k;  
  gzip_http_version 1.0;  
  gzip_comp_level 2;  
  gzip_types text/plain application/x-javascript text/css application/xml;  
  gzip_vary on;  
  
  # SSL 证书位置,如果启用 HTTPS ,需要指定服务器的证书和私钥  
  ssl_certificate   C:/Hooper/work/https/server/server.pem;  
  ssl_certificate_key C:/Hooper/work//https/server/server.key;  
  
  # 定义服务器的默认字符集  
  charset utf-8;  
  
  # 公共静态资源  
  location /xxx-app/ {  
    # alias 别名,将请求映射到文件系统中的某个位置,这里将请求映射到静态资源目录  
    alias C:/server/xxx-app/;  
  
    # 默认首页  
    index index.html;  
  
    # 设置静态文件的缓存时间,这里是一天  
    expires 1d;  
  
    # 访问不到资源后的处理 - 单页面应用使用 history 路由防止 404  
    try_files $uri $uri/ /xxx-app/index.html;  
  }  
  
  # 2. 转发 /api 请求  
  location /api {  
    # proxy_pass 指令将请求转发至指定的服务器  
    proxy_pass http://127.0.0.1:18000/api;  
  
    # proxy_set_header 指令设置转发请求的 HTTP 头部  
    proxy_set_header Host $proxy_host;  
    proxy_set_header X-Real-IP $remote_addr;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  }  
}

3. Docker

容器是轻量级、可移植的软件单元,这些软件单元与必需的库和依赖项打包在一起,可以使应用程序在任何地方、任何机器上运行。作为一种更简化的方式,容器可以在多种环境中构建、测试和部署应用程序,从而有效提高了开发运维工作的效率,并在 IT 生态系统之间实现了更高的一致性。

Docker作为一种轻量级的容器化技术,允许开发者将应用及其依赖、运行环境打包成一个可移植的镜像。镜像基于分层存储,每一层代表一组文件系统变更,使得构建、传输和存储更为高效。对于前端应用而言,Dockerfile定义了如何构建镜像,通常包含基础镜像选择、工作目录设置、复制源代码、安装依赖、定义运行命令等指令。例如,一个简单的Vue.js应用Dockerfile可能从Node.js官方镜像开始,安装项目依赖并指定启动命令。镜像名称如明确了镜像的仓库地址、项目名及版本标签,便于管理和分享。

说白了,这个 Docker 镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如:环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

综上所述,Docker 的运行过程,也就是去仓库把镜像拉到本地,然后用执行命令把镜像运行起来变成容器

3.1 Dockerfile

#这是基础镜像,所有的操作都是在这个镜像的基础上进行的。这里选择的是nginx的1.20.1版本,基于alpine操作系统,alpine是一个轻量级的 Linux 发行版,使得整个镜像更加小巧高效
FROM harbor.example.com/baseapp/nginx:1.20.1-alpine-root-strong-v3
#环境变量,设置字符集为 C.UTF-8
ENV LANG C.UTF-8
#环境变量,设置时区为上海
ENV TZ Asia/Shanghai
#设置工作目录,后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令都会在这个目录下执行
WORKDIR /WEB
#复制本地的 dist.tar.gz 文件到容器的 /WEB 目录,并自动解压
#按需修改这一行,海云海星都是打包成dist文件
ADD dist.tar.gz //WEB
#目录重命名
#按需修改这一行,海云的二级路由是govapp,根据项目具体修改
RUN mv /WEB/dist //WEB/XXXX
#声明运行时容器提供服务的端口,这里是默认端口 HTTP(80) 和 HTTPS(443)
EXPOSE 80 443

3.2 构建命令

如镜像名称:/appName/app:dev_1.1_844docker build -t imageName .

使用buildx更高效支持多平台docker buildx build --platform linux/amd64,linux/arm64 -t myapp .

4. Harbor

负责对 Docker 镜像进行管理的,默认是 Docker Registry 服务(类似仓库管理员)。当然,不是任何人建的任何镜像都是合法的。万一有人构建的镜像存在问题呢?所以,Docker Registry 服务对镜像的管理是非常严格的。最常使用的 Registry 公开服务,是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。

Harbor是一个开源的Docker镜像仓库,提供了安全、高效的企业级镜像管理解决方案。它支持镜像的存储、版本控制、权限管理及复制等功能,为Docker镜像的生命周期管理提供了便利。通过与Jenkins集成,镜像构建完成后可直接推送至Harbor,确保了开发团队能访问到最新、安全的镜像版本,同时也便于在多环境间迁移部署,为项目提供快速支持等。

5. Jenkins

Jenkins是一款开源的持续集成/持续部署(CI/CD)工具,旨在自动化软件开发流程中的构建、部署任务。通过Jenkins,开发者可以配置项目,实现代码变更自动触发构建、轮询、及构建部署到指定环境。

前端开发部署流程__前端部署架构

配置Jenkins包括安装必要的插件、创建Job、配置源代码管理(SCM)、构建触发器以及构建后操作(如Docker镜像构建与推送)。Jenkins极大提高了部署效率,确保了部署过程的一致性和可追溯性。

/document_de…

添加node.js的路径到PATH环境变量,确保能访问正确版本的node和npm命令

export PATH=/data/jenkins/node-v18.18.0/bin:\${PATH}

查看当前npm所使用的镜像源npm get registry

设置npm的镜像源为/,这个镜像源一般访问速…npm config set registry

打印npm及node.js的版本,方便在日志中排查问题

npm --version
node --version

5. 构建命令,因项目而异npm run build

执行自定义脚本,部署项目sh \dir\script.sh6. Kubernetes (k8s)

Kubernetes是用于自动化容器化应用部署、扩展和管理的开源平台。它提供了一个高度可扩展的框架,能够跨多个主机集群部署和管理容器化应用,实现资源的高效利用、故障恢复和弹性伸缩。Kubernetes的核心概念包括Pods(最小部署单元)、Services(定义网络访问)、Deployments(管理Pod副本集)等。结合Docker与Harbor,Kubernetes能够根据预设策略自动调度和管理容器,极大地提升了大规模部署的灵活性和可靠性。

单点故障,就是一台物理机突然崩掉,应用还能正常跑热更新,比如要update应用,用户无感知更新。时光回溯,比如上的新版本出问题了,如何回退。负载均衡,在各节点之间任务调度自动扩缩容,比如流量突然增大,如何自动扩容

kubernetes.io/zh-cn/

7. 技术中台

技术中台是一种企业级的技术服务体系,旨在为业务快速迭代提供统一的技术基础设施和服务能力。

它整合了开发、测试、部署、监控等全链路工具,降低了技术栈的复杂度,使开发人员无需关注底层运维细节,专注于业务逻辑的实现。技术中台通过标准化服务接口、组件库、数据平台等,加速了产品创新速度,提高了资源利用率,同时保障了系统的稳定性和安全性。

与上述技术栈结合,技术中台进一步简化了从代码提交到生产环境的流程,实现了真正的DevOps文化,促进了组织内的高效协同。

7.1 应用配置YAML

通过保存定制文件到nfs并挂载到容器,替换项目logo等;

容器 YAML服务 YAMLJob YAML:此 YAML 用于定义 Job,负责创建一或多个 Pod 来运行一次性的任务,例如批处理或定时任务等

各个 YAML 的配合关系:Pod 通过 PVC 使用存储,通过 ConfigMap 和 Secret 获取配置,通过 Service 提供访问接口,而 Job 则用于运行一次性的任务。所有这些都是为了运行和管理用户的应用程序。

7.2 滚动更新(热更新)

Kubernetes的滚动更新(Rolling Update)是一种部署新版本应用的策略,其主要作用是在不中断服务的情况下,逐步替换旧版本的Pod(容器)为新版本。滚动更新在改进应用时提供了一种高效、安全的方式,可以避免服务的中断以及避免一次性替换全部应用带来的风险。

具体过程:

这种更新方式的优点是可以实现零停机时间的部署,而且即使在更新过程中出现问题,也能最小化影响范围,快速回滚到旧版本。此外,Kubernetes还可以通过设置滚动更新策略来控制更新的速度,例如每次更替的Pod数量,以及更新的间隔时间等。这给了开发者很大的灵活性,可以根据应用的特性和业务需求来定制滚动更新的策略。