Files
jenkins-pipeline/python/tmp.groovy
2025-10-18 21:12:43 +08:00

151 lines
6.8 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"
// 登出仓库
sh "docker logout ${REGISTRY}"
}
}
}
}
post {
always {
// 1. 登出仓库(不变)
sh "docker logout ${REGISTRY}"
echo "容器仓库已登出,本地凭证已清理"
// 2. 兼容低版本 Docker 的镜像清理脚本
sh '''
TARGET_IMAGE="uswccr.ccs.tencentyun.com/lessietest/lessie-sourcing-agents"
ALL_TAGS_WITH_TIME=$(docker images --format "{{.CreatedAt}} {{.Repository}}:{{.Tag}}" --filter "reference=${TARGET_IMAGE}:*")
ALL_TAGS=$(echo "${ALL_TAGS_WITH_TIME}" | sort -k1,1r | awk '{print $2}')
TAGS_TO_DELETE=$(echo "${ALL_TAGS}" | tail -n +2)
if [ -n "${TAGS_TO_DELETE}" ]; then
echo "开始删除冗余镜像:"
echo "${TAGS_TO_DELETE}"
for TAG in ${TAGS_TO_DELETE}; do
CONTAINERS=$(docker ps -a --filter "ancestor=${TAG}" --format "{{.ID}}")
if [ -n "${CONTAINERS}" ]; then
echo "停止并删除引用镜像 ${TAG} 的容器:${CONTAINERS}"
docker stop ${CONTAINERS} > /dev/null 2>&1
docker rm ${CONTAINERS} > /dev/null 2>&1
fi
echo "删除镜像:${TAG}"
docker rmi -f ${TAG} > /dev/null 2>&1
done
echo "冗余镜像删除完成"
else
echo "无冗余镜像可删除仅保留了最新的1个镜像"
fi
'''
echo "本地镜像清理完成,核心缓存层已保留"
}
success {
// 输出构建结果
echo "镜像构建成功!"
echo "镜像地址:${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG}"
echo "latest 标签地址:${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:latest"
echo "对应代码提交:${GIT_COMMIT_SHORT}${GIT_COMMIT_MSG}"
}
}
}