场景
Docker+Jenkins+Pipline实现Vue项目input选择不同差异性config文件并修改文件内容后打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩包):
上面实现打包Vue项目并选择不同的差异性js文件并修改配置js文件中的version时间戳内容,并将其打包成tar.gz包的过程。
如果使用场景中不需要jenkins,只需要在本机windows电脑上实现git拉取代码-npm打包dist包-扫描diff目录下不同config.js配置文件选项
并根据交互输入的选项实现复制对应的js文件并修改config.js文件中时间戳内容-打包成tar.gz包的过程。
关于使用bat打包后台maven包的过程实现可参考如下
Bat中实现git和Maven环境变量检测,拉取git代码并打包maven项目,读取子目录差异性yml文件配置并根据选择项调用7zip打包成tar.gz包(获取时间戳截取命名)
注:
实现
1、注意这里的项目目录
git仓库下的ruoyi-ui为前端代码目录,在前端目录下新建diff目录,目录中新建各种差异化配置文件
并且在前端代码目录下新建此bat脚本文件
其中差异化文件的内容为
module.exports = {
titleName: '本地测试系统',
version: '202406181345',
};
其中需要再打包时更改其version字段,获取打包时的时间戳。
2、新建buildFont.bat新设置中文编码,设置setlocal
@echo off
::设置中文编码
chcp 65001
echo --------------------------------------------------------------------
echo '1、在前端代码所在根目录下执行bat'
echo '2、确保已经配置git环境变量(git拉取代码时需要),并确保拉取代码无冲突或再新建目录用来专门打包'
echo '3、确保已经配置node环境变量(npm打包时需要)'
echo '4、确保已经配置7zip环境变量(打包成tar.gz包时需要)'
echo '5、注意此bat不要使用IDEA工具进行编辑保存和提交,可使用记事本、notepad++等工具'
echo '6、回车继续执行'
pause
::setlocal和endlocal命令执行结果是让中间的程序对于系统变量的改变只在程序内起作用,不会影响整个系统级别。
setlocal enabledelayedexpansion
endlocal
pause
以上用来输出自定义的提示内容。
这里需要注意,BAT脚本文件如果在IDEA工具中进行编辑后,可能会因为保存时的编码格式不同等导致bat脚本文件运行报错。
所以这里在编辑BAT的内容时使用记事本或者notepad++等工具。
BAT中实现git安装、环境变量检测以及node安装和环境变量检测
bat中新增如下内容:
for /f "delims=" %%I in ('git --version') do set GIT_EXECUTABLE=%%I
:: 如果GIT_EXECUTABLE不为空,则Git已在PATH中
if not defined GIT_EXECUTABLE (
echo 'Git未安装或环境变量未配置'
echo --------------------------------------------------------------------
pause
goto :eof
)
echo Git已配置环境变量
echo --------------------------------------------------------------------
git --version
echo --------------------------------------------------------------------
echo 拉取代码执行git pull 开始
:: 执行Git命令,例如:git pull
cd ../
call git pull
echo 拉取代码执行git pull 结束
echo --------------------------------------------------------------------
::node环境变量验证
where node >nul 2>nul
if %errorlevel% neq 0 (
echo Node.js 环境变量未配置。
pause
goto :eof
)
:: 输出node版本信息
echo Node.js 环境变量已配置。
node --version
运行bat测试效果
如果未配置git则会提示
BAT中实现扫描目录下所有子目录的名称并添加序号存储,并根据交互输入的序号获取对应的子目录名称
为了能打包时手动选择使用哪个目录下的差异性文件,需要扫描diff目录下所有子目录的名称,并添加序号,然后提示输入序号,从而获取到对应序号的
差异性文件的目录,进行打包前的配置文件复制和修改操作
bat中新增如下内容
::进入diff目录下
cd ruoyi-ui
cd diff
:: 初始化变量
set /a dir_index=0
for /d %%i in (*) do (
:: 输出序号和子目录名称
echo !dir_index!-%%i
set "dir_names[!dir_index!]=%%i"
:: 每次循环时将计数器增加1。
set /a dir_index+=1
)
:foundIndex
set /p UserInput=请输入差异化文件前的索引数字:
:: 检查索引是否存在
if defined dir_names[%UserInput%] (
echo 选择的差异性文件为: !dir_names[%UserInput%]!
::获取选择的差异性文件目录名称
set "difName=!dir_names[%UserInput%]!"
echo !difName!
) else (
echo 输入的索引数字不存在或格式不正确!!!
goto foundIndex
)
上面脚本将所有子目录存储dir_names数组中,并且将递增的变量作为数组索引。
测试交互输入选择效果
BAT中实现判断文件夹是否存在,存在则删除并将指定目录下所有文件复制到另一个目录下
下面需要判断上一次打包的dist目录是否存在,如果存在则将其删除,然后将上面选择差异性文件目录下的所有内容复制到指定目录下
::回到上级目录
cd ../
SET "DIST_DIR=./dist"
IF EXIST "%DIST_DIR%" (
RMDIR /S /Q "%DIST_DIR%"
IF ERRORLEVEL 1 (
ECHO Failed to delete directory "%DIST_DIR%"
pause
goto :eof
)
)
::复制差异文件
xcopy "./diff/!difName!" "./public" /R /Y /E /I
ping 127.0.0.1 -n 5
为了确保复制完成,这里加了一个延迟操作
复制文件的选项的含义
REM /E 复制目录和子目录,包括空的。
REM
REM /I 如果目标不存在,且复制的是多个文件,则将目录创建为目录。
REM
REM /C 即使出现错误,也会继续复制。
REM
REM /H 复制隐藏和系统文件。
REM
REM /R 复制文件和目录时,设置所有的权限。
REM
REM /Y 覆盖现有的文件而无需提示
BAT中实现获取当前日期时间戳并按照指定格式截取长度
::获取时间戳
echo date=%date%
set yyyy=%date:~3,4%
set mm=%date:~8,2%
set day=%date:~11,2%
set yyyymmdd=%yyyy%%mm%%day%
rem 把年月日串中的空格替换为0
set yyyymmdd=%YYYYmmdd: =%
echo time=%time%
set hh=%time:~0,2%
::获取分
set mi=%time:~3,2%
::获取秒
::set ss=%time:~6,2%
set timestamp=%yyyymmdd%%hh%%mi%
echo 当前时间戳:%timestamp%
BAT中实现读取文件中指定行指定列的内容
比如读取下面version后面字符串的内容,则是需要读取第三行第二列的内容
新增bat内容如下
cd public
cd config
:: 设置要处理的文件名
set "filename=config.js"
echo !filename!
:: 设置要读取的行号
set /a "row=3"
:: 设置要读取的列号
set /a "column=2"
:: 初始化计数器和临时变量
set /a "line=0", "col=0"
set "line_content="
:: 循环读取文件直到指定行
for /f "tokens=*" %%l in ('type "%filename%"') do (
set /a "line+=1"
if !line! equ %row% (
set "line_content=%%l"
)
)
:: 初始化列计数器
set /a "col=0"
:: 通过分割行内容和tokens选项来获取指定列的内容
for /f "tokens=%column%" %%c in ("!line_content!") do (
set "column_content=%%c"
echo 第%row%行第%column%列的内容是: !column_content!
)
echo 上个版本version:!column_content!
Bat中实现截取字符串变量的指定内容
上面获取的文件中第三行第二列的内容为
'202406181354'
如果对这个字符串进行截取,去掉两边的单引号,可以指定截取开始的索引为1,截取长度为12
set "search_text=!column_content:~1,12!"
那么这里的search_text即为202406181354
Bat中实现调用powershell并通过-replace实现读取文件并替换内容
下面需要对上面读取到的旧的时间戳替换成当前时间戳
@powershell -Command "((Get-Content '!filename!' -encoding utf8) -replace '!search_text!', '!timestamp!') | Set-Content '!filename!' -encoding utf8"
注意这里调用Get-Content以及Set-Content时需要指定编码格式为utf8否则会出现修改文件后中文乱码的问题。
其中filename为要替换的文件,search_text为替换前的内容,timestamp为替换后的内容
Bat中实现调用npm进行打包vue项目操作
cd ../../
echo node打包开始
call npm install
call npm run build:prod
Bat中实现调用7-zip(已配置环境变量)实现打包成tar.gz包操作
echo 开始打包tar包
echo --------------------------------------------------------------------
:: 创建tar包
7z a "dist.tar" "./dist"
echo 打包tar包结束
echo --------------------------------------------------------------------
echo 开始打包tar.gz包
:: 创建gzip压缩
7z a -tgzip "web-dist-!difName!-%timestamp%.tar.gz" "dist.tar"
:: 删除临时的tar包
del "dist.tar"
打包测试效果
完整bat脚本内容下载:
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/89480791