• Jenkinsfile+Dockerfile前端vue自动化部署


    前言

    本篇主要介绍如何自动化部署前端vue项目

    其中,有两种方案:

    1. 第一种是利用nginx进行静态资源转发;
    2. 第二种方案是利用nodejs进行启动访问;

    各个组件版本如下:

    1. Docker 最新版本;
    2. Jenkins 2.387.3
    3. nginx 最新版本
    4. nodejs 12.13.0

    nginx转发部署

    目录结构如下:

    在这里插入图片描述

    nginx.conf

    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        # include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80;
            server_name  localhost; # 服务器地址或绑定域名
    
            #charset koi8-r;
            #access_log  /var/log/nginx/host.access.log  main;
    
            # =========================================================
            # ================== ↓↓↓↓↓↓ start ↓↓↓↓↓↓ ==================
            # =========================================================
    
            location / {
                root   /usr/share/nginx/html;
                #try_files $uri $uri/ @router;
                index  index.html index.htm;
                try_files $uri $uri/ /index.html; # 解决页面刷新 404 问题
                #proxy_pass http://zhengqingya.gitee.io; # 代理的ip地址和端口号
                #proxy_connect_timeout 600; #代理的连接超时时间(单位:毫秒)
                #proxy_read_timeout 600; #代理的读取资源超时时间(单位:毫秒)
            }
    
            # =========================================================
            # ================== ↑↑↑↑↑↑ end ↑↑↑↑↑↑ ==================
            # =========================================================
    
            #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;
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    Dockerfile

    FROM nginx:latest
    # docker 传参数据
    ARG ACTIVE
    
    # 将dist文件中的内容复制到 `/usr/share/nginx/html/` 这个目录下面
    ADD /dist  /usr/share/nginx/html
    # 用本地配置文件来替换nginx镜像里的默认配置
    ADD nginx/nginx-${ACTIVE}.conf /etc/nginx/nginx.conf
    
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    如果不想在jenkinsfile中运行npm相关命令,而在dockerfile中运行,Dockerfile如下:

    FROM node:12.13.0 as build-stage
    WORKDIR /app
    COPY . .
    RUN npm install
    RUN npm run build
    
    FROM nginx:latest AS prod-stage
    COPY --from=build-stage /app/dist /usr/share/nginx/html  
    EXPOSE 80  
    CMD ["nginx", "-g", "daemon off;"]  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    JENKINSFILE

    pipeline {
        agent any
        environment {
            NAME = 'bst-web'
            PROFILE = 'dev'
            APP = 'xxxx/bst-web:dev'
            APP_PORT = 80
        }
    
        stages {
            stage('下载代码') {
                steps {
                    echo '****************************** download code start... ******************************'
                    git branch: 'dev', credentialsId: 'xxxxxxxxxxxxxxxxx', url: 'xxxxxx.git'
                }
            }
    
            stage('vue环境准备') {
                steps {
                    echo '****************************** vue start... ******************************'
                    sh "npm install && npm run build"
                }
            }
    
            stage('构建Docker镜像') {
                steps {
                    echo '****************************** delete container and image... ******************************'
                    sh 'docker ps -a|grep $NAME|awk \'{print $1}\'|xargs -i docker stop {}|xargs -i docker rm {}'
                    sh 'docker images|grep $NAME|grep dev|awk \'{print $3}\'|xargs -i docker rmi {}'
    
                    echo '****************************** build image... ******************************'
                    sh 'docker build --build-arg ACTOVE=dev -t $APP .'
                }
            }
    
            stage('运行容器') {
                steps {
                    echo '****************************** run start... ******************************'
                    sh 'docker run -d -p $APP_PORT:80 --restart=always --name $NAME $APP'
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    nodeJs部署

    Dockerfile

    FROM node:12.13.0
    WORKDIR /app
    COPY . .
    RUN npm install
    RUN npm run build
    
    EXPOSE 8080  
    CMD [ "npm", "run", "serve" ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Jenkinsfile

    pipeline {
        agent any
        environment {
            NAME = 'bst-web'
            PROFILE = 'dev'
            APP = 'xxxx/bst-web:dev'
            APP_PORT = 80
        }
    
        stages {
            stage('下载代码') {
                steps {
                    echo '****************************** download code start... ******************************'
                    git branch: 'dev', credentialsId: 'xxxxxxxxxxxxxxxxx', url: 'xxxxxx.git'
                }
            }
    
            stage('构建Docker镜像') {
                steps {
                    echo '****************************** delete container and image... ******************************'
                    sh 'docker ps -a|grep $NAME|awk \'{print $1}\'|xargs -i docker stop {}|xargs -i docker rm {}'
                    sh 'docker images|grep $NAME|grep dev|awk \'{print $3}\'|xargs -i docker rmi {}'
    
                    echo '****************************** build image... ******************************'
                    sh 'docker build --build-arg ACTOVE=dev -t $APP .'
                }
            }
    
            stage('运行容器') {
                steps {
                    echo '****************************** run start... ******************************'
                    sh 'docker run -d -p $APP_PORT:80 --restart=always --name $NAME $APP'
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    vue.config.js

    module.exports = {
    	devServer: {
    		// 跳过host检查
       	 	historyApiFallback: true,
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    具体版本不一样,或者添加

    module.exports = {
        // 跳过检查host
        devServer: { disableHostCheck: true }
    }
    
    • 1
    • 2
    • 3
    • 4

    如果不添加此处内容的话,访问会报错 Invalid Host header

  • 相关阅读:
    我的idea安装的几个插件
    React-Admin后台管理模板|react18+arco+zustand后台解决方案
    DPDK-A1:Centos配置MLX5驱动
    Spring Boot集成SpringFox 3.0与Pageable参数处理
    程序员的不惑之年:失业与恐惧
    halcon NCC匹配算法
    10分钟了解BIM+GIS融合,常见BIM数据格式及特性
    华为od德科面试数据算法解析 2022-7-1 补种未成活胡杨
    Baklib知识分享|文档生命周期:确保您的文档产出效率
    深度学习应用篇-元学习[15]:基于度量的元学习:SNAIL、RN、PN、MN
  • 原文地址:https://blog.csdn.net/zz18435842675/article/details/134449196