pipeline {
    agent any

    environment {
        // ========== 镜像仓库配置 ==========
        IMAGE_NAME       = 'lottery-mp'
        REGISTRY_URL     = 'git.jerryyan.net'
        IMAGE_NS         = 'q792602257'
        FULL_IMAGE_NAME  = "git.jerryyan.net/${IMAGE_NS ? IMAGE_NS + '/' : ''}${IMAGE_NAME}"

        // 容器运行时，Docker 或 Podman
        CONTAINER_CLI    = 'docker'

        // ========== 国内加速源（构建参数用） ==========
        NPM_REGISTRY     = 'https://registry.npmmirror.com'
        GOPROXY          = 'https://goproxy.cn,direct'
        APT_MIRROR       = 'mirrors.aliyun.com'
    }

    options {
        buildDiscarder(logRotator(numToKeepStr: '10'))
        timestamps()
    }

    stages {
        // --------------------------------------------------
        // Stage 1: 检出代码
        // --------------------------------------------------
        stage('Checkout') {
            steps {
                checkout scm
                script {
                    def prev = currentBuild.previousBuild ?: currentBuild.previousSuccessfulBuild
                    if (prev != null) {
                        def prevCommit = sh(script: "git rev-parse ${prev.id} 2>/dev/null || echo ''", returnStdout: true).trim()
                        if (prevCommit) {
                            env.CHANGED = sh(script: "git diff --quiet ${prevCommit} HEAD -- . && echo false || echo true", returnStdout: true).trim()
                        } else {
                            env.CHANGED = 'true'
                        }
                    } else {
                        env.CHANGED = 'true'
                    }
                    echo "代码变更: ${env.CHANGED}（对比构建 #${prev?.id ?: '无'}）"
                }
                // 后端测试会把 SQLite 测试库（test_*.db 及 -wal/-shm）泄漏进包目录，
                // 在工作区逐次累积直至撑爆磁盘；在每次构建开头清掉历史残留
                sh "find . -type f \\( -name 'test_*.db' -o -name 'test_*.db-wal' -o -name 'test_*.db-shm' -o -name 'test_*.db-journal' \\) -delete || true"
            }
        }

        // Test 阶段已停用：recordCoverage 向 Gitea 发布 checks 触发 Jenkins 插件崩溃
        //（UnknownFormatConversionException），测试暂回本地执行；恢复时从 git 历史取回本阶段。

        // --------------------------------------------------
        // Stage 3: 构建 Docker 镜像
        // --------------------------------------------------
        stage('Build Docker Image') {
            steps {
                script {
                    // 解析当前分支：优先 BRANCH_NAME(multibranch)，回退 GIT_BRANCH(普通 pipeline，去掉 origin/ 前缀)
                    def branch = (env.BRANCH_NAME ?: env.GIT_BRANCH ?: 'unknown')
                    branch = branch.replaceAll('^[^/]+/', '').replaceAll('/', '-')
                    def tag = "${env.BUILD_NUMBER}"
                    def branchTag = (branch == 'main' || branch == 'master') ? 'latest' : branch

                    env.BRANCH_RESOLVED = branch
                    env.BUILT_IMAGE_TAG = tag
                    env.BUILT_IMAGE_BRANCH_TAG = branchTag

                    // 构建镜像并传入国内源加速参数
                    sh """
                        ${CONTAINER_CLI} build \
                            --build-arg NPM_REGISTRY=${NPM_REGISTRY} \
                            --build-arg GOPROXY=${GOPROXY} \
                            --build-arg APT_MIRROR=${APT_MIRROR} \
                            -t ${FULL_IMAGE_NAME}:${tag} \
                            -t ${FULL_IMAGE_NAME}:${branchTag} \
                            .
                    """
                }
            }
        }

        // --------------------------------------------------
        // Stage 4: 推送镜像到仓库（仅在 main/master 分支执行）
        // --------------------------------------------------
        stage('Push Image') {
            steps {
                script {
                    // 方式 A：使用 Jenkins Credentials 登录（推荐）
                    // 请在 Jenkins 中预先创建 Credentials ID 为 "gitea-registry" 的用户名/密码凭证
                    withCredentials([usernamePassword(
                        credentialsId: 'gitea-registry',
                        usernameVariable: 'REGISTRY_USER',
                        passwordVariable: 'REGISTRY_PASS'
                    )]) {
                        sh """
                            echo \$REGISTRY_PASS | ${CONTAINER_CLI} login ${REGISTRY_URL} -u \$REGISTRY_USER --password-stdin
                            ${CONTAINER_CLI} push ${FULL_IMAGE_NAME}:${env.BUILT_IMAGE_TAG}
                            ${CONTAINER_CLI} push ${FULL_IMAGE_NAME}:${env.BUILT_IMAGE_BRANCH_TAG}
                        """
                    }

                    // 方式 B：如果 Jenkins 节点已配置免密登录，可直接 push，注释掉上面的 withCredentials 块即可
                }
            }
        }
    }

    // --------------------------------------------------
    // Post Actions
    // --------------------------------------------------
    post {
        success {
            echo "✅ 构建成功！镜像：${FULL_IMAGE_NAME}:${env.BUILT_IMAGE_TAG}"
        }
        failure {
            echo "❌ 构建失败，请查看上方日志"
        }
        always {
            // 清理工作区（可选）
            // cleanWs()

            // 清理本地构建的镜像，避免磁盘膨胀
            script {
                if (env.BRANCH_RESOLVED == 'main' || env.BRANCH_RESOLVED == 'master') {
                    sh """
                        ${CONTAINER_CLI} rmi ${FULL_IMAGE_NAME}:${env.BUILT_IMAGE_TAG} || true
                        ${CONTAINER_CLI} rmi ${FULL_IMAGE_NAME}:${env.BUILT_IMAGE_BRANCH_TAG} || true
                    """
                }
            }
        }
    }
}
