基于 Docker + Nginx + Gitlab-runner 实现前端自动化部署流程

news2024/11/23 11:12:54

本篇会用到Docker,Gitlab-runner等相关工具,如果对其不是特别了解,可以参考下相关文档:

  • GitLab Runner
  • Docker 快速入门
  • CI/CD:持续集成/持续部署

在早期部署前端项目时,我们通常会通过ftp把前端代码直接传输到指定的物理机上,或者通过ssh登陆到指定的物理机上,然后拉取指定仓库的前端代码在本地经行打包构建,构建完成之后在通过ssh将打包之后的文件上传到ngnix指定的目录下面,这样就算部署成功啦。在实际开发中,通常会基于Docker + Nginx + Gitlab-runner 来实现前端项目的部署。接下来,我们一步一步完整的去实现整个流程:

linux上安装docker

由于过程较为复杂并且也有很多详细的教程这里就不在赘述,安装过程需要注意两点:第一点是要求内核版本不低于 3.10,第二点是启动docker前,一定要关闭防火墙 因为Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!具体安装细节可参考这篇教程:Linux安装Docker完整教程

安装gitlab-runner并注册

一、docker拉取gitlab/gitlab-runner镜像

docker pull gitlab/gitlab-runner:latest

二、创建gitlab-runner容器

docker run -d --name gitlab-runner 
  --restart always 
  -v /var/run/docker.sock:/var/run/docker.sock 
  gitlab/gitlab-runner:latest

三、获取 Registration token

项目主页 -> Sttings -> CI/CD -> Runners Expand

在这里插入图片描述

四、register runner

// 进入runner容器
docker exec -it [runner容器ID] /bin/bash
// 执行注册命令
gitlab-runner register

然后就会有以下自定义选项需要我们手动输入:

  1. Enter the GitLab instance URL (for example, gitlab.com/): https://gitlab.com/
  2. Enter the registration token: xxx
  3. Enter a description for the runner: dev-runner
  4. Enter tags for the runner (comma-separated): dev
  5. Enter optional maintenance note for the runner: dev
  6. Enter an executor: ssh, virtualbox, docker-ssh+machine, instance, parallels, shell, docker-ssh, docker+machine, kubernetes, custom, docker: docker
  7. Enter the default Docker image (for example, ruby:2.7): alpine:latest
  8. 注册成功以后,就会在我们的项目中看到一个正在运行的 runner

在这里插入图片描述

要注意:以下选项默认不会勾选,我们要手动勾选上,否则代码提交以后,CI一直处于pedding状态,不会运行。

在这里插入图片描述

补充配置文件

Gitlab-runner在项目中注册成功以后,我们提交代码就可以自动触发CI/CD啦,当然,还有个前提是需要创建.gitlab-ci.yml用于指定CI/CD的具体工作。同时还需要配置以下几个文件:

nginx

# gzip设置
gzip on;
gzip_vary on;

gzip_comp_level 6;
gzip_buffers 16 8k;

