Jenkins参数化构建中注入文件参数环境变量及邮件发送问题咨询
我来给你梳理几个更简洁的方案,完全基于你现有的工具(不用装新插件),还能解决主从架构的痛点:
最优方案:用工作区属性文件+EnvInject(兼容主从)
核心思路就是把属性文件从JENKINS_HOME移到当前构建的工作区里——毕竟文件参数本来就会被传到工作区,而且每个节点的工作区都是独立的,完美避开主从路径不一致的问题。
步骤1:在构建步骤里生成属性文件
根据你用的节点系统(Unix/Windows),在构建步骤里加一段脚本,把上传文件的名称和大小写入到工作区的build.properties文件里:
如果你用Linux/macOS节点:
# 把这里的`UPLOADED_FILE`换成你实际的文件参数名称 FILE_NAME=$(basename "$UPLOADED_FILE") # 这里用du -h获取人类可读的大小,也可以用ls -lh或者其他方式 FILE_SIZE=$(du -h "$UPLOADED_FILE" | awk '{print $1}') # 写入工作区的属性文件 echo "UPLOADED_FILE_NAME=$FILE_NAME" > build.properties echo "UPLOADED_FILE_SIZE=$FILE_SIZE" >> build.properties
如果你用Windows节点:
# 同样替换成你的文件参数名称 $file = Get-Item "$env:UPLOADED_FILE" $fileName = $file.Name # 这里格式化大小为MB,你可以改成KB/GB或者原始字节数 $fileSize = "{0:N2} MB" -f ($file.Length / 1MB) # 写入属性文件 "UPLOADED_FILE_NAME=$fileName" | Out-File build.properties -Encoding utf8 "UPLOADED_FILE_SIZE=$fileSize" | Out-File build.properties -Encoding utf8 -Append
步骤2:用EnvInject读取这个属性文件
别在「构建环境」阶段用EnvInject了,改成在构建步骤之后、构建后操作之前添加「Inject environment variables」步骤(就是你已经装的EnvInject插件里的),然后在「Properties File Path」里填相对路径build.properties就行——因为这个文件就在当前工作区,不管是主节点还是从节点都能找到。
步骤3:邮件模板里直接用变量
之后在你的邮件模板里,就可以直接用${UPLOADED_FILE_NAME}和${UPLOADED_FILE_SIZE}这两个变量了,比如:
本次构建上传的文件:${UPLOADED_FILE_NAME} 文件大小:${UPLOADED_FILE_SIZE}
为什么这个方案能解决你的问题?
- 避开了「构建环境」阶段文件还没到工作区的问题:脚本是在构建步骤里跑的,这时候文件参数已经被传到工作区了,不会报“文件未找到”。
- 主从架构兼容:属性文件存在当前构建的工作区,每个节点的工作区都是独立的,不用依赖
JENKINS_HOME的绝对路径。 - 工作区删除不影响:构建后操作(包括发邮件)是在工作区被删除之前执行的,所以读取
build.properties完全没问题。
备选方案:不用EnvInject,用构建描述
如果你不想依赖EnvInject,也可以用Jenkins内置的「Set build description」步骤:
- 在构建步骤里先获取文件名和大小,然后添加「Set build description」步骤,把描述内容设成:
上传文件:${FILE_NAME},大小:${FILE_SIZE} - 之后在邮件模板里用
${BUILD_DESCRIPTION}就能引用这段内容了。
不过这个方法灵活性差一点,如果你需要在邮件的不同位置单独用文件名或大小,还是第一个方案更方便。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

