pipeline {
    agent { label 'linux && amd64' }

    options { 
        buildDiscarder(logRotator(numToKeepStr: '30', daysToKeepStr: '15'))
        gitLabConnection('GitLabConnectionJenkins')
    }

    stages {
        stage('clean previous runs and update gitlab commit status'){
            steps{
                deleteDir()
                updateGitlabCommitStatus(name: 'Build linux', state: 'running')
            }
        }
        stage('Get parameters'){
            parallel{
                stage('Get build options'){
                    steps {
                        script{
                            BUILD_OPTIONS = ' '
                            env.ARCHITECTURE = "amd64"
                            env.BUILD_OPTIONS = sh(script: 'echo "gitlabTriggerPhrase" | grep BUILD_OPTIONS | awk -F "BUILD_OPTIONS="  \'{print \$2}\' | cut -d"\\"" -f2 || :', returnStdout: true).trim()
                            env.DISTRIBUTION = sh(script: 'echo "$gitlabTriggerPhrase" | grep DISTRIBUTION | awk -F "DISTRIBUTION="  \'{print \$2}\' | cut -d\\" -f2', returnStdout: true).trim()
                            if (env.DISTRIBUTION == "")
                                { env.DISTRIBUTION = "xUbuntu_22.04" }
                            println BUILD_OPTIONS
                            println DISTRIBUTION
                        }
                    }
                    post{
                        always {
                            script{                        
                                if (currentBuild.currentResult == 'FAILURE'){
                                    addGitLabMRComment(comment: ":red_circle: ${env.JOB_NAME} FAILURE when getting the additional build parameters :worried:<br/>Build results: [Jenkins [${env.JOB_NAME} ${env.BUILD_DISPLAY_NAME}]](${env.RUN_DISPLAY_URL})<br/>Commit: ${env.GIT_COMMIT}" )
                                }
                            }
                        }
                    }
                }
                stage('Get SDK branch'){
                    steps {
                        script{
                            env.SDK_BRANCH = sh(script: 'echo "$gitlabMergeRequestDescription" | grep SDK_SUBMODULE_TEST | awk -F "SDK_SUBMODULE_TEST="  \'{print \$2}\' | cut -d" " -f1', returnStdout: true).trim()
                            println SDK_BRANCH
                        }
                    }
                    post{
                        always {
                            script{                        
                                if (currentBuild.currentResult == 'FAILURE'){
                                    addGitLabMRComment(comment: ":red_circle: ${env.JOB_NAME} FAILURE when getting the SDK branch :worried:<br/>Build results: [Jenkins [${env.JOB_NAME} ${env.BUILD_DISPLAY_NAME}]](${env.RUN_DISPLAY_URL})<br/>Commit: ${env.GIT_COMMIT}" )
                                }
                            }
                        }
                    }
                }

                stage('get MEGAsync team'){
                    when {
                        expression { 
                            env.gitlabMergeRequestDescription.contains('MEGASYNC_TEAM')
                        }
                    }
                    steps {
                        script{
                            println "${env.gitlabMergeRequestDescription}"
                            env.MEGASYNC_TEAM = sh(script: 'echo "$gitlabMergeRequestDescription" | grep MEGASYNC_TEAM | awk -F "MEGASYNC_TEAM="  \'{print \$2}\' | cut -d" " -f1', returnStdout: true).trim()
                            println MEGASYNC_TEAM
                        }
                    }
                    post{
                        always {
                            script{                        
                                if (currentBuild.currentResult == 'FAILURE'){
                                    addGitLabMRComment(comment: ":red_circle: ${env.JOB_NAME} FAILURE when getting the MEGASYNC team :worried:<br/>Build results: [Jenkins [${env.JOB_NAME} ${env.BUILD_DISPLAY_NAME}]](${env.RUN_DISPLAY_URL})<br/>Commit: ${env.GIT_COMMIT}" )
                                }
                            }
                        }
                    }
                }

            }
        }

        stage('Checkout and Compile Linux'){
            when {
                beforeAgent true
                anyOf {
                    expression { env.gitlabTriggerPhrase != null && env.gitlabTriggerPhrase.startsWith('trigger compilation')  }
                    allOf{
                        expression { env.gitlabTriggerPhrase == null }
                        triggeredBy "GitlabWebhookCause" 
                    }
                }
            }
            options{
                timeout(time: 120, unit: 'MINUTES')
            }
            steps {
                checkout([
                    $class: 'GitSCM', 
                    branches: [[name: "origin/${env.gitlabSourceBranch}"]],
                    userRemoteConfigs: [[ url: "${env.GIT_URL_DESKTOP}", credentialsId: "12492eb8-0278-4402-98f0-4412abfb65c1" ]],
                    extensions: [
                        [$class: "UserIdentity",name: "jenkins", email: "jenkins@jenkins"],
                        [$class: 'PreBuildMerge', options: [fastForwardMode: 'FF', mergeRemote: "origin", mergeStrategy: 'DEFAULT', mergeTarget: "${env.gitlabTargetBranch}"]]
                        ]
                ])
                script { 
                    linux_sources_workspace = WORKSPACE
                }
                dir('src/MEGASync/mega'){
                    sh "echo Cloning SDK branch ${SDK_BRANCH}"
                    checkout([
                        $class: 'GitSCM',
                        branches: [[name: "origin/${SDK_BRANCH}"]],
                        userRemoteConfigs: [[ url: "${env.GIT_URL_SDK}", credentialsId: "12492eb8-0278-4402-98f0-4412abfb65c1" ]],
                        extensions: [
                            [$class: "UserIdentity",name: "jenkins", email: "jenkins@jenkins"]
                        ]
                    ])
                }
                dir("${linux_sources_workspace}/src") {
                    sh "./configure -f -g"
                    sh "qmake \"CONFIG+=with_tests\" ${env.BUILD_OPTIONS}"
                    sh "lupdate MEGASync/MEGASync.pro"
                    sh "lrelease MEGASync/MEGASync.pro"
                    sh "make clean"
                    sh "make"
                }                
            }
            post{
                always {
                    script{
                        if (currentBuild.currentResult == 'SUCCESS'){
                            addGitLabMRComment(comment: ":white_check_mark: ${currentBuild.projectName} :penguin: <b>Linux</b> SUCCEEDED :muscle:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                            updateGitlabCommitStatus(name: 'Build linux', state: 'success')
                        }                                
                        if (currentBuild.currentResult == 'FAILURE'){
                            addGitLabMRComment(comment: ":red_circle: ${currentBuild.projectName} :penguin: <b>Linux</b> FAILURE  :worried:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                            updateGitlabCommitStatus(name: 'Build linux', state: 'failed')
                        }
                        if (currentBuild.currentResult == 'ABORTED'){
                            addGitLabMRComment(comment: ":interrobang: ${currentBuild.projectName} :penguin: <b>Linux</b> ABORTED  :confused:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                            updateGitlabCommitStatus(name: 'Build linux', state: 'canceled')
                        }                                
                        if (currentBuild.currentResult == 'UNSTABLE'){
                            addGitLabMRComment(comment: ":interrobang: ${currentBuild.projectName} :penguin: <b>Linux</b> UNSTABLE  :confused:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                            updateGitlabCommitStatus(name: 'Build linux', state: 'failed')
                        }
                    }
                }
            }
        }


        stage('Checkout and build packages'){
            when {
                beforeAgent true
                expression { env.gitlabTriggerPhrase != null && (env.gitlabTriggerPhrase == 'trigger package' || env.gitlabTriggerPhrase.startsWith('trigger package linux'))  }
            }
            agent { label 'docker && ci-debian-11-64-2' }
            stages{
                stage('Checkout linux'){
                    steps {
                        checkout([
                            $class: 'GitSCM', 
                            branches: [[name: "origin/${env.gitlabSourceBranch}"]],
                            userRemoteConfigs: [[ url: "${env.GIT_URL_DESKTOP}", credentialsId: "12492eb8-0278-4402-98f0-4412abfb65c1" ]],
                            extensions: [
                                [$class: "UserIdentity",name: "jenkins", email: "jenkins@jenkins"],
                                ]
                        ])
                        script{
                            linux_sources_workspace = WORKSPACE
                        }
                        dir('src/MEGASync/mega'){
                            sh "echo Cloning SDK branch ${SDK_BRANCH}"
                            checkout([
                                $class: 'GitSCM',
                                branches: [[name: "origin/${SDK_BRANCH}"]],
                                userRemoteConfigs: [[ url: "${env.GIT_URL_SDK}", credentialsId: "12492eb8-0278-4402-98f0-4412abfb65c1" ]],
                                extensions: [
                                    [$class: "UserIdentity",name: "jenkins", email: "jenkins@jenkins"]
                                ]
                            ])
                        }
                    }
                }
                stage('Build linux package'){
                    options {
                        timeout(time: 120, unit: 'MINUTES')
                    }
                    steps {
                        echo "Do Build for $DISTRIBUTION-$ARCHITECTURE"
                        dir(linux_sources_workspace){
                            lock(resource: "$DISTRIBUTION-$ARCHITECTURE-MEGAsync-build", quantity: 1, ){
                                sh "/opt/buildTools/build/buildManager.sh -a $ARCHITECTURE -j 1 build $DISTRIBUTION . megasync"
                                sh "/opt/buildTools/repo/repoManager.sh add /srv/builder/results/$DISTRIBUTION/$ARCHITECTURE/megasync/ $DISTRIBUTION"
                                sh "SIGN_KEY_PATH=/srv/sign_test/ /opt/buildTools/repo/repoManager.sh build -n $DISTRIBUTION"
                            }
                        }
                    }
                }
                stage ('Upload Linux package') {
                    steps {
                        dir(linux_sources_workspace){
                            script{
                                sh "jf rt del MEGAsync-sprints/$MEGASYNC_TEAM/${env.gitlabMergeRequestIid}/linux/$DISTRIBUTION"
                                sh "cd /srv/repo/private/$DISTRIBUTION && jf rt upload --regexp '(megasync.*deb\$|megasync.*rpm\$|megasync.*\\.pkg\\.tar\\.zst\$|megasync.*\\.pkg\\.tar\\.xz\$)' MEGAsync-sprints/$MEGASYNC_TEAM/${env.gitlabMergeRequestIid}/linux/$DISTRIBUTION/"
                            }
                        }
                    }
                }
            }
            post {
                always {
                    script{
                        if (currentBuild.currentResult == 'SUCCESS'){
                            addGitLabMRComment(comment: ":white_check_mark: ${currentBuild.projectName} :penguin: <b>LINUX</b>  SUCCEEDED :muscle:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}<br/>Packages URL: [${env.REPO_URL}/MEGAsync-sprints/$MEGASYNC_TEAM/${env.gitlabMergeRequestIid}/linux/$DISTRIBUTION]" )
                            updateGitlabCommitStatus(name: 'Linux build', state: 'success')
                        }
                        if (currentBuild.currentResult == 'FAILURE'){
                            addGitLabMRComment(comment: ":red_circle: ${currentBuild.projectName} :penguin: <b>LINUX</b> FAILURE  :worried:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                            updateGitlabCommitStatus(name: 'Linux build', state: 'failed')
                            error "Job failed"
                        }
                    }
                }
            }
        }



    }
        
}
