// 打包镜像 -拼接字符串命令，不然 sh 命令不支持动态 $ 读取参数
def build_image(String module_dir,String image_name){
    sh 'cd ' + module_dir +'/ && ls && docker build -f Dockerfile -t ' + image_name + ':latest .'
}

// 推送镜像 -拼接字符串命令，不然 sh 命令不支持动态 $ 读取参数
def push_image(String registry,String aliyunNamespace,String respName,String imageName) {
    REGISTRY = registry
    ALIYUN_NAMESPACE = aliyunNamespace
    RESP_NAME = respName
    IMAGE_NAME = imageName
    script{
        withCredentials([usernamePassword(credentialsId: 'aliyun', passwordVariable: 'password', usernameVariable: 'username')]) {
            sh 'echo "$password" | docker login ' + REGISTRY + ' -u "$username" --password-stdin'
            sh 'docker tag ' + IMAGE_NAME + ':latest ' + REGISTRY + '/' + ALIYUN_NAMESPACE + '/' + RESP_NAME + ':' + IMAGE_NAME + '-SNAPSHOT-$BUILD_NUMBER'
            sh 'docker push ' + REGISTRY +'/' + ALIYUN_NAMESPACE + '/' + RESP_NAME + ':' + IMAGE_NAME + '-SNAPSHOT-$BUILD_NUMBER'
            sh 'docker rmi ' + IMAGE_NAME + ':latest'
        }
    }
}

// 部署-拼接字符串命令，不然 sh 命令不支持动态 $ 读取参数
def deploy(String moduleDir) {
    input '是否部署？'
    sh 'cd ' + moduleDir + '/ && ls && docker-compose up -d'
}

pipeline {
  agent any
  //变量定义
  environment {
    REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
    ALIYUN_NAMESPACE = 'arsn'
    RESP_NAME='drone'
    IMAGE_NAME=''
    MODULE_DIR=''
    SERVICE_NAMES = 'drone-gateway,drone-auth,drone-system,drone-resource,drone-log,drone-job,drone-swagger,drone-yw,drone-odm,drone-h5'
    BUILD_MODULES = ''
  }

  stages {
    //1.拉取源码
    stage('Git Checkout'){
      steps {
        git branch: 'master', credentialsId: 'gitblit', url: 'http://127.0.0.1:10010/r/drone/drone_manage.git'
      }
    }
    //2. 获取改变的模块（子服务）
    stage('Detect Changes') {
        steps {
            script {
                def changedFiles = "Changes:\n"
                build = currentBuild
                while(build != null && build.result != 'SUCCESS') {
                    changedFiles += "In ${build.id}:\n"
                    for (changeLog in build.changeSets) {
                        for(entry in changeLog.items) {
                            for(file in entry.affectedFiles) {
                                changedFiles += "* ${file.path}\n"
                            }
                        }
                    }
                    build = build.previousBuild
                }
                echo changedFiles
                // 使用 split() 方法将字符串转换成数组
                def serviceArray = SERVICE_NAMES.split(',')
                def buildModules = []
                // 遍历数组并打印每个元素
                serviceArray.each { service ->
                    def name = service.trim()
                    echo "Service: ${name}"
                    if(changedFiles.contains(name)){
                        buildModules += name
                    }
                }
                BUILD_MODULES = buildModules.join(",")
                echo "Modules to be built: $BUILD_MODULES"
            }
        }
    }
    //3.编译成jar包
    stage('Maven Build') {
      steps {
        sh 'ls'
        sh 'mvn clean package -Dmaven.test.skip=true'
        sh 'ls target/'
      }
    }
    //4.构建镜像,可能有多个
    stage('Build Images'){
      steps {
        script {
            if (BUILD_MODULES.contains("drone-gateway")) {
                build_image('drone-gateway','drone-gateway')
            }
            if (BUILD_MODULES.contains("drone-auth")) {
                build_image('drone-auth','drone-auth')
            }
            if (BUILD_MODULES.contains("drone-system")) {
                build_image('drone-service/drone-system','drone-system')
            }
            if (BUILD_MODULES.contains("drone-resource")) {
                build_image('drone-ops/drone-resource','drone-resource')
            }
            if (BUILD_MODULES.contains("drone-log")) {
                build_image('drone-ops/drone-log','drone-log')
            }
            if (BUILD_MODULES.contains("drone-job")) {
                build_image('drone-ops/drone-job','drone-job')
            }
            if (BUILD_MODULES.contains("drone-swagger")) {
                build_image('drone-ops/drone-swagger','drone-swagger')
            }
            if (BUILD_MODULES.contains("drone-yw")) {
                build_image('drone-service/drone-yw','drone-yw')
            }
            if (BUILD_MODULES.contains("drone-odm")) {
                build_image('drone-service/drone-odm','drone-odm')
            }
            if (BUILD_MODULES.contains("drone-h5")) {
                build_image('drone-service/drone-h5','drone-h5')
            }
        }
      }
    }
    //5.拉取镜像并启动
    stage("Push Image"){
      steps {
        script {
            if (BUILD_MODULES.contains("drone-gateway")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-gateway')
            }
            if (BUILD_MODULES.contains("drone-auth")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-auth')
            }
            if (BUILD_MODULES.contains("drone-system")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-system')
            }
            if (BUILD_MODULES.contains("drone-resource")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-resource')
            }
            if (BUILD_MODULES.contains("drone-log")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-log')
            }
            if (BUILD_MODULES.contains("drone-job")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-job')
            }
            if (BUILD_MODULES.contains("drone-swagger")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-swagger')
            }
            if (BUILD_MODULES.contains("drone-yw")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-yw')
            }
            if (BUILD_MODULES.contains("drone-odm")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-odm')
            }
            if (BUILD_MODULES.contains("drone-h5")) {
                push_image(REGISTRY,ALIYUN_NAMESPACE,RESP_NAME,'drone-h5')
            }
        }
      }
    }
    //6.部署
    stage('deploy to') {
        steps {
          script {
            if (BUILD_MODULES.contains("drone-gateway")) {
                deploy('drone-gateway')
            }
            if (BUILD_MODULES.contains("drone-auth")) {
                deploy('drone-auth')
            }
            if (BUILD_MODULES.contains("drone-system")) {
                deploy('drone-service/drone-system')
            }
            if (BUILD_MODULES.contains("drone-resource")) {
                deploy('drone-ops/drone-resource')
            }
            if (BUILD_MODULES.contains("drone-log")) {
                deploy('drone-ops/drone-log')
            }
            if (BUILD_MODULES.contains("drone-job")) {
                deploy('drone-ops/drone-job')
            }
            if (BUILD_MODULES.contains("drone-swagger")) {
                deploy('drone-ops/drone-swagger')
            }
            if (BUILD_MODULES.contains("drone-yw")) {
                deploy('drone-service/drone-yw')
            }
            if (BUILD_MODULES.contains("drone-odm")) {
                deploy('drone-service/drone-odm')
            }
            if (BUILD_MODULES.contains("drone-h5")) {
                deploy('drone-service/drone-h5')
            }
          }
        }
    }
  }
}
