在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.rhkb.cn/news/342417.html

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

相关文章

Windows11下Docker使用记录(五)

目录 准备1. WSL安装cuda container toolkit2. win11 Docker Desktop 设置3. WSL创建docker container并连接cuda4. container安装miniconda(可选) Docker容器可以从底层虚拟化,使我们能够在 不降级 CUDA驱动程序的情况下使用 任何版本的CU…

支付宝小众玩法 爱溜达的人不容错过

创建一个简单的程序来帮助用户管理他们的图片,例如筛选分辨率合适、尺寸适中的图片来准备上传,这是一个技术上合理且有益的方向。例如,一个Python脚本使用Pillow库来检查文件夹中图片的尺寸: from PIL import Image import os# 根…

可视化数据科学平台在信贷领域应用系列五:零代码可视化建模

信贷风控模型是金融机构风险管理的核心工具,在信贷风险管理工作中扮演着至关重要的角色。随着信贷市场的环境不断变化,信贷业务的风险日趋复杂化和隐蔽化,开发和应用准确高效的信贷风控模型显得尤为重要。信贷风险控制面临着越来越大的挑战和…

【MySQL数据库】:MySQL内外连接

目录 内外连接和多表查询的区别 内连接 外连接 左外连接 右外连接 简单案例 内外连接和多表查询的区别 在 MySQL 中,内连接是多表查询的一种方式,但多表查询包含的范围更广泛。外连接也是多表查询的一种具体形式,而多表查询是一个更…

React-生成随机数和日期格式化

生成随机数 uuid文档:https://github.com/uuidjs/uuid npm install uuid import {v4 as uuidV4} from uuid 使用: uuidV4() 日期格式化 dayjs文档:安装 | Day.js中文网 npm install dayjs import dayjs from dayjs

LCTF 2018 bestphp‘s revenge

考点:Soap原生类Session反序列化CRLF注入 <?php highlight_file(__FILE__); $b implode; call_user_func($_GET[f], $_POST); session_start(); if (isset($_GET[name])) { $_SESSION[name] $_GET[name]; } var_dump($_SESSION); $a array(reset($_…

MySQL学习——选项文件的使用

MySQL 的许多程序都可以从选项文件&#xff08;有时也被称为配置文件&#xff09;中读取启动选项。选项文件提供了一种方便的方式来指定常用的选项&#xff0c;这样你就不必每次运行程序时都在命令行上输入这些选项。 要确定一个程序是否读取选项文件&#xff0c;你可以使用 -…

vim编辑器的使用

vim编辑器 1 vim编辑器三种常见模式2 命令模式2.1 移动光标的操作2.2 对数据操作2.3 查找函数 3 底行模式3.1 不退出vim进行操作3.2 与文件进行对比 4 vim的补充知识4.1 vim的批量化注释4.2 vim窗口的非正常关闭 5 vim的配置6 配置sudoer文件 1 vim编辑器三种常见模式 我们在编…

AMD显卡和英伟达显卡哪个好?

显卡是计算机中负责处理图形和视频输出的硬件设备&#xff0c;主要分为两种类型&#xff1a;AMD的A卡和NVIDIA的N卡。那么AMD显卡和英伟达显卡哪个好&#xff1f;怎么选&#xff1f; 答&#xff1a;不能一概而论地说哪个好&#xff0c;因为它们各有优势&#xff0c;选择应基于…

【Python报错】已解决ModuleNotFoundError: No module named ‘packaging’

成功解决“ModuleNotFoundError: No module named ‘packaging’”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No module named packaging这样的错误&#xff0c;通常意味着你的Python环境中缺少名为packaging的模块&#xff0c;或者该模块没有被正确…

Docker笔记-解决非交互式运行python时print不输出的问题

换句话来说就是在docker中如何不会python的print 只需要在启动时&#xff0c;不让python缓冲其输出。 关键命令如下&#xff1a;PYTHONUNBUFFERED1 如下&#xff1a; docker run -e PYTHONUNBUFFERED1 <your_image> 下面解释下-e "-e"选项的全称是"…

DDMA信号处理以及数据处理的流程---DDMA原理介绍

Hello&#xff0c;大家好&#xff0c;我是Xiaojie&#xff0c;好久不见&#xff0c;欢迎大家能够和Xiaojie一起学习毫米波雷达知识&#xff0c;Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程&#xff0c;本系列文章将从目标生成、信号仿真、测距、测速、cfar…

IT学习笔记--Flink

概况&#xff1a; Flink 是 Apache 基金会旗下的一个开源大数据处理框架。目前&#xff0c;Flink 已经成为各大公司大数据实时处理的发力重点&#xff0c;特别是国内以阿里为代表的一众互联网大厂都在全力投入&#xff0c;为 Flink 社区贡献了大量源码。 Apache Flink 是一个…

微信小程序uniapp的父子之间的通信传递

1.父传递给子信息 my-test是子组件 demo是父组件 这是定义在父组件中的的info信息 要将这个传递给子组件 子组件在properties 中接收父组件传递来的数据 msg type 是类型 value是默认值&#xff0c;当父组件没有传递数据时&#xff0c;就会默认使用value的数据 子组件…

JavaScript html css前端 日期对象 date对象 日期格式化 时间戳

日期对象 Date对象 Date 对象和 Math 对象不一样&#xff0c;他是一个构造函数&#xff0c;所以我们需要实例化后才能使用 Date 实例用来处理日期和时间 Date()使用方法 示例&#xff1a;获取当前时间 let now new Date() console.log(now) 示例&#xff1a;获取指定时间…

LabVIEW液压伺服压力机控制系统与控制频率选择

液压伺服压力机的控制频率是一个重要的参数&#xff0c;它直接影响系统的响应速度、稳定性和控制精度。具体选择的控制频率取决于多种因素&#xff0c;包括系统的动态特性、控制目标、硬件性能以及应用场景。以下是一些常见的指导原则和考量因素&#xff1a; 常见的控制频率范…

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题 查看python语言服务器的日志&#xff0c;确定问题。 我的问题是加载的vscode 目录下存在一个很大的数据集目录&#xff0c;导致无法正常工作。 解决办法&#xff1a; 在vscode的pylance设置中&#xff0c;排除对应的目…

【WP】猿人学_13_入门级cookie

https://match.yuanrenxue.cn/match/13 抓包分析 抓包分析发现加密参数是cookie中有一个yuanrenxue_cookie 当cookie过期的时候&#xff0c;就会重新给match/13发包&#xff0c;这个包返回一段js代码&#xff0c;应该是生成cookie的 <script>document.cookie(y)(u)(a…

组装服务器重装linux系统【idrac集成戴尔远程控制卡】

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

亮数据代理IP助力高效数据采集

文章目录 &#x1f4d1;前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤&#xff1a; 五、数据集5.1 免费样本5.2 定制数据集 &#x1f324;️个人小结 &#x1f…