在Jenkins 中使用 NVM 管理 Node.js 部署项目的自动化脚本

在Jenkins 中使用 NVM 管理 Node.js 部署项目的自动化脚本

在这里插入图片描述

人生旅途,总有人不断地走来,有人不断地离去。当新名字变成老名字,当老的名字渐渐模糊,又是一个故事的结束和另一个故事的开始。

在现代软件开发中,持续集成/持续部署(CI/CD)是提高开发效率和软件质量的重要实践。本文介绍了如何通过一个Bash脚本,在Jenkins中使用NVM(Node Version Manager)管理Node.js版本,并实现Node.js项目的自动化构建和部署。

脚本功能概述

这个脚本的主要功能包括:

  1. 设置环境变量
  2. 加载 NVM 并使用指定的 Node.js 版本
  3. 进入 Jenkins 工作目录并安装 Yarn
  4. 安装项目依赖
  5. 运行构建脚本
  6. 备份现有部署包
  7. 复制新的部署包到目标目录

脚本内容详解

以下是脚本的具体内容和逐步解释:

#!/bin/bash
BUILD_ID=DONTKILLME
# 设置必要的环境变量
NODE_VERSION="17.0.0"
NVM_DIR="/usr/local/src/nvm/nvm-0.39.7"
WORKSPACE_DIR="/home/jenkins/jenkins_home/workspace/lowcode-web"
current_datetime=$(date +%Y-%m-%d_%H-%M-%S)
# Paths
dist_test_path="/home/lowcode-platform/lowcode-web/dist-test"
backup_path="/home/lowcode-platform/lowcode-web/dist-test_$current_datetime"
jenkins_dist_test_path="/home/jenkins/jenkins_home/workspace/lowcode-web/dist-test"
# 确保脚本在任何错误时停止执行
set -e# 加载 NVM (Node Version Manager)
if [ -s "$NVM_DIR/nvm.sh" ]; then. "$NVM_DIR/nvm.sh"
elseecho "NVM 未安装或路径不正确"exit 1
fi# 使用指定的 Node.js 版本
nvm install $NODE_VERSION
nvm use $NODE_VERSION# 进入工作目录
cd $WORKSPACE_DIR# 安装 Yarn
npm install yarn -g
# 忽略引擎检查
yarn config set ignore-engines true
# 安装项目依赖
yarn install
# 运行构建脚本
npm run build:test# 部署包
# 备份原来的包
if [ -d "$dist_test_path" ]; thenmv "$dist_test_path" "$backup_path"echo "Moved existing dist-test to $backup_path"
elseecho "No existing dist-test directory found, skipping move"
fi# 覆盖新的包
if [ -d "$jenkins_dist_test_path" ]; thencp -r "$jenkins_dist_test_path" "$dist_test_path"echo "Copied new dist-test from Jenkins workspace to $dist_test_path"
elseecho "Jenkins dist-test directory not found at $jenkins_dist_test_path"exit 1
fi# 打印构建成功的消息
echo "Build successful!"
脚本步骤详解
  1. 设置环境变量

    NODE_VERSION="17.0.0"
    NVM_DIR="/usr/local/src/nvm/nvm-0.39.7"
    WORKSPACE_DIR="/home/jenkins/jenkins_home/workspace/lowcode-web"
    current_datetime=$(date +%Y-%m-%d_%H-%M-%S)
    
    • NODE_VERSION:指定要使用的Node.js版本。
    • NVM_DIR:NVM的安装路径。
    • WORKSPACE_DIR:Jenkins的工作目录路径。
    • current_datetime:当前日期和时间,格式为YYYY-MM-DD_HH-MM-SS,用于备份目录命名。
  2. 定义路径

    dist_test_path="/home/lowcode-platform/lowcode-web/dist-test"
    backup_path="/home/lowcode-platform/lowcode-web/dist-test_$current_datetime"
    jenkins_dist_test_path="/home/jenkins/jenkins_home/workspace/lowcode-web/dist-test"
    
    • dist_test_path:目标部署目录的路径。
    • backup_path:备份目录的路径,带有当前日期和时间。
    • jenkins_dist_test_path:Jenkins工作空间中构建生成的目录路径。
  3. 确保脚本在任何错误时停止执行

    set -e
    

    启用此选项后,如果脚本中的任何命令失败(返回非零状态),脚本将立即退出。

  4. 加载 NVM

    if [ -s "$NVM_DIR/nvm.sh" ]; then. "$NVM_DIR/nvm.sh"
    elseecho "NVM 未安装或路径不正确"exit 1
    fi
    
    • 检查NVM的shell脚本是否存在并可读。
    • 如果存在,使用source命令加载NVM。
    • 如果不存在,输出错误信息并退出脚本。
  5. 使用指定的 Node.js 版本

    nvm install $NODE_VERSION
    nvm use $NODE_VERSION
    
    • 安装指定版本的Node.js。
    • 使用指定版本的Node.js。
  6. 进入工作目录并安装 Yarn

    cd $WORKSPACE_DIR
    npm install yarn -g
    yarn config set ignore-engines true
    
    • 进入Jenkins的工作目录。
    • 全局安装Yarn包管理器。
    • 配置Yarn忽略引擎检查(即使项目要求的Node.js版本与当前版本不一致,也不报错)。
  7. 安装项目依赖

    yarn install
    

    使用Yarn安装项目的所有依赖包。

  8. 运行构建脚本

    npm run build:test
    

    运行项目的构建脚本,生成测试环境的构建文件。

  9. 备份原来的包

    if [ -d "$dist_test_path" ]; thenmv "$dist_test_path" "$backup_path"echo "Moved existing dist-test to $backup_path"
    elseecho "No existing dist-test directory found, skipping move"
    fi
    
    • 检查目标部署目录是否存在。
    • 如果存在,将其移动到备份目录,并打印备份成功的消息。
    • 如果不存在,打印提示信息,跳过移动步骤。
  10. 复制新的包到目标目录

    if [ -d "$jenkins_dist_test_path" ]; thencp -r "$jenkins_dist_test_path" "$dist_test_path"echo "Copied new dist-test from Jenkins workspace to $dist_test_path"
    elseecho "Jenkins dist-test directory not found at $jenkins_dist_test_path"exit 1
    fi
    
    • 检查Jenkins工作空间中的构建目录是否存在。
    • 如果存在,将其复制到目标部署目录,并打印复制成功的消息。
    • 如果不存在,打印错误信息并退出脚本。
  11. 打印构建成功的消息

    echo "Build successful!"
    

    构建完成后,打印成功消息。

