// MouseSoft Draw.io Export jenkins declarative pipeline

pipeline {
    agent { label 'go' }
    options {
        ansiColor('css')
        timestamps()
        buildDiscarder(logRotator(numToKeepStr: '10'))
        skipDefaultCheckout()
        timeout(time: 8, unit: 'MINUTES', activity: true)
    }
    environment {
        PROJECT_OWNER = 'ms'
        PROJECT_ID = 'drawio-export'
        PROJECT_NAME = 'MouseSoft Draw.IO Export'
        ROCKET_TITLE = "${currentBuild.fullDisplayName} (<${env.BUILD_URL}|Open>)"
        RELEASE_ID = 0
    }
    stages {
        stage('Build') {
            parallel {
                stage('Build Linux') {
                    steps {
                        echo "***** BUILD ${PROJECT_NAME} on Linux *****"
                        msSendRocketChat("${ROCKET_TITLE}", msBuildInfo(currentBuild), 'black')
                        cleanWs(disableDeferredWipeout: true, deleteDirs: true)
                        checkout scm
                        sh '''#!/bin/bash
                        make clean vendor lint build dist doc
                        '''
                    }
                }
                stage('Build Windows') {
                    agent{ label 'windows' }
                    environment {
                        GO_OPT = ' '
                        CGO_ENABLED = 0
                    }
                    steps {
                        echo "***** BUILD ${PROJECT_NAME} on Windows *****"
                        cleanWs(disableDeferredWipeout: true, deleteDirs: true)
                        catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') {
                            checkout scm
                            bat 'make clean vendor build dist'
                        }
                    }
                    post {
                        always {
                            script {
                                if (getContext(hudson.FilePath)) {
                                    archiveArtifacts (
                                        artifacts: 'out/*.zip,out/*.msi',
                                        allowEmptyArchive: true,
                                        fingerprint: true,
                                        onlyIfSuccessful: true,
                                    )
                                }
                            }
                        }
                    }
                }
            }
        }
        stage('Test') {
            environment {
                EXPORT_RESULT = true
                COVERAGE_FORMAT = 'xml'
            }
            steps {
                echo "===== TEST ${PROJECT_NAME} ====="
                sh '''#!/bin/bash
                make test coverage
                '''
            }
        }
        stage('Doc') {
            when { anyOf {
                branch 'main'
                branch 'develop'
                branch 'release/*'
                branch 'support/*'
                tag 'v*'
            } }
            environment {
                DOC_FORMAT = 'pdf'
            }
            steps {
                echo "===== MAKE ${PROJECT_NAME} Documentation ====="
                sh '''#!/bin/bash
                make doc
                '''
            }
        }
        stage('Draft Release') {
            when { tag 'v*' }
            steps {
                script {
                    def version = "${TAG_NAME}".substring(1)
                    RELEASE_ID = msCreateRelease(
                        "${PROJECT_OWNER}",
                        "${PROJECT_ID}",
                        "${TAG_NAME}",
                        "${PROJECT_NAME}",
                    )
                }
            }
        }
        stage('Release') {
            parallel {
                stage('Release Linux') {
                    when { tag 'v*' }
                    environment {
                        OUTDIR = 'dist'
                        DIST_TAG = 'empty'
                        GO_LDFLAGS = '-w'
                        GO_OPT = ' '
                    }
                    steps {
                        echo "***** RELEASE ${PROJECT_NAME} for Linux *****"
                        sh '''#!/bin/bash
                        make build package
                        find -O1 dist/ -name '*.changes' -exec dput mousesoft \\{\\} \\;
                        '''
                        script {
                            msUploadFilesToRelease(
                                "${PROJECT_OWNER}",
                                "${PROJECT_ID}",
                                RELEASE_ID,
                                ['dist/*.deb'],
                            )
                            if( currentBuild.currentResult == 'SUCCESS' ) {
                                currentBuild.keepLog = true
                            }
                        }
                        msSendRocketChat("${ROCKET_TITLE}", "Released assets for Linux", 'blue')
                    }
                }
                stage('Release Windows') {
                    agent{ label 'windows' }
                    when { tag 'v*' }
                    environment {
                        OUTDIR = 'dist'
                        DIST_TAG = 'empty'
                        GO_LDFLAGS = '-w'
                        GO_OPT = ' '
                    }
                    steps {
                        echo "***** RELEASE ${PROJECT_NAME} for Windows *****"
                        bat 'make build package'
                        script {
                            msUploadFilesToRelease(
                                "${PROJECT_OWNER}",
                                "${PROJECT_ID}",
                                RELEASE_ID,
                                ['dist/*.msi'],
                            )
                            if( currentBuild.currentResult == 'SUCCESS' ) {
                                currentBuild.keepLog = true
                            }
                        }
                        msSendRocketChat("${ROCKET_TITLE}", "Released assets for Windows", 'blue')
                    }
                    post {
                        success {
                            archiveArtifacts (
                                artifacts: 'dist/*.msi',
                                allowEmptyArchive: false,
                                fingerprint: true,
                            )
                        }
                    }
                }
            }
        }
    }

    post {
        always {
            script {
                if (getContext(hudson.FilePath)) {
                    junit (
                        testResults: 'out/junit-report.xml',
                        allowEmptyResults: true,
                        skipPublishingChecks: true,
                    )
                    cobertura (
                        coberturaReportFile: 'out/coverage.xml',
                        failNoReports: false,
                    )
                    archiveArtifacts (
                        artifacts: 'out/*.tar.*,out/*.zip',
                        allowEmptyArchive: false,
                        fingerprint: true,
                        onlyIfSuccessful: true,
                    )
                    archiveArtifacts (
                        artifacts: 'out/doc/*.pdf',
                        allowEmptyArchive: true,
                        fingerprint: true,
                        onlyIfSuccessful: true,
                    )
                    if (currentBuild.result == 'SUCCESS') {
                        publishHTML(target: [
                            allowMissing: true,
                            alwaysLinkToLastBuild: true,
                            keepAll: false,
                            reportDir: 'out/doc/html',
                            reportFiles: 'index.html',
                            reportTitles: 'Техническая документация',
                            reportName: 'Documentation',
                        ])
                    }
                }
                if( currentBuild.result != 'SUCCESS' ) {
                    currentBuild.keepLog = false
                }
                def timeSec = currentBuild.duration / 1000
                msSendRocketChat(
                    "${ROCKET_TITLE}",
                    "Build ${currentBuild.result} after ${timeSec} sec",
                    msBuildResultColor(),
                )
            }
        }
    }
}