@Library('postcon.helper')
import postcon.helper.Docker
import postcon.helper.Maven
import postcon.helper.ProjectsBuildStore

node {
  properties([[$class: 'GitLabConnectionProperty', gitLabConnection: 'GITLAB']])

  def imageName
  def Docker
  def maven
  def ProjectsBuildStore
  def scmVars
  def mavenVersion

  def buildRelease = { String branch, String version ->
    def latestVersion = "latest"

    Docker.build(imageName, latestVersion, "Dockerfile")

    if (Docker.push(imageName, latestVersion)) {

      Docker.tag(imageName, latestVersion, version)

      Docker.push(imageName, version)

      ProjectsBuildStore.addBuild("${imageName}:${latestVersion}")
      ProjectsBuildStore.addBuild("${imageName}:${version}")
    }
  }
  try {
    stage('prepare build') {
      updateGitlabCommitStatus name: 'build', state: 'pending'
      scmVars = checkout scm
      imageName = '<%= dockerImage %>'

      Docker = new Docker()
      maven = new Maven()
      ProjectsBuildStore = new ProjectsBuildStore()
      ProjectsBuildStore.init()
    }

    if (ProjectsBuildStore.isSelfTriggered() || ProjectsBuildStore.isTriggeredByUpstream('java:10-stretch')) {
      gitlabCommitStatus {
        stage('maven release') {
          mavenVersion = maven.getVersionFromPOM().replace("-SNAPSHOT", "")
          maven.release()
          sh "echo mavenVersion: '$mavenVersion'"
        }
        stage('docker build') {
          buildRelease("${scmVars.GIT_BRANCH}", mavenVersion)
        }
        stage('deploy') {
          ArrayList<String> params = []
          params.add('<%= javaName %>_port=<%=portForProduction %>')
          params.add('SPRING_PROFILES_ACTIVE=prod')
          params.add("DOCKER_TAG=${mavenVersion}")
          withDockerJpdnv(params) {
            Docker.deployStack('docker-compose.yml', '<%= name %>')
          }
          stage('notify') {
            slackSend channel: "#easy-team", color: "good", message: "Application \"Easy-Suite <%= javaName %>\" version $mavenVersion was deployed successfully on Production."
          }
        }
      }
    }
  } finally {
    stage('cleanup') {
      Docker.cleanImages(imageName)
    }
  }
}
