Files
jenkins-pipeline/SCM/构建镜像/1
2025-11-30 23:40:49 +08:00

181 lines
9.9 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ========= 使用 properties 定义参数 (Scripted Pipeline 部分) =========
properties([
parameters([
// --- 1. 动态下拉框 (移除 filterable) ---
[$class: 'org.biouno.unochoice.DynamicReferenceParameter',
name: 'IMAGE_TAG_WITH_LABELS', // 参数名,用于被其他参数引用
description: '选择镜像 (tag - Labels)',
choiceType: 'PT_SINGLE_SELECT', // 单选
// filterable: true, // ❌ 移除2.8.8 可能不支持
script: [
$class: 'org.biouno.unochoice.model.GroovyScript',
// ✅ 修复:使用 GroovyScriptSource
script: [
$class: 'org.biouno.unochoice.model.GroovyScriptSource',
script: '''
import groovy.json.JsonSlurper
def choices = []
def metadataDir = '/var/lib/jenkins/metadata'
// 注意:这里的文件名需要与构建 Job 存储的文件名一致
// 假设你的命名空间是 lessiesit
def metadataFileRelativePath = "lessiesit-flymoon-email.json" // <--- 修正:根据实际命名空间和镜像名调整
def fullMetadataPath = "${metadataDir}/${metadataFileRelativePath}"
try {
// 使用 readFile 步骤读取文件内容(作为字符串)
def existingDataString = readFile file: fullMetadataPath, encoding: 'UTF-8'
if (existingDataString) {
def jsonSlurper = new groovy.json.JsonSlurper()
def existingDataList = jsonSlurper.parseText(existingDataString)
if (existingDataList instanceof List) {
existingDataList.each { imageData ->
def tag = imageData.image_tag
def labels = imageData.labels
def branch = labels?.get('git-branch') ?: 'N/A'
def commit = labels?.get('git-commit') ?: 'N/A'
def author = labels?.get('git-author') ?: 'N/A'
def message = labels?.get('git-message') ?: 'N/A'
def time = labels?.get('build-time') ?: 'N/A'
// 格式化显示文本: "tag - commit: message (time) - branch"
def displayText = "${tag} - ${commit}: ${message} (${time}) - ${branch}"
// 将 image_tag 作为选项的值
def value = tag
// Active Choices 期望返回 ["displayText [value]", ...] 格式的 List
choices << "${displayText} [${value}]"
}
} else {
choices = ["(元数据文件格式错误: 非 List 类型)"]
}
} else {
choices = ["(元数据文件为空)"]
}
} catch (java.io.FileNotFoundException e) {
// 文件不存在
choices = ["(未找到元数据文件: ${fullMetadataPath})"]
} catch (Exception e) {
choices = ["❌ 加载镜像列表失败: ${e.message}"]
}
return choices
'''
],
fallbackScript: [
$class: 'org.biouno.unochoice.model.GroovyScriptSource',
script: '''
return ['⚠️ 脚本执行异常']
'''
]
],
omitValueField: true // 不显示输入框,只显示下拉
],
// --- 2. 监听下拉框变化,显示 Labels ---
[$class: 'org.biouno.unochoice.ReactiveReferenceParameter',
name: 'IMAGE_LABELS_PREVIEW', // 参数名,用于显示
description: '镜像 Labels 预览', // 页面上会显示这个描述
script: [
$class: 'org.biouno.unochoice.model.GroovyScript',
// ✅ 修复:使用 GroovyScriptSource
script: [
$class: 'org.biouno.unochoice.model.GroovyScriptSource',
script: '''
import groovy.json.JsonSlurper
// 获取被引用的参数值
def selectedTag = params.IMAGE_TAG_WITH_LABELS ?: '' // 使用下拉框的参数名
if (!selectedTag) {
return '<div style="color: gray; font-style: italic;">(请选择镜像)</div>'
}
def metadataDir = '/var/lib/jenkins/metadata'
// 注意:这里的文件名需要与构建 Job 存储的文件名一致
// 假设你的命名空间是 lessiesit
def metadataFileRelativePath = "lessiesit-flymoon-email.json" // <--- 修正:根据实际命名空间和镜像名调整
def fullMetadataPath = "${metadataDir}/${metadataFileRelativePath}"
try {
def existingDataString = readFile file: fullMetadataPath, encoding: 'UTF-8'
if (existingDataString) {
def jsonSlurper = new groovy.json.JsonSlurper()
def existingDataList = jsonSlurper.parseText(existingDataString)
if (existingDataList instanceof List) {
// 查找匹配的镜像数据
def imageData = existingDataList.find { it.image_tag == selectedTag }
if (imageData) {
def labels = imageData.labels
def branch = labels?.get('git-branch') ?: 'N/A'
def commit = labels?.get('git-commit') ?: 'N/A'
def author = labels?.get('git-author') ?: 'N/A'
def message = labels?.get('git-message') ?: 'N/A'
def time = labels?.get('build-time') ?: 'N/A'
// 格式化输出
def output = "<div style='font-family: monospace; font-size: 12px; padding: 5px; border: 1px solid #ccc; background-color: #f9f9f9;'><strong>🏷️ Labels for ${selectedTag}:</strong><br/>"
output += "<strong>git-branch:</strong> ${branch}<br/>"
output += "<strong>git-commit:</strong> ${commit}<br/>"
output += "<strong>git-author:</strong> ${author}<br/>"
output += "<strong>git-message:</strong> ${message}<br/>"
output += "<strong>build-time:</strong> ${time}<br/>"
output += "</div>"
return output
} else {
return "<div style='color: orange;'>⚠️ 未找到标签为 '${selectedTag}' 的镜像信息</div>"
}
} else {
return "<div style='color: red;'>❌ 元数据文件格式错误: 非 List 类型</div>"
}
} else {
return "<div style='color: red;'>❌ 元数据文件为空</div>"
}
} catch (java.io.FileNotFoundException e) {
return "<div style='color: red;'>❌ 未找到元数据文件: ${fullMetadataPath}</div>"
} catch (Exception e) {
return "<div style='color: red;'>❌ 查询镜像信息失败: ${e.message}</div>"
}
'''
],
fallbackScript: [
$class: 'org.biouno.unochoice.model.GroovyScriptSource',
script: '''
return '<div style="color: red;">⚠️ 查询脚本执行异常</div>'
'''
]
],
choiceType: 'ET_FORMATTED_HTML', // 返回 HTML
omitValueField: true, // 不显示输入框,只显示返回的 HTML
referencedParameters: 'IMAGE_TAG_WITH_LABELS' // 监听的参数
]
// --- 结束添加 ---
])
])
// ========= Declarative Pipeline 主体 =========
pipeline {
agent any
// 注意parameters 块已移至 properties 中
stages {
stage('部署') {
steps {
script {
// --- ✅ 修正:构建完整镜像名 ---
// 从参数 IMAGE_TAG_WITH_LABELS 获取 tag
def tag = params.IMAGE_TAG_WITH_LABELS // 使用下拉框的参数名
// 拼接完整镜像名
def fullImageName = "uswccr.ccs.tencentyun.com/lessiesit/flymoon-email:${tag}" // 修正:命名空间
echo "开始部署镜像: ${fullImageName}"
// 部署命令如kubectl、docker run等
// sh "kubectl set image deployment/your-app app=${fullImageName}"
}
}
}
}
}