Jenkins通过Pipeline流水线方式编译前端项目的操作方法

 更新时间:2025年06月24日 08:53:15   作者:神志不清  
本文介绍基于Jenkins LTS镜像搭建前端CI/CD环境,通过Dockerfile安装Node.js/Yarn/zip,结合插件和声明式Pipeline实现SIT/PROD一键部署,包含部署脚本准备及扩展功能建议,感兴趣的朋友一起看看吧

本文记录了本人在前端项目持续集成与自动化部署方面的实践经验,使用 Jenkins 官方 jenkins:lts 镜像为基础,构建支持 Node.js 构建和压缩能力的运行环境,并通过声明式 Pipeline 实现一套多环境(SIT/PROD)可选的一键部署流程。模板可直接参考最下方。

一、Jenkins 镜像构建

为满足构建前端项目的需求,需在 Jenkins 镜像中安装 Node.js、Yarn 以及 zip 命令,构建用 Dockerfile 如下:

FROM jenkins/jenkins:lts
USER root
# 安装 Node.js 和 Yarn
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
    apt-get install -y nodejs zip && \
    npm install -g yarn
# 设置国内 Yarn 源,加速依赖安装
RUN yarn config set registry https://registry.npmmirror.com
USER jenkins

二、Jenkins 插件安装推荐

安装 Jenkins 后,建议安装以下插件以支持流水线、Node 构建和远程部署功能:

  • Git Plugin

  • NodeJS Plugin

  • Yarn Plugin

  • Publish Over SSH

  • Build Name Setter

  • Pipeline

  • Blue Ocean

三、Jenkins 启动配置(docker-compose)

使用 docker-compose 启动 Jenkins,并配置数据持久化与宿主机 Docker 访问能力:

services:
  jenkins:
    image: d0fdd1f559e3  # 自定义镜像 ID
    container_name: jenkins
    restart: on-failure:3
    user: root
    ports:
      - "18080:8080"
      - "50000:50000"
    environment:
      TZ: Asia/Shanghai
      LANG: zh_CN.UTF-8
      LANGUAGE: zh_CN:zh
      LC_ALL: zh_CN.UTF-8
    volumes:
      - ./data:/var/jenkins_home
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro

四、前端自动部署 Pipeline

本流水线支持选择部署环境(SIT 或 PROD),会自动选择对应分支、构建命令与目标服务器,核心流程包括:

  • 拉取指定分支代码

  • 安装依赖

  • 构建打包

  • 压缩构建产物

  • 上传服务器并执行部署脚本

🎯 核心代码片段如下:

parameters {
    choice(name: 'ENVIRONMENT', choices: ['sit', 'prod'], description: '请选择部署环境')
}
environment {
    GIT_URL = 'http://192.168.1.100/xxx.git'
    GIT_CREDENTIAL_ID = '6c626e79-xxxx'
    SIT_BRANCH = 'sit'
    PROD_BRANCH = 'master'
    SIT_SERVER = '192.168.1.50'
    PROD_SERVER = '192.168.1.151'
    DEPLOY_PATH = '/home/web'
    DEPLOY_SCRIPT = 'deploy.sh'
    BUILD_DIR = 'dist'
    ZIP_FILE = 'dist.zip'
}

⚙️ 构建流程关键步骤:

自动切换分支与目标服务器:
env.SELECTED_BRANCH = (params.ENVIRONMENT == 'sit') ? SIT_BRANCH : PROD_BRANCH
env.TARGET_SERVER = (params.ENVIRONMENT == 'sit') ? SIT_SERVER : PROD_SERVER
构建命令根据环境切换:
def buildCmd = (params.ENVIRONMENT == 'sit') ? 'yarn run build:sit' : 'yarn run build:pro'
sh "${buildCmd}"
构建结果压缩:
cd dist && zip -r ../dist.zip .
上传并部署:
sshPublisher(
    configName: "${env.TARGET_SERVER}",
    transfers: [
        sshTransfer(
            sourceFiles: "${ZIP_FILE}",
            remoteDirectory: "${DEPLOY_PATH}",
            execCommand: """
                cd /home/${DEPLOY_PATH}
                bash ${DEPLOY_SCRIPT}
            """
        )
    ]
)

五、部署脚本 deploy.sh(需提前准备)

建议在目标服务器 /home/web 目录中准备 deploy.sh,执行以下内容(可按需定制):这里是简单示例,可以自己修改脚本,添加备份等步骤

#!/bin/bash
unzip -o dist.zip -d ./dist
nginx -s reload   # 若使用 nginx 提供服务

六、Pipeline流水线汇总参考

