node {
    stage 'Clone the project'
    git 'https://github.com/dassiorleando/tutorials.git'

    dir('spring-jenkins-pipeline') {
        stage("Compilation and Analysis") {
            parallel 'Compilation': {
                if (isUnix()) {
                    sh "./mvnw clean install -DskipTests"
                } else {
                    bat "./mvnw.cmd clean install -DskipTests"
                }
            }, 'Static Analysis': {
                stage("Checkstyle") {
                    if (isUnix()) {
                        sh "./mvnw checkstyle:checkstyle"

                        step([$class: 'CheckStylePublisher',
                          canRunOnFailed: true,
                          defaultEncoding: '',
                          healthy: '100',
                          pattern: '**/target/checkstyle-result.xml',
                          unHealthy: '90',
                          useStableBuildAsReference: true
                        ])
                    } else {
                        bat "./mvnw.cmd checkstyle:checkstyle"

                        step([$class: 'CheckStylePublisher',
                          canRunOnFailed: true,
                          defaultEncoding: '',
                          healthy: '100',
                          pattern: '**\target\checkstyle-result.xml',
                          unHealthy: '90',
                          useStableBuildAsReference: true
                        ])
                    }
                }
            }
        }

        stage("Tests and Deployment") {
            parallel 'Unit tests': {
                stage("Runing unit tests") {
                    if (isUnix()) {
                        sh "./mvnw test -Punit"

                        step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml'])
                    } else {
                        bat "./mvnw.cmd test -Punit"

                        step([$class: 'JUnitResultArchiver', testResults: '**\target\surefire-reports\TEST-*UnitTest.xml'])
                    }
                }
            }, 'Integration tests': {
                stage("Runing integration tests") {
                    if (isUnix()) {
                        sh "./mvnw test -Pintegration"

                        step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*IntegrationTest.xml'])
                    } else {
                        bat "./mvnw.cmd test -Pintegration"

                        step([$class: 'JUnitResultArchiver', testResults: '**\target\surefire-reports\TEST-*IntegrationTest.xml'])
                    }
                }
            }, 'Deployment': {
                stage("Staging") {
                    if (isUnix()) {
                        sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid || kill -KILL \$pid"
                    } else {
                        bat "FOR /F 'tokens=5 delims= ' %%P IN ('netstat -ano ^| findstr :8989') DO TaskKill.exe /PID %%P"
                    }

                    withEnv(['JENKINS_NODE_COOKIE=dontkill']) {
                        if (isUnix()) {
                            sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &'
                        } else {
                            bat 'start ./mvnw.cmd spring-boot:run -Dserver.port=8989'
                        }
                    }
                }
            }
        }
    }
}