总结

该脚本通过以下步骤实现了Node.js项目的自动化构建和部署:

  1. 设置和加载环境变量
  2. 使用NVM管理Node.js版本,确保使用指定的Node.js版本
  3. 安装项目依赖并运行构建脚本
  4. 备份现有的部署目录,确保可以在出错时回滚
  5. 复制新的构建文件到目标部署目录
  6. 打印构建成功的消息,方便追踪构建状态

通过使用这个脚本,您可以在Jenkins中实现一个稳定、高效的自动化构建和部署流程。

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

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

相关文章

容器化实践:DevOps环境下的容器交付流程

DevOps的兴起是为了应对市场和消费者对技术应用的不断增长的需求。它的目标是构建一个更快的开发环境,同时保持软件的高质量标准。DevOps还致力于在敏捷开发周期中提升软件的整体品质。这一目标的实现依赖于多种技术、平台和工具的综合运用。 结合容器化技术与DevO…

深入理解mysql中的各种超时属性

1. 前言 connectTimeout: 连接超时 loginTimeout: 登录超时 socketTimeout: Socket网络超时,即读超时 queryTimeout: sql执行超时 transactionTimeout:spring事务超时 innodb_lock_wait_timeout:innodb锁等待超时 wait_timeout:非交互式连接关闭前的等待时间 inter…

uniapp小程序多线程 Worker 实战【2024】

需求 最近遇到个小程序异步解码的需求,采用了WebAssembly,涉及大量的计算。由于小程序的双线程模型只有一个线程处理数据,因此智能寻求其它的解决方案。查看小程序的文档,发现小程序还提供一个异步线程的Worker方案,可…

联想Y410P跑大模型

