111 lines
4.2 KiB
Groovy
111 lines
4.2 KiB
Groovy
|
|
// apbo-boat-agent/deploy/dev/Jenkinsfile
|
||
|
|
pipeline {
|
||
|
|
agent any
|
||
|
|
|
||
|
|
tools {
|
||
|
|
jdk 'jdk21'
|
||
|
|
maven 'apache-maven-3.9.12' // 与 Global Tool Configuration 中配置的 Name 保持一致
|
||
|
|
}
|
||
|
|
|
||
|
|
environment {
|
||
|
|
ENVIRONMENT = 'dev'
|
||
|
|
DOCKER_REGISTRY = '10.122.172.43:9080' // 私有镜像仓库地址
|
||
|
|
DOCKER_CREDENTIALS_ID = 'harbor-credentials-id' // Jenkins 中 Docker 凭证 ID
|
||
|
|
DOCKER_PROJECT = 'apbo' // Jenkins 中 Docker 凭证 ID
|
||
|
|
KUBECONFIG_CREDENTIALS_ID = 'k3s-cluster1-config' // Jenkins 中 kubeconfig 凭证 ID
|
||
|
|
PROJECT_MODULE = 'apbo-boat-agent'
|
||
|
|
|
||
|
|
NAMESPACE = 'apbo-${ENVIRONMENT}' // 与 deployment.yaml 中的 namespace 一致
|
||
|
|
IMAGE_TAG = "${ENVIRONMENT}-${BUILD_NUMBER}"
|
||
|
|
IMAGE_NAME = "${DOCKER_REGISTRY}/${DOCKER_PROJECT}/${PROJECT_MODULE}:${IMAGE_TAG}"
|
||
|
|
}
|
||
|
|
|
||
|
|
stages {
|
||
|
|
|
||
|
|
stage('Checkout') {
|
||
|
|
steps {
|
||
|
|
checkout scm
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
stage('Check Code Changes') {
|
||
|
|
steps {
|
||
|
|
script {
|
||
|
|
def prev = env.GIT_PREVIOUS_SUCCESSFUL_COMMIT ?: ''
|
||
|
|
if (!prev?.trim()) {
|
||
|
|
echo "未找到上次成功构建提交,默认执行构建"
|
||
|
|
env.SKIP_BUILD = 'false'
|
||
|
|
} else {
|
||
|
|
int rc = sh(
|
||
|
|
script: "git diff --quiet ${prev} HEAD -- apbo-boat-agent",
|
||
|
|
returnStatus: true
|
||
|
|
)
|
||
|
|
env.SKIP_BUILD = (rc == 0) ? 'true' : 'false'
|
||
|
|
}
|
||
|
|
|
||
|
|
echo "代码变更检查结果: SKIP_BUILD=${env.SKIP_BUILD}"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
stage('Build & Push Docker Image') {
|
||
|
|
when {
|
||
|
|
expression { env.SKIP_BUILD != 'true' }
|
||
|
|
}
|
||
|
|
steps {
|
||
|
|
script {
|
||
|
|
docker.withRegistry("http://${DOCKER_REGISTRY}", DOCKER_CREDENTIALS_ID) {
|
||
|
|
dir('.') {
|
||
|
|
def image = docker.build(
|
||
|
|
"${IMAGE_NAME}",
|
||
|
|
"-f apbo-boat-agent/deploy/${ENVIRONMENT}/Dockerfile --build-arg PIP_OPTIONS=\"--no-hash-check\" ./apbo-boat-agent"
|
||
|
|
)
|
||
|
|
image.push()
|
||
|
|
image.push("${ENVIRONMENT}-latest")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
stage('Deploy to K3s') {
|
||
|
|
steps {
|
||
|
|
script {
|
||
|
|
// 使用 withCredentials 绑定 kubeconfig 文件
|
||
|
|
withCredentials([file(credentialsId: KUBECONFIG_CREDENTIALS_ID, variable: 'KUBECONFIG')]) {
|
||
|
|
// 设置 KUBECONFIG 环境变量
|
||
|
|
withEnv(["KUBECONFIG=${env.KUBECONFIG}"]) {
|
||
|
|
// 先 apply 整个 deployment.yaml(确保资源存在)
|
||
|
|
sh "kubectl apply -f ${PROJECT_MODULE}/deploy/${ENVIRONMENT}/deployment.yaml -n ${NAMESPACE}"
|
||
|
|
|
||
|
|
// 滚动更新镜像
|
||
|
|
sh "kubectl set image deployment/apbo-boat-agent-${ENVIRONMENT} apbo-boat-agent=${IMAGE_NAME} -n ${NAMESPACE} --record"
|
||
|
|
|
||
|
|
// 等待 rollout 完成
|
||
|
|
sh "kubectl rollout status deployment/apbo-boat-agent-${ENVIRONMENT} -n ${NAMESPACE}"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
post {
|
||
|
|
success {
|
||
|
|
script {
|
||
|
|
echo '清理本次构建的 Docker 镜像以释放磁盘空间...'
|
||
|
|
// 注意:此操作需要在 Jenkins 节点上安装并配置好 Docker 客户端,且能访问私有仓库
|
||
|
|
sh """
|
||
|
|
docker rmi ${IMAGE_NAME} || true
|
||
|
|
"""
|
||
|
|
// 清理所有悬空镜像,解决 <none> 问题
|
||
|
|
sh 'docker image prune -f'
|
||
|
|
echo '镜像清理完成。'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
failure {
|
||
|
|
echo '部署失败,请检查日志'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|