Files
jenkins-pipeline/SCM/build_image_lessie_agents_test.groovy
2025-10-20 11:30:24 +08:00

159 lines
7.3 KiB
Groovy
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.

pipeline {
agent any
parameters {
gitParameter(
branchFilter: 'origin/(.*)',
defaultValue: 'master',
name: 'Code_branch',
type: 'PT_BRANCH',
selectedValue: 'DEFAULT',
sortMode: 'NONE',
description: '选择代码分支默认master分支',
quickFilterEnabled: true,
tagFilter: '*',
listSize: "1"
)
}
environment {
REGISTRY = "uswccr.ccs.tencentyun.com" // 镜像仓库地址
NAMESPACE = "lessietest" // 命名空间
IMAGE_NAME = "lessie-sourcing-agents" // 镜像名(固定前缀)
CREDENTIALS_ID = "dxin_img_hub_auth" // 容器仓库凭证ID
}
stages {
stage('拉取代码') {
steps {
// 拉取指定分支代码(通过参数 params.Code_branch 动态指定)
git branch: "${params.Code_branch}",
credentialsId: 'fly_gitlab_auth',
url: 'http://106.53.194.199/python/lessie-sourcing-agents.git'
}
}
stage('获取提交信息') {
steps {
script {
// 获取最近一次提交的哈希值短格式前8位
env.GIT_COMMIT_SHORT = sh(script: 'git rev-parse --short HEAD',returnStdout: true).trim()
// 获取最近一次提交的作者
env.GIT_AUTHOR = sh(script: 'git log -1 --pretty=format:%an',returnStdout: true).trim()
// 获取最近一次提交的时间(格式化)
env.GIT_COMMIT_TIME = sh(
script: 'git log -1 --pretty=format:%ct | xargs -I {} date -d @{} +%Y%m%d-%H%M%S',
returnStdout: true
).trim()
// 获取最近一次提交的备注信息(转义特殊字符,避免构建失败)
env.GIT_COMMIT_MSG = sh(script: 'git log -1 --pretty=format:%s | sed -e \'s/"/\\"/g\'', returnStdout: true).trim()
// Jenkins构建次数
def buildNumber = env.BUILD_NUMBER // Jenkins内置变量直接获取当前Job的构建序号
// 当前分支名(处理/为-如feature/docker_1015 → feature-docker_1015
def branchName = sh(script: 'git rev-parse --abbrev-ref HEAD', returnStdout: true).trim()
def formattedBranch = branchName.replace('/', '-').replace('_', '-') // 替换分支名中的/和_为-
// 构建时间格式202510181215年-月-日-时-分,无分隔符)
def buildTime = sh(script: 'date +%Y%m%d%H%M', returnStdout: true).trim()
// 最终Tag格式v+构建次数_分支名_短哈希_构建时间
env.IMAGE_TAG = "v${buildNumber}_${formattedBranch}_${GIT_COMMIT_SHORT}_${buildTime}"
}
}
}
stage('登录容器仓库') {
steps {
withCredentials([usernamePassword(
credentialsId: env.CREDENTIALS_ID,
usernameVariable: 'REGISTRY_USER',
passwordVariable: 'REGISTRY_PWD'
)]) {
sh '''
echo "$REGISTRY_PWD" | docker login ${REGISTRY} -u ${REGISTRY_USER} --password-stdin
'''
}
}
}
stage('构建容器镜像') {
steps {
script {
// 构建镜像,添加标签信息
sh """
docker build -t ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG} \
--label "git-branch='${params.Code_branch}'" \
--label "git-commit='${GIT_COMMIT_SHORT}'" \
--label "git-author='${GIT_AUTHOR}'" \
--label "git-message='${GIT_COMMIT_MSG}'" \
--label "build-time='${GIT_COMMIT_TIME}'" \
.
"""
}
}
}
stage('推送镜像到仓库') {
steps {
script {
// 推送主镜像(带唯一 Tag
sh "docker push ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG}"
// 推送 latest 标签(包含命名空间)
sh "docker tag ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG} ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:latest"
sh "docker push ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:latest"
}
}
}
}
post {
always {
script {
echo "开始清理本地旧镜像,仅保留最近 3 个构建版本 + latest"
// 保留镜像数量
def keepCount = 3
def imagePrefix = "${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}"
// 获取当前镜像的 IMAGE ID
def currentImageId = sh(script: "docker images -q ${imagePrefix}:${IMAGE_TAG}", returnStdout: true).trim()
// 获取所有该镜像的本地版本(按创建时间排序)
def allImages = sh(script: "docker images ${imagePrefix} --format '{{.ID}} {{.Tag}}' | sort -rk2", returnStdout: true).trim().split('\n')
if (allImages.size() > keepCount + 1) { // +1 是因为还要保留 latest
def oldImages = allImages.drop(keepCount + 1)
echo "发现 ${oldImages.size()} 个旧镜像需要清理"
oldImages.each { line ->
def parts = line.split(' ')
def imageId = parts[0]
def tag = parts[1]
// 跳过 latest
if (tag != "latest") {
echo "删除旧镜像: ${imagePrefix}:${tag}"
sh "docker rmi -f ${imagePrefix}:${tag} || true"
}
}
} else {
echo "当前镜像数未超过 ${keepCount + 1} 个,无需清理"
}
echo "当前镜像数:${allImages.size()}"
sh "docker images ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME} --format 'table {{.Repository}}\\t{{.Tag}}\\t{{.CreatedSince}}\\t{{.Size}}'"
// 无论成败都登出,清理凭证
sh "docker logout ${REGISTRY}"
echo "容器仓库已登出,本地凭证已清理"
}
}
success {
// 输出构建结果
echo "镜像构建成功!"
echo "镜像地址:${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG}"
echo "latest 标签地址:${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:latest"
echo "对应代码提交:${GIT_COMMIT_SHORT}${GIT_COMMIT_MSG}"
}
failure {
// 输出构建结果
echo "镜像构建失败!"
echo "镜像地址:${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG}"
echo "latest 标签地址:${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:latest"
echo "对应代码提交:${GIT_COMMIT_SHORT}${GIT_COMMIT_MSG}"
}
}
}