def remote = [:]
remote.name = "dind-ssh"
remote.host = "dind"
remote.port = 22
remote.user = "  "
remote.password = "  "
remote.allowAnyHosts = true

pipeline {
    agent any

    environment {
        // get APPNAME
        // APPNAME = "Sers"
        APPNAME = readFile("Publish/environment/env.APPNAME.txt")

        envName = readFile("Publish/environment/env.envName.txt")
        versionSuffix = "-${envName}${env.build_number}"

        // basePath = "/root/docker-cache/jenkins/jenkins_home/workspace/${APPNAME}/${envName}/${env.BRANCH_NAME}/${env.build_number}"
        basePath = "${env.WORKSPACE}"

        // NUGET_PATH = "/root/docker-cache/jenkins/jenkins_home/workspace/.nuget"
        NUGET_PATH = credentials("NUGET_PATH")
        NUGET_SERVER = credentials("NUGET_SERVER")
        NUGET_KEY = credentials("NUGET_KEY")

        DOCKER_SERVER = credentials("DOCKER_SERVER")
        DOCKER_ImagePrefix = "${DOCKER_SERVER}/${envName}/"
        DOCKER_Buildx = false
        DOCKER_USERNAME = " "
        DOCKER_PASSWORD = " "

        // set to "  "  if want to skip save releaseFiles to WebDav
        WebDav_BaseUrl = credentials("WebDav_BaseUrl")
        // WebDav_User = "username:pwd"
        WebDav_User = credentials("WebDav_User")

        build_crossPlatform = "no"

        dind_ssh_account = credentials("dind_ssh_account")
    }

    stages {

        stage('#1 deploy ?') {
            steps {
                timeout(time:600,unit:'SECONDS') {
                    script {
                        remote.user = "${dind_ssh_account_USR}"
                        remote.password = "${dind_ssh_account_PSW}"

                        env.codePath = "/root/docker-cache/jenkins/" + basePath.substring(5, basePath.length()) 

                        echo "-------- APPNAME: [$APPNAME]"
                        echo "-------- basePath: [$basePath]"
                        echo "-------- DOCKER_ImagePrefix: [$DOCKER_ImagePrefix]"
                        echo "-------- codePath: [$codePath]"

                        if ( fileExists("Publish/environment/jenkins_NoNeedApprovalForBuild.txt") ) {
                            echo "-------- do not need approval for build"
	                        env.ApprovalForBuild = "yes"
                        } else {
                            echo "-------- waiting approval for build"
	                        env.ApprovalForBuild = "no"
	                        env.ApprovalForBuild = input message: "deploy ?", 
		                        ok: 'Proceed?', 
		                        parameters: [choice(choices:["yes","no"], description: 'if not please select no', name: 'choice')]
                        }

                    }
                }
            }
        }

        stage('#2 change version') {
            when { expression { env.ApprovalForBuild == "yes" } }
            steps {
                script {
                    echo "#2.1 change-app-version"
                    sshCommand remote: remote, command:  "sh -c 'set -e; export versionSuffix=$versionSuffix;    cd $codePath/Publish/DevOps3/build-bash; source 22.add-suffix-to-app-version.bash;    echo -n \"\$nextAppVersion\" > $codePath/Publish/environment/env.appVersion.txt '"

                    echo "#2.2 get app version"
                    env.appVersion = readFile("Publish/environment/env.appVersion.txt")
                    echo "-------- appVersion: [${env.appVersion}]"
                }
            }
        }

        stage('#3.0 build - run test') {
            when { expression { env.ApprovalForBuild == "yes" } }
            steps {
                script {
                    sshCommand remote: remote, command:  "sh -c 'set -e; export APPNAME=$APPNAME; export NUGET_PATH=$NUGET_PATH;    cd $codePath/Publish/DevOps3/build-bash; sh 10.Test.bash;  '"
                }
            }
        }

        stage('#3.1 build - single platflorm') {
            when { expression { env.ApprovalForBuild == "yes" } }
            steps {
                script {
                    sshCommand remote: remote, command:  "sh -c 'set -e; export APPNAME=$APPNAME; export NUGET_PATH=$NUGET_PATH;    cd $codePath/Publish/DevOps3/build-bash; sh startup.bash;  '"
                }
            }
        }

        stage('#3.2 build - cross platform') {
            when { expression { env.ApprovalForBuild == "yes" && env.build_crossPlatform == "yes" } }
            steps {
                script {
                    sshCommand remote: remote, command:  "sh -c 'set -e; export APPNAME=$APPNAME; export NUGET_PATH=$NUGET_PATH;    cd $codePath/Publish/DevOps3/build-bash; sh 40.Station-publish-multiple.bash;  '"
                }
            }
        }

        stage('#4 publish') {
            when { expression { env.ApprovalForBuild == "yes" } }
            steps {
                script {
                    sshCommand remote: remote, command:  "sh -c 'set -e; export APPNAME=$APPNAME;export NUGET_PATH=$NUGET_PATH;    export NUGET_SERVER=$NUGET_SERVER;export NUGET_KEY=$NUGET_KEY;  export DOCKER_Buildx=${env.DOCKER_Buildx};export DOCKER_ImagePrefix=${env.DOCKER_ImagePrefix};export DOCKER_USERNAME=${env.DOCKER_USERNAME};export DOCKER_PASSWORD=${env.DOCKER_PASSWORD};export DOCKER_BuildxExtArgs=\"--output=type=registry,registry.insecure=true\";    cd $codePath/Publish/DevOps3/release-bash; sh startup.bash;  '"
                }
            }
        }

        stage('#5 save releaseFiles') {
            when { expression { env.ApprovalForBuild == "yes" && env.WebDav_BaseUrl != "  " } }
            steps {
                script {
                    sshCommand remote: remote, command:  "sh -c 'set -e; export basePath=\"$codePath\"; export APPNAME=$APPNAME; export appVersion=\"$appVersion\";   export WebDav_BaseUrl=\"$WebDav_BaseUrl\"; export WebDav_User=\"$WebDav_User\";    cd $codePath/Publish/DevOps3/release-bash; sh 78.push-releaseFiles-to-webdav.bash;  '"
                }
            }
        }

    }

    post {
        always {
            timeout(time:600,unit:'SECONDS') {
                script {
                    env.CleanFiles = "yes"
                    env.CleanFiles = input message: "Clean temp files, \n will wait for 3600 seconds. \n click abort to skip clean.", 
                            ok: 'Proceed', 
                            parameters: [choice(choices:["yes","no"], name: 'choice')]
               }
            }
            script {
                if ( CleanFiles == "yes" ) {
                    echo "clean up workspace directory"
                    cleanWs()

                    // clean up tmp directory
                    dir("${workspace}@tmp") {
                        deleteDir()
                    }
                }
            }
        }
        success {
            echo "build success !"
        }
        failure {
            echo "build failure !"
        }
        aborted {
            echo "build aborted !"
        }
    }
}