pipeline {
    agent any
    parameters {
        choice(name: 'ENVIRONMENT', choices: ['sit', 'prod'], description: '请选择部署环境')
    }
    environment {
        GIT_URL = 'http://192.168.1.10/xxx.git'
        GIT_CREDENTIAL_ID = '6c626e79-856c-403e-a07b-96b8a40'
        SIT_BRANCH = 'develop'
        PROD_BRANCH = 'master'
        SIT_SERVER = '192.168.1.150'
        PROD_SERVER = '192.168.1.50'
        DEPLOY_PATH = 'home/web'
        DEPLOY_SCRIPT = 'deploy.sh'
        BUILD_DIR = 'dist'
        ZIP_FILE = 'dist.zip'  // 压缩文件的名称
    }
    stages {
        stage('拉取代码') {
            steps {
                script {
                    env.SELECTED_BRANCH = (params.ENVIRONMENT == 'sit') ? SIT_BRANCH : PROD_BRANCH
                    env.TARGET_SERVER = (params.ENVIRONMENT == 'sit') ? SIT_SERVER : PROD_SERVER
                    echo "当前部署环境:${params.ENVIRONMENT}, 使用分支:${env.SELECTED_BRANCH}, 目标主机:${env.TARGET_SERVER}"
                    checkout([$class: 'GitSCM',
                        branches: [[name: "*/${env.SELECTED_BRANCH}"]],
                        userRemoteConfigs: [[
                            url: "${env.GIT_URL}",
                            credentialsId: "${env.GIT_CREDENTIAL_ID}"
                        ]]
                    ])
                }
            }
        }
        stage('安装依赖') {
            steps {
                sh 'yarn install'
            }
        }
        stage('构建前端') {
            steps {
                script {
                    def buildCmd = (params.ENVIRONMENT == 'sit') ? 'yarn run build:sit' : 'yarn run build:pro'
                    echo "执行构建命令:${buildCmd}"
                    sh "${buildCmd}"
                }
            }
        }
        stage('压缩 dist 目录') {
            steps {
                echo "压缩 dist 目录为 ${env.ZIP_FILE}"
                sh "cd dist && zip -r ../dist.zip ."
            }
        }
stage('部署到前端服务器') {
    steps {
        echo "\033[32m****** 上传并执行部署 ******\033[0m"
        sshPublisher(
            publishers: [
                sshPublisherDesc(
                    configName: "${env.TARGET_SERVER}",  
                    transfers: [
                        // 上传构建产物 dist.zip
                        sshTransfer(
                            sourceFiles: "${ZIP_FILE}",  
                            removePrefix: '',
                            remoteDirectory: "${DEPLOY_PATH}",  // 相对 Jenkins SSH Remote Directory
                            cleanRemote: false,
                            execCommand: """
                                cd /home/${DEPLOY_PATH}
                                bash ${DEPLOY_SCRIPT}
                            """
                        )
                    ],
                    verbose: true
                )
            ]
        )
    }
}
        stage('完成') {
            steps {
                echo "✅ ${params.ENVIRONMENT} 环境部署完成"
            }
        }
    }
    post {
        success {
            echo "🎉 发布成功:${params.ENVIRONMENT} 环境"
        }
        failure {
            echo "❌ 发布失败,请检查日志"
        }
    }
}

后续可进一步集成:

  • 自动通知(钉钉、企业微信)

  • 构建缓存机制

  • 部署灰度策略等

到此这篇关于Jenkins通过Pipeline流水线方式编译前端项目的文章就介绍到这了,更多相关Jenkins Pipeline流水线内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 超好用的免费内网穿透工具【永久免费不限制流量】

    超好用的免费内网穿透工具【永久免费不限制流量】

    对于开发人员来讲,演示内网web站点、本地开发微信公众号、小程序开发、调试第三方支付系统对接等开发环境,往往需要一个环境可以进行调试,市面上内网穿透工具有很多,这里推荐一款简单又好用的cpolar,可以永久免费使用,不限制流量,支持http/https/tcp协议
    2022-09-09
  • 详细介绍 进程、线程和协程的区别

    详细介绍 进程、线程和协程的区别

    这篇文章主要介绍了详细介绍 进程、线程和协程的区别的相关资料,需要的朋友可以参考下
    2017-03-03
  • 关于HTTPS的TSL握手

    关于HTTPS的TSL握手

    这篇文章主要介绍了关于HTTPS的TSL握手,HTTP一般基于TCP协议,而HTTPS就是在这之间加了SSL/TLS协议,那么在TCP三次握手建立TCP连接后,就需要TLS握手建立SSL/TLS连接,需要的朋友可以参考下
    2023-04-04
  • 大数据HelloWorld-Flink实现WordCount

    大数据HelloWorld-Flink实现WordCount

    这篇文章主要介绍了大数据HelloWorld-Flink实现WordCount的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 最新IDEA永久激活教程(支持最新2019.2版本)

    最新IDEA永久激活教程(支持最新2019.2版本)

    这篇文章主要介绍了最新IDEA永久激活教程,此教程已支持最新2019.2版本,适用Windows、Mac、Ubuntu等所有平台,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Grafana window下载安装及influxdb集成配置的实现

    Grafana window下载安装及influxdb集成配置的实现

    本文主要介绍了Grafana window下载安装及influxdb集成配置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • Typora使用方法

    Typora使用方法

    今天用Typora因为升级了一下,所以需要激活虽然勉强能用,但是老是弹出激活页面,很是苦恼,只能通过百度找方法进行解决一下了,下面跟随小编看下Typora使用方法,需要的朋友可以参考下
    2022-04-04
  • Ceph集群CephFS文件存储核心概念及部署使用详解

    Ceph集群CephFS文件存储核心概念及部署使用详解

    这篇文章主要为大家介绍了Ceph集群CephFS文件存储核心概念及部署使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 最新WebStorm2020.2注册码永久激活(激活到2089年)

    最新WebStorm2020.2注册码永久激活(激活到2089年)

    JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。今天给大家带来的是将WebStorm最新版激活至2089年
    2020-09-09
  • 前端工程Monorepo项目管理方式

    前端工程Monorepo项目管理方式

    这篇文章主要介绍了现代前端越来越离不开的项目管理方式Monorepo的概念、MultiRepo的弊端、Monorepo的收益以及Monorepo的落地这几个角度来认识和学习Monorepo
    2022-07-07

最新评论