仅当文件有新版本时跨作业复制构件及主从节点jar部署需求
嘿,针对你这个主从节点同步Jar包的需求,我结合你提到的现有作业架构,整理了一套落地性很强的方案,一步步来拆解:
整体环境与现有作业回顾
先明确下咱们的基础配置:
- 主节点(Master):唯一能访问Nexus的节点,运行
CHECK_LATEST_JAR作业——负责检查Nexus上的Jar包新版本、下载Jar包,同时更新VERSION.TXT文件记录最新版本(格式比如xxx-0.012.jar) - 两个从节点(Slaves):需要运行主节点下载的Jar包,依赖主节点的文件同步
- 现有触发逻辑:有一个父任务可以触发多个子作业,目前已知第一个子作业是
CHECK_LATEST_JAR
核心需求实现:仅当有新版本时才复制构件到从节点
要实现“版本更新才同步”的逻辑,咱们需要从作业逻辑、触发条件、节点校验三个层面入手:
1. 完善CHECK_LATEST_JAR的版本对比与标记逻辑
首先得让这个作业能明确判断是否真的有新版本,而不是盲目下载。可以在作业里添加以下步骤(以Bash脚本为例):
#!/bin/bash # 从Nexus获取最新Jar文件名(这里假设通过Nexus的目录列表或REST API获取,你可以根据实际Nexus配置调整) LATEST_JAR=$(curl -s http://your-nexus-url/repository/your-repo/path/to/jars/ | grep -o 'xxx-[0-9]*\.[0-9]*\.jar' | sort -V | tail -1) # 读取本地已有的VERSION.TXT内容,文件不存在则默认是空 CURRENT_JAR=$(cat VERSION.TXT 2>/dev/null || echo "") # 对比版本 if [ "$LATEST_JAR" != "$CURRENT_JAR" ]; then # 下载最新Jar包 curl -O http://your-nexus-url/repository/your-repo/path/to/jars/$LATEST_JAR # 更新VERSION.TXT echo "$LATEST_JAR" > VERSION.TXT # 设置标记:告诉后续作业有新版本可用(不同CI工具的参数传递方式不同,这里用环境变量示例) echo "NEW_VERSION_AVAILABLE=true" >> $GITHUB_ENV # 如果是GitHub Actions # Jenkins的话可以用:echo "NEW_VERSION_AVAILABLE=true" > new_version_flag.txt else # 没有新版本,设置标记为false echo "NEW_VERSION_AVAILABLE=false" >> $GITHUB_ENV fi
这个脚本的核心是:只有当Nexus的最新Jar和本地记录的版本不一致时,才执行下载和更新,同时输出“有新版本”的标记。
2. 配置父任务的条件触发逻辑
父任务在触发“复制构件到从节点”的子作业时,必须加上条件判断——只有当CHECK_LATEST_JAR作业返回NEW_VERSION_AVAILABLE=true时,才触发同步。
以Jenkins流水线为例,你可以这么写:
pipeline { agent any stages { stage('检查最新Jar包') { agent { label 'master' } // 指定在主节点运行 steps { script { // 运行CHECK_LATEST_JAR作业,获取它的输出参数 def checkBuild = build job: 'CHECK_LATEST_JAR', propagate: false // 把新版本标记存入全局环境变量 env.HAS_NEW_VERSION = checkBuild.buildVariables.NEW_VERSION_AVAILABLE } } } stage('同步Jar到从节点') { // 只有当有新版本时才执行这个阶段 when { expression { env.HAS_NEW_VERSION == 'true' } } // 并行同步到两个从节点 parallel { stage('同步到Slave1') { agent { label 'slave1' } steps { // 从主节点复制Jar和VERSION.TXT,这里用scp示例,也可以用Jenkins的构件同步插件 sh 'scp master:/path/to/your/jars/${LATEST_JAR} ./' sh 'scp master:/path/to/VERSION.TXT ./' } } stage('同步到Slave2') { agent { label 'slave2' } steps { sh 'scp master:/path/to/your/jars/${LATEST_JAR} ./' sh 'scp master:/path/to/VERSION.TXT ./' } } } } stage('在从节点运行Jar') { when { expression { env.HAS_NEW_VERSION == 'true' } } parallel { stage('在Slave1运行') { agent { label 'slave1' } steps { sh 'java -jar $(cat VERSION.TXT)' } } stage('在Slave2运行') { agent { label 'slave2' } steps { sh 'java -jar $(cat VERSION.TXT)' } } } } } }
3. 从节点的版本校验(可选但推荐)
为了避免同步过程中出现文件缺失或版本不匹配的问题,从节点在运行Jar包前可以加一层校验:
#!/bin/bash # 读取本地VERSION.TXT记录的最新版本 TARGET_JAR=$(cat VERSION.TXT) # 检查Jar文件是否存在 if [ -f "$TARGET_JAR" ]; then echo "开始运行最新版本:$TARGET_JAR" java -jar "$TARGET_JAR" else echo "错误:找不到最新版本的Jar文件 $TARGET_JAR!" exit 1 fi
这样能确保从节点只会运行正确的最新版本,不会因为同步异常导致报错。
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

