// 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 '部署失败，请检查日志'
        }
    }
}