gzip_min_length 1000;
gzip_proxied any;
gzip_disable "msie6";
#gzip_http_version 1.0;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        # 其作用是按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。
        try_files $uri /index.html;
        add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
    }

    location ~ .*\.(js)$ {
        root   /usr/share/nginx/html;
        add_header Cache-Control max-age=2592000;
        if ($request_filename ~* .*\initial.js$) {
            add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
        }
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Dockerfile

FROM nginx:1.17.7-alpine
# MAINTAINER 7up
WORKDIR /usr/share/nginx/html
RUN rm -rf *
ARG BUILD_DIR=./dist
COPY $BUILD_DIR .
# COPY /dist/ /usr/share/nginx/html
COPY /nginx.conf /etc/nginx/conf.d/default.conf
# ADD ./dist/app.tar.gz .
RUN chown -R nginx *

创建.gitlab-ci.yml文件

具体配置可以参考 docs

# 变量
variables:
  IMAGE_NAME: 'front-develops-demo-image:latest'
  CONTAINER_NAME: 'front-develops-demo-container'

# 阶段
stages:
    - build
    - deploy

# 缓存 node_modules 减少打包时间,默认会清除 node_modules 和 dist 
cache:
  key: ${CI_BUILD_REF_NAME}
  paths:
    - node_modules/
    - dist/

# 拉取项目,打包
build:
    image: node:16.20-alpine
    stage: build
    tags:
      - dev
    script:
      - echo "=============== 开始打包任务  ==============="
      - npm config set registry https://registry.npm.taobao.org/
      - npm install -g pnpm
      - pnpm install --no-frozen-lockfile
      - pnpm run build
      - echo "=============== 执行结束 ==================="

#部署
deploy:
  image: docker
  stage: deploy
  tags:
    - dev
  script:
    - echo "=============== 开始部署任务  ==============="
    - docker build --build-arg BUILD_DIR=./dist -t $IMAGE_NAME .
    - if [ "$(docker ps -aq --filter name=$CONTAINER_NAME)" ]; then docker rm -f $CONTAINER_NAME;fi
    - docker run -d -p 9000:80 --name=$CONTAINER_NAME $IMAGE_NAME
    - echo "=============== 执行结束 ==================="

至此,准备工作就已经完成了,然后我们修改一点代码,然后提交到git仓库,此时就会自动触发CI/CD任务。然后流水线执行完成以后,就可以直接访问ip:9000查看前端页面。
这里需要注意几点:

  • 当注册runner时指定了对应的tags则需要在.gitlab.yml里面定义了 tags:- dev才能触发对应的stage执行,否者的话stage会一直处于pending的状态
  • 当注册runner时没有指定了对应的tags但是在.gitlab.yml里面定义了 tags:- dev对应的stage也会一直处于pending的状态
  • 如果都没有指定tag那么stage会在push的时候被执行

merge_request

如果我们想在代码被合并之后触发对应的stage,那么我们就需要在对应的stage使用rules这里字段,具体代码如下:

job:
  script: echo "Hello, Rules!"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: manual
      allow_failure: true

规则部分是一个包含一个条件的规则集合,条件是"$CI_PIPELINE_SOURCE"等于"merge_request_event"。如果条件满足,该规则将触发手动执行作业,并且允许失败(allow_failure: true)。这意味着即使作业执行失败,构建仍将继续进行而不会中断。
在这里插入图片描述
更多详细的配置可以参考这篇文章:【GitLab CI/CD】:条件、分支(rules)

环境管理

我们可以在一个项目里面注册多个 runner 并且通过不同的 tag 来区分不同的环境,然后在.gitlab.yml 里面通过 CI_MERGE_REQUEST_TARGET_BRANCH_NAME 变量来获取合并的目标分支 当我们把代码合并到 dev 就可以触发 tag 为 dev 的那个 runner 也就可以构建 dev 环境的代码,同理当我们把代码合并到 test 就可以触发 tagtest 的那个 runner 也就可以构建 test 环境的代码,这样就可以简单的实现一个多环境部署的方案。具体代码如下:
在这里插入图片描述

# 拉取项目,打包
build:
  image: node:16.20-alpine
  stage: build
  tags:
    - ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
  script:
    - echo ""===============目标分支为: ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} ===============""
    - echo "=============== 开始打包任务  ==============="
    - npm config set registry https://registry.npm.taobao.org/
    - npm install -g pnpm
    - pnpm install --no-frozen-lockfile
    - pnpm run build:${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
    - echo "=============== 执行结束 ==================="
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: on_success
      allow_failure: true

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

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

相关文章

AcWing 239. 奇偶游戏—带边权并查集、带扩展域并查集解法

AcWing 239. 奇偶游戏—带边权并查集、扩展域 问题带边权并查集解法扩展域解法并查集所要掌握的知识技能如下图所示 问题 题目链接: AcWing 239. 奇偶游戏 问题描述 分析 这道题比较有意思,可以由前缀和的思想来解决,[l,r]为偶数,说明[0,l…

CentOS8.5 安装时配置镜像源

CentOS8.5 安装时配置镜像源 阿里云镜像地址 http://mirrors.aliyun.com/centos/8-stream/BaseOS/x86_64/os/ 安装时录入镜像源 点击Done等待… 搞定

day30-Auto Text Effect(自动文本吐字效果)

50 天学习 50 个项目 - HTMLCSS and JavaScript day30-Auto Text Effect&#xff08;自动文本吐字效果&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewpo…

玩转 PI 系列-如何在 Rockchip Arm 开发板上安装 Docker Tailscale K3s Cilium?

概述 618 买了几个便宜的 Purple PI OH 开发板 (500 块多一点买了 3 个&#x1f911;), 这个开发板类似树莓派&#xff0c;是基于 Rockchip&#xff08;瑞芯微&#xff09; 的 rx3566 arm64 芯片。如下&#xff1a; 买来是用作家庭服务器或家庭实验室的。主要考虑就是&#xf…

CTFHub | 过滤目录分隔符

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

订单逆向履约系统的建模与PaaS化落地实践 | 京东云技术团队

导读 本文重点介绍了京东零售电商业务在订单逆向履约上面的最佳技术实践&#xff0c;京东零售快退平台承接了零售几乎所有售前逆向拦截和退款业务&#xff0c;并在长期的业务和技术探索中沉淀了丰富的业务场景设计方案、架构设计经验&#xff0c;既能承接面向消费者C端用户的高…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)

文章目录 一、检测相关(5篇)1.1 TALL: Thumbnail Layout for Deepfake Video Detection1.2 Cloud Detection in Multispectral Satellite Images Using Support Vector Machines With Quantum Kernels1.3 Multimodal Motion Conditioned Diffusion Model for Skeleton-based Vi…

记录--卸下if-else 侠的皮衣!- 策略模式

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 &#x1f92d;当我是if-else侠的时候 &#x1f636;怕出错 给我一个功能&#xff0c;我总是要写很多if-else,虽然能跑&#xff0c;但是维护起来确实很难受&#xff0c;每次都要在一个方法里面增加逻辑…

索引使用——单列索引、联合索引、索引设计原则

1.单例索引和联合索引 尽量使用联合索引&#xff0c;避免使用单列索引&#xff0c;因为使用联合索引性能相对而言会比较高&#xff0c;如果联合索引使用得当&#xff0c;可以避免回表查询&#xff0c;使用单列索引很容易造成回表查询的情况&#xff0c;造成性能降低。 create…

双Bank OTA升级:N32L40X BootLoader (一)

什么是双Bank升级&#xff1a;将Flash划分为以下4个区域。 BootLoader区&#xff1a;程序进行升级的引导程序&#xff0c;根据Upade_Flag来判断程序是跳转Bank1区运行程序或是将Bank2区的程序搬运到Bank1区&#xff0c;然后在运行程序。 Upade_Flag区&#xff1a;判断BootLoa…

OpenCV自带的HAAR级联分类器对脸部(人脸、猫脸等)的检测识别

在计算机视觉领域&#xff0c;检测人脸等是一种很常见且非常重要的应用&#xff0c;我们可以先通过开放计算机视觉库OpenCV来熟悉这个人脸识别领域。另外OpenCV关于颜色的识别&#xff0c;可以查阅&#xff1a;OpenCV的HSV颜色空间在无人车中颜色识别的应用HSV颜色识别的跟踪实…

WAIC2023:图像内容安全黑科技助力可信AI发展

目录 0 写在前面1 AI图像篡改检测2 生成式图像鉴别2.1 主干特征提取通道2.2 注意力模块2.3 纹理增强模块 3 OCR对抗攻击4 助力可信AI向善发展总结 0 写在前面 2023世界人工智能大会(WAIC)已圆满结束&#xff0c;恰逢全球大模型和生成式人工智能蓬勃兴起之时&#xff0c;今年参…

MQTT 与 Kafka|物联网消息与流数据集成实践

MQTT 如何与 Kafka 一起使用&#xff1f; MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议&#xff0c;专为受限网络环境下的设备通信而设计。Apache Kafka 是一个分布式流处理平台&#xff0c;旨在处理大规模的实时数据流。 Kafka 和 MQTT 是实现物…

模拟实现atoi函数

请记住那些对你好的人&#xff0c;因为他们本可以不这么做 文章目录 atoi函数介绍 模拟实现 大家好&#xff0c;我是纪宁。 atoi函数&#xff0c;它的功能是将数字字符转化为数字。我第一次见这个函数还是在大一上在刷蓝桥杯的时候&#xff0c;有一个关于回文数字的题&#x…

08.计算机网络——其他重要协议和技术

文章目录 DNSICMPNAT代理服务器 DNS DNS是一整套从域名映射到IP的系统 ​ TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是IP地址不方便记忆&#xff0c;于是人们发明域名&#xff0c;其本质是一个字符串&#xff0c;映射了它和IP地址的关系。 …

融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES)-附代码

融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES) 文章目录 融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES)1.秃鹰优化算法2.改进秃鹰优化算法2.1 基于纵横交叉策略2.2 基于惯性权重的位置更新2.3 黄金正弦捕食机制 3.实验结果4.参考文献5.Matlab代码6.python代码…

