pipeline {
    agent {
        kubernetes {
            yaml '''
apiVersion: v1
kind: Pod
spec:
  serviceAccountName: jenkins-deployer
  containers:
  - name: gradle
    image: eclipse-temurin:21-jdk
    command: ["sleep"]
    args: ["99d"]
  - name: kaniko
    image: gcr.io/kaniko-project/executor:debug
    command: ["sleep"]
    args: ["99d"]
    volumeMounts:
    - name: docker-config
      mountPath: /kaniko/.docker
  - name: kubectl
    image: alpine/k8s:1.31.0
    command: ["sleep"]
    args: ["99d"]
  volumes:
  - name: docker-config
    secret:
      secretName: harbor-registry-cred
      items:
      - key: .dockerconfigjson
        path: config.json
'''
        }
    }
    environment {
        IMAGE = "harbor.led.ectech.co.kr/cstest/cstest:${env.BUILD_NUMBER}"
    }
    stages {
        stage('Build') {
            steps {
                container('gradle') {
                    sh 'chmod +x gradlew && ./gradlew build --console=plain -x test'
                }
            }
        }
        stage('Image') {
            steps {
                container('kaniko') {
                    sh '''
                        /kaniko/executor \
                          --context `pwd` \
                          --dockerfile Dockerfile \
                          --destination ${IMAGE}
                    '''
                }
            }
        }
        stage('Deploy') {
            steps {
                container('kubectl') {
                    sh '''
                        sed "s#IMAGE_PLACEHOLDER#${IMAGE}#" k8s/deployment.yaml > /tmp/deployment.yaml
                        kubectl apply -f /tmp/deployment.yaml
                        kubectl apply -f k8s/service.yaml
                        kubectl apply -f k8s/ingress.yaml
                        kubectl -n apps rollout status deployment/cstest --timeout=90s
                    '''
                }
            }
        }
    }
}