安装vs 2017 查看GPU版本 查看支持哪个版本的cuda windows cuda更新教程_cuda 12.0-CSDN博客 下载并安装cuda tookit 10.1 CUDA Toolkit 10.1 Update 2 Archive | NVIDIA Developer 找到下载的文件,安装 参考安装链接 Win10 Vs2017 CUDA10.1安装(避坑…

InnoDB存储引擎非常重要的一个机制--MVCC(多版本并发控制)

Mysql是如何实现隔离性的?(锁MVCC) 隔离性是指一个事务内部的操作以及操作的数据对正在进行的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。隔离性可以防止多个事务并发执行时,可能存在交叉执行导致数据的不…

安全U盘和普通U盘有什么区别?

安全U盘(也称为加密U盘或安全闪存驱动器)与普通U盘肯定是有一些区别的,从字面意思上来看,就能看出,安全U盘是能够保护文件数据安全性的,普通U盘没这一些功能的,可随意拷贝文件,不防盗…

面试4:c++(数位物联)

1.const 关健字的作用 定义常量,防止变量被意外修改,增强程序的可读性和维护性。 可以用于指针,声明指向常量的指针或常量指针。 2.static关健字的作用 (1)在函数内,用于修饰局部变量,使其生命周期延长到整个程序运行期…

一文了解UVLED线光源的应用

在机器视觉系统中,光源作为不可或缺的一部分,能够提高目标成像效果,增强检测效果。光源的选择至关重要,选到不合适的会影响成像及检测效果。针对不同的检测对象,不同的形状光源应运而生。我们来看看最UVLED线光源。 下面以CCS的光…

zoomeye api报错 request invalid, validate usage and try again

项目场景: 调用zoomeye的api接口进行数据拿取 问题描述 之前接口一直通着今天突然报错,以下为源代码 pip install zoomeye from zoomeye.sdk import ZoomEye zm ZoomEye(api_key"34A8B452-D874-C63E0-8471-F3D4f89766f") zm.dork_search(a…

图片像素缩放,支持个性化自定义与精准比例调整,让图像处理更轻松便捷!

图片已经成为我们生活中不可或缺的一部分。无论是社交媒体的分享,还是工作文档的编辑,图片都扮演着至关重要的角色。然而,你是否曾经遇到过这样的问题:一张高清大图在上传时却受限于平台的大小要求,或者一张小图需要放…

tkinter+火山引擎+python实现语音识别聊天机器人

想要做一款能通过语音识别来聊天的智能机器人,首先需要能通过麦克风录制语音进行识别转换成文字,将文字发送给机器人得到聊天结果,并能将返回的文字转换成语音进行合成,之后再通过本地播放语音实现语音交互。 架构: 实现步骤 一、本地录音 本地录音可以通过pyAudio库实…

2024-06-05-记一次cnvd渗透

前言:挖src挖郁闷了,闲来无事选择挖一个cnvd来练练手,本次的漏洞都没啥难度,企查查资产过了5000万 说一下cnvd证书的下放标准 对于中危及中危以上通用型漏洞(CVSS2.0基准评分超过4.0分),以及涉…

红酒:红酒保存中的光照与避免阳光直射

在红酒保存中,光照是一个常常被忽视的因素。光照对红酒的影响是不可小觑的,因为阳光中的紫外线会加速红酒的氧化,导致其口感和品质的下降。因此,在保存云仓酒庄雷盛红酒时,应特别注意避免阳光直射。 阳光直射对红酒的影…

企业代码签名证书1300元

随着手机和电脑等设备的普及,越来越多的开发者进入软件行业,为了软件的安全性、完整性和可信度,开发者往往会使用由正规CA认证机构颁发的代码签名证书对软件代码进行数字签名,来标识软件的来源和软件开发者的真实身份。今天就随SS…

博物馆文物库房管理软件

博物馆作为文化遗产的守护者和传承者,承载着人类智慧与文明的结晶。在博物馆的背后,一个庞大而严密的管理系统支撑着文物的保护与展示。而其中,文物库房管理软件的使用,无疑是一项重要的管理工具。 文物库房管理软件的功能具有多样…

【CentOS 7】挑战探索:在CentOS 7上实现Python 3.9的完美部署指南

【CentOS 7】挑战探索:在CentOS 7上实现Python 3.9的完美部署指南 大家好 我是寸铁👊 总结了一篇【CentOS 7】挑战探索:在CentOS 7上实现Python 3.9的完美部署指南详细步骤✨ 喜欢的小伙伴可以点点关注 💝 前言 此篇教程只适用于p…

【Mybatis】源码分析-高级应用

1、Mybatis配置文件深入理解 1.2、动态SQL语句 Mybatis 的映射⽂件中,前⾯我们的 SQL 都是⽐较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前⾯的学习中我们的 SQL 就不能满⾜要求了。 1.2.1、条件判断 我们根…

技巧:合并ZIP分卷压缩包

如果ZIP压缩文件文件体积过大,大家可能会选择“分卷压缩”来压缩ZIP文件,那么,如何合并zip分卷压缩包呢?今天我们分享两个ZIP分卷压缩包合并的方法给大家。 方法一: 我们可以将分卷压缩包,通过解压的方式…

E10:系统弹窗提示

效果– window.WeFormSDK.showMessage("这是一个E10的提示", 3, 2); const onClickCreate () > console.log("create"); const onClickSave () > console.log("save"); const onClickCancel () > dialogComponent?.destroy(); co…

Java四舍五入保留小数

这里介绍两种方法: package Book.jj.hh;import java.text.DecimalFormat; //使用DecimalFormat类 public class Demo1 {public static void main(String[] args) {double num 123.52631;DecimalFormat a new DecimalFormat("#.00"); //小数点后有几个0…