FreeRTOS-列表和列表项

列表和列表项&#xff1a; 列表是FreeRTOS中的一个数据结构&#xff0c;用来跟踪FreeRTOS中的任务。 列表项就是存放在列表中的项目&#xff0c;属于列表的子集。 列表就相当于一个链表&#xff0c;列表项就相当于节点&#xff0c;在FreeRTOS中的列表是一个双向的环形链表。 …

基于FPGA的视频接口之PAL(NTSC)编码

简介 PAL又称帕尔制&#xff0c;是咱们中国早期视频所是使用的视频广播模式&#xff0c;基本上现在的电视都兼容这种视频模式&#xff0c;使用的接口也是传统的BNC插头&#xff0c;有兴趣的伙伴可以看看电视屁股后面是不是有一个单独的BNC接口&#xff0c;百分之98就是支持PAL格…

FastReport.Net FastReport.Core 2023.2.23 Crack

FastReport.Net & FastReport.Core 2023.2.23适用于 .NET 7、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可用于 Microsoft Visual Studio 2022 和 JetBrains Rider。 利用数据呈现领域专家针对 .NET 7、.NET Core、Blazor、ASP.NET、MVC、Windo…

【Windows】cmd和powershell命令合集

文章目录 1 前言2 一些规则3 cmd命令合集4 bat语法学习5 powershell命令合集6 powershell语法学习 1 前言 在日常使用过程中&#xff0c;总是会遇到不记得或无法区分cmd命令和powershell命令的情况&#xff0c;因为在Windows的工作大部分都是可视化的鼠标点击&#xff0c;用到命…