def FAILED_STAGE

pipeline {
    agent {
        node {
            label 'jenkins-worker'
        }
    }

    options {
        timeout(time: 1, unit: 'HOURS')
        disableConcurrentBuilds()
        buildDiscarder(logRotator(numToKeepStr: '5'))
    }

    stages {
        stage('Client') {
            steps {
                container("nodejs"){
                    script {
                        FAILED_STAGE=env.STAGE_NAME

                        sh 'npm --version'
                        dir('goofy-client') {
                            sh 'echo "registry=http://nexus.ozg-sh.de/repository/npm-proxy" >> ~/.npmrc'
                            sh 'echo "_auth=amVua2luczpQaihzX0ZNNFU5ZC8=" >> ~/.npmrc'

                            sh 'npm install --no-optional'
                        
                            if (env.BRANCH_NAME == 'release') {
                                sh 'npm run ci-prodBuild'
                            }
                            else {
                                sh 'npm run ci-build'
                            }

//                            sh 'npm run ci-test'
                        }
                    }
                }
            }
       //     post {
       //         always{
       //             junit testResults: 'goofy-client/test-report.xml', skipPublishingChecks: true
       //         }
       //     } 
        }

        stage('Server') {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                }
                container("maven-11"){
                    configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
                        sh 'mvn --version'
                        sh 'mvn -s $MAVEN_SETTINGS -pl -goofy-client clean install spring-boot:build-image -Dmaven.wagon.http.retryHandler.count=3'
                    }
                }
            }
            post {
                always{
                    junit testResults: '**/target/surefire-reports/*.xml', skipPublishingChecks: true
                }
            }
        }

        stage('Push Docker image') {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                    def pom = readMavenPom file: 'pom.xml'
                    def version = pom.version

                    container("docker") {
                        withCredentials([usernamePassword(credentialsId: 'jenkins-docker-login', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) {
                            sh 'docker login docker.ozg-sh.de -u ${USER} -p ${PASSWORD}'

                            sh "docker tag docker.ozg-sh.de/goofy:build-latest docker.ozg-sh.de/goofy:${env.BRANCH_NAME}-${version}"
                            sh "docker push docker.ozg-sh.de/goofy:${env.BRANCH_NAME}-${version}"

                            if (env.BRANCH_NAME == 'master') {
                                sh 'docker tag docker.ozg-sh.de/goofy:build-latest docker.ozg-sh.de/goofy:e2e-test'
                                sh 'docker push docker.ozg-sh.de/goofy:e2e-test'
                            }
                        }
                    }
                }
            }
        }

        stage('E2E-Tests') {
            when {
                branch 'master'
            }
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                }

                container("kubectl") {
                    sh 'kubectl rollout restart deployment/goofy -n sh-kiel-e2e'
                    sh 'kubectl rollout status deployment/goofy -n sh-kiel-e2e'

                    sh 'kubectl rollout restart deployment/pluto -n sh-kiel-e2e'
                    sh 'kubectl rollout status deployment/pluto -n sh-kiel-e2e'
                }

                container("cypress") {
                    dir('goofy-client') {
                        sh 'npm run cypress:version'
                        sh 'npm run cypress:ci-run'
                    }
                }
            }
            post {
                always {
                    publishHTML (target: [
                    allowMissing: false,
                    alwaysLinkToLastBuild: false,
                    keepAll: true,
                    reportDir: 'goofy-client/apps/goofy-e2e/reports',
                    reportFiles: 'report.html',
                    reportName: "Goofy E2E-Tests"
                    ])
                }
            }
        }

        stage('Deploy Maven Artifacts to Nexus') {
            when {
                anyOf {
                    branch 'master'
                    branch 'release'
                }
            }
            steps {
                script {
                    FAILED_STAGE = env.STAGE_NAME
                }
                container('maven-11') {
                    configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
                        sh 'mvn -s $MAVEN_SETTINGS -pl -goofy-client -DskipTests deploy'
                    }
                }
            }
        }

        stage('Deploy Goofy') {
            when {
                anyOf {
                    branch 'master'
                    branch 'release'
                }
            }
            
            steps {
                container("docker") {
                    script {
                        withCredentials([usernamePassword(credentialsId: 'jenkins-docker-login', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) {
                            sh 'docker login docker.ozg-sh.de -u ${USER} -p ${PASSWORD}'
                            
                            if (env.BRANCH_NAME == 'release') {
                                sh 'docker tag docker.ozg-sh.de/goofy:build-latest docker.ozg-sh.de/goofy:latest'
                                sh 'docker push docker.ozg-sh.de/goofy:latest'
                            }

                            if (env.BRANCH_NAME == 'master') {
                                sh 'docker tag docker.ozg-sh.de/goofy:build-latest docker.ozg-sh.de/goofy:snapshot-latest'
                                sh 'docker push docker.ozg-sh.de/goofy:snapshot-latest'
                            }
                        }
                    }
                }

                container("kubectl"){
                    script {
                        if (env.BRANCH_NAME == 'release') {
                            sh 'kubectl rollout restart deployment/goofy -n sh-kiel-test'
                            sh 'kubectl rollout status deployment/goofy -n sh-kiel-test'
                        }

                        if (env.BRANCH_NAME == 'master') {
                            sh 'kubectl rollout restart deployment/goofy -n sh-kiel-dev'
                            sh 'kubectl rollout status deployment/goofy -n sh-kiel-dev'
                        }
                    }
                }
            }
        }
    }
}