Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents

...

Create New Item

Click pipeline

...

Discard Old builds

...

...

Build Triggers

Bild periodically

Minute(0-59) Hour(0-23) DayOfMonth(1-31) Month(1-12) DayOfWeek(0-6, Sunday to Saturday)

...

Code Block
# Monday to Friday, every 13:00, 22:00
triggers {
   cron('00 13,22 * * 1-5')
}

...

Use Credential

Code Block
  GIT_CREDENTIAL = "a71612d3-0209-4503-9b2f-a9ea321d2426"
    SLACK_TOKEN = "slacktoken"

...

Slack Notification

...

Parameter

...

ssh publisher

...

Pipeline Script

Code Block
properties([
  parameters([
    /* To write Custom branch for developer when you select custom option on ascendant parameter
      ascendant parameter : GIT_BRANCH
      Default value: custom
      * Must be write created branch on your git
      ex) JIRANAME_ISSUEID(ICE4-120)
    */
    [$class: 'DynamicReferenceParameter',
      choiceType: 'ET_FORMATTED_HTML',
      name: 'GIT_BRANCH_CUSTOM',
      referencedParameters: 'GIT_BRANCH',
      description: '',
      omitValueField: true,
      script: [
      $class: 'GroovyScript',
        script: [
          classpath: [],
          sandbox: false,
          script: '''
            switch(GIT_BRANCH){
            case~/.*custom.*/:
              return """<input name="value" value="custom" class="setting-input" type="text">"""
              break
            default:
              return ""
              break
            }
          '''
        ],
        fallbackScript: [
          classpath: [],
          sandbox: false,
          script: "return ''"
        ],
      ]
    ],
  ])
])

// To get build user name
def specificCause = currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')

pipeline {
  agent any
  tools {
    nodejs "NODE_HOME"
  }
  /* Build periodically
  (Minute Hour DayOfMonth Month DayOfWeek)
  Minute(0-59) Hour(0-23) DayOfMonth(1-31) Month(1-12) DayOfWeek(0-6, Sunday to Saturday)
  ('00 11 * * 1-5') - 11:00 AM every Monday to Friday
  */ triggers {
        cron('00 13,22 * * 1-5')
      }

  /* To set up env to use jenkins script
    Credential - GIT_CREDENTIAL, SLACK_TOKEN
      -> set up Http://${JENKINS_HOME}/Credentials
    GIT_URL
    SLACK_CHANNEL
  */
  environment {
    GIT_URL = "http://dcsf-dev08.i-on.net/dxp/backendcore.git"
    GIT_BRANCH = "develop"
    GIT_CREDENTIAL = "a71612d3-0209-4503-9b2f-a9ea321d2426"
    SLACK_TOKEN = "slacktoken"
    SLACK_CHANNEL = "#jenkins-test"
    RED = "#F25749"
    GREEN = "#50BFA0"
    YELLOW = "#F2C438"
    BLUE = "#34A6BF"
  }
  parameters {
    // Option for Git checkout use
    booleanParam(name: 'UES_GIT_CHECKOUT', defaultValue: true)
    // Option for Build
    booleanParam(name: 'USE_BUILD', defaultValue: true)
    // Option for TEST
    booleanParam(name: 'USE_TEST', defaultValue: true)
    // Option for DEPLOY
    booleanParam(name: 'USE_DEPLOY', defaultValue: true)
    // Option for SWITCH
    booleanParam(name: 'USE_SWITCH', defaultValue: true)
    // Back-Up cache
    booleanParam(name: 'BACKUP_CACHE', defaultValue: true)
    // Delete Jenkins Workspace
    booleanParam(name: 'DELETE_JENKINS_WORKSPACE', defaultValue: true)
    // Delete cache
    booleanParam(name: 'DELETE_CACHE', defaultValue: false)
    // Delete project on docker
    booleanParam(name: 'DELETE_PROJECT', defaultValue: false)
    // Create project on docker
    booleanParam(name: 'CREATE_PROJECT', defaultValue: false)
    // Docker PORT
    choice(name: 'DOCKER_PORT', choices: [ '8080' ])
//     string(name: 'DOCKER_PORT', defaultValue: '8080')
    choice(name: 'NGINX_PORT', choices: [ '8080' ])
//     string(name: 'NGINX_PORT', defaultValue: '8080')
    // SSH SERVER INFORMAION ex) dev, stg, prd, test
    choice(name: 'SERVER_LEVEL', choices: [ 'dev' ])
    // Select Git branch
    choice(name: 'GIT_BRANCH', choices: [ "develop", "project/EMMP", "custom"])
  }
  stages {
    // Whole Flow Check
    stage('Flow Check') {
      steps {
        script {
          echo "Flow Check \nUES_GIT_CHECKOUT = ${UES_GIT_CHECKOUT} \nUSE_BUILD = ${USE_BUILD} \nUSE_TEST = ${USE_TEST} \nUSE_DEPLOY = ${USE_DEPLOY} \nUSE_SWITCH = ${USE_SWITCH} \nBACKUP_CACHE = ${BACKUP_CACHE} \nDELETE_CACHE = ${DELETE_CACHE}\nDELETE_PROJECT = ${DELETE_PROJECT}\nCREATE_PROJECT = ${CREATE_PROJECT}"
          // send slack message to notify start build process

        }
      }
    }
    // Parameter Check except of credential
    stage('Parameter Check') {
      steps {
        script {
          echo "SERVER_LEVEL = ${SERVER_LEVEL} \nSelected GIT URL = ${GIT_URL} \nBranch = ${GIT_BRANCH} ${GIT_BRANCH_CUSTOM} \n"
        }
      }
    }
    /* Git Check out
      UES_GIT_CHECKOUT = Use,
      Must be selected to check out git source
      Git Url : GIT_URL
      Git Branch : GIT_BRANCH or GIT_BRANCH_CUSTOM
      Auth : GIT_CREDENTIAL
    */
    stage('GIT Check Out') {
      steps {
        script {
          if(UES_GIT_CHECKOUT.equals("true")){
            echo "Git Check out Start"
            if(GIT_BRANCH != "custom"){
              git branch: "${GIT_BRANCH}", credentialsId: "${GIT_CREDENTIAL}", url: "${GIT_URL}"
              echo "Git Check out Finish: ${GIT_BRANCH}"
            } else if(GIT_BRANCH.equals("custom")){
              git branch: "${GIT_BRANCH_CUSTOM}", credentialsId: "${GIT_CREDENTIAL}", url: "${GIT_URL}"
              echo "Git Check out Finish: ${GIT_BRANCH_CUSTOM}"
            }
          } else {
            echo "Git Check out SKIP"
          }

          // echo "author = ${author}"
          // echo "last commit message = ${message}"

          slackSend (
            message: "Build Start ${currentBuild.fullDisplayName} (<${BUILD_URL}|Open>)\nServer : ${SERVER_LEVEL}\nGit Branch: ${GIT_BRANCH} ${GIT_BRANCH_CUSTOM} \nBuild Start By `${specificCause.userName[0]}`",
            username: "${JOB_NAME}",
            channel: "${SLACK_CHANNEL}",
            color: "${GREEN}",
            tokenCredentialId: "${SLACK_TOKEN}",
          )
        }
      }
    }
    stage('Build') {
      steps {
        script{
          if(USE_BUILD.equals("true")){
            echo "Gradle Clean and Build start"
            withGradle {
                sh './gradlew clean build -x test --refresh-dependencies --stacktrace'
            }
            echo "Gradle Clean and Build end"
          }else{
            echo "Build/Launch skip"
          }
        }
      }
    }
    stage('Backup/Clean') {
      stages{
        stage('Backup Cache') {
          steps {
            script{
              if(BACKUP_CACHE.equals("true")){
                echo "Backup Cache start"
                sshPublisher(
                  publishers: [
                    sshPublisherDesc(
                      configName: "${SERVER_LEVEL}",
                      transfers: [
                        sshTransfer(
                          remoteDirectory: "${JOB_BASE_NAME}",
                          execCommand: '''pwd
                            ~/${JOB_BASE_NAME}/shell/ice4-aws-all.sh backup ${JOB_BASE_NAME} ${SERVER_LEVEL}
                          ''' ,
                          excludes: '',
                          cleanRemote: false,
                          execTimeout: 1280000,
                          flatten: false,
                          makeEmptyDirs: false,
                          noDefaultExcludes: false,
                          patternSeparator: '[, ]+',
                          remoteDirectorySDF: false,
                    )],
                    usePromotionTimestamp: false,
                    useWorkspaceInPromotion: false,
                    verbose: false
                )])
                echo "Cache backup finish"
              } else {
                echo "Cache backup skip"
              }
            }
          }
        }
        stage('Delete Cache'){
          steps {
            script{
              if(DELETE_CACHE.equals("true")){
                echo "Cache Delete start"
                sshPublisher(
                publishers: [
                  sshPublisherDesc(
                    configName: "${SERVER_LEVEL}",
                    transfers: [
                      sshTransfer(
                        remoteDirectory: "${JOB_BASE_NAME}",
                        execCommand: '''pwd
                            ~/${JOB_BASE_NAME}/shell/ice4-aws-all.sh delete ${JOB_BASE_NAME} ${SERVER_LEVEL}
                            ''',
                        excludes: '',
                        cleanRemote: false,
                        execTimeout: 1280000,
                        flatten: false,
                        makeEmptyDirs: false,
                        noDefaultExcludes: false,
                        patternSeparator: '[, ]+',
                        remoteDirectorySDF: false,
                      )],
                    usePromotionTimestamp: false,
                    useWorkspaceInPromotion: false,
                    verbose: false
                )])
                echo "Cache Delete Finish"
              }else {
                echo "Cache Delete skip"
              }
            }
          }
        }
        /* Delete All Project Files
          DELETE_CACHE = Use,
            Must be selected to delete All Project Files
          Process:
            Docker stop
            Remove Folder
            Make Folder
            Give Authrisation as a 775
          configName: select SSH server which server run project.
            ${SERVER_LEVEL} parameter use to access. (ex. dev, stg, prd)
          remoteDirectory: link directory
            ${JOB_BASE_NAME} parameter use to link directory
          execCommand: to use Shell command line
          excludes: To excludes file when send file into SSH server
        */
        stage('Delete Project'){
          steps {
            script{
              if(DELETE_PROJECT.equals("true")){
                echo "Delete Project Start"
                retry(3) {
                    sshPublisher(
                    publishers: [
                        sshPublisherDesc(
                        configName: "${SERVER_LEVEL}",
                        transfers: [
                        sshTransfer(
                            remoteDirectory: "${JOB_BASE_NAME}",
                            execCommand: '''pwd
                                docker stop ${JOB_BASE_NAME}
                                docker rm -f ${JOB_BASE_NAME}
                                docker rmi -f ${JOB_BASE_NAME}
                                sudo rm -rf  ~/${JOB_BASE_NAME}
                                ''',
                            excludes: '',
                            cleanRemote: false,
                            execTimeout: 1280000,
                            flatten: false,
                            makeEmptyDirs: false,
                            noDefaultExcludes: false,
                            remoteDirectorySDF: false,
                            patternSeparator: '[, ]+',
                        )],
                        usePromotionTimestamp: false,
                        useWorkspaceInPromotion: false,
                        verbose: false
                    )])
                }
                echo "Delete Project Finish"
              }else {
                echo "Delete Project Stop"
              }
            }
          }
        }
      }
    }
    stage('Deploy') {
      stages{
        stage('Create Docker Image') {
          steps{
            script {
              echo "Create docker image start"
              if(USE_DEPLOY.equals("true") && CREATE_PROJECT.equals("true")){
                sshPublisher(
                  publishers: [
                    sshPublisherDesc(
                      configName: "${SERVER_LEVEL}",
                      transfers: [
                        sshTransfer(
                          remoteDirectory: "${JOB_BASE_NAME}",
                          execCommand: '''pwd
                          chmod 775 -R ~/${JOB_BASE_NAME}
                          mkdir ~/${JOB_BASE_NAME}/resource && chmod 775 -R ~/${JOB_BASE_NAME}/resource
                          docker image build -f ~/${JOB_BASE_NAME}/Dockerfile -t ${JOB_BASE_NAME} ./${JOB_BASE_NAME} --build-arg SERVER_LEVEL=${SERVER_LEVEL} --build-arg JENKINS_WORKSPACE=${JOB_BASE_NAME} --build-arg DOCKER_PORT=${DOCKER_PORT}
                          docker container run --restart="always" --privileged -d -p 8443:8443 -p 5701:5701 -p ${NGINX_PORT}:${DOCKER_PORT} -v ~/${JOB_BASE_NAME}:/root/core --name ${JOB_BASE_NAME} ${JOB_BASE_NAME}:latest
                          ~/${JOB_BASE_NAME}/shell/ice4-aws-all.sh cacheLoad ${JOB_BASE_NAME} ${SERVER_LEVEL} initload
                          ''',
                          excludes: '',
                          cleanRemote: false,
                          execTimeout: 2560000,
                          flatten: false,
                          makeEmptyDirs: false,
                          noDefaultExcludes: false,
                          patternSeparator: '[, ]+',
                          remoteDirectorySDF: false,
                          sourceFiles: '**/*.war, shell/backendCore-aws-all.sh, shell/ice4-aws-all.sh, Dockerfile'
                    )],
                    usePromotionTimestamp: false,
                    useWorkspaceInPromotion: false,
                    verbose: false
                )])
                echo "create docker image finish"
              }else {
                echo "create docker image Skip"
              }
            }
          }
        }
        stage('Restart Docker Container') {
          steps {
              retry(5) {
                script {
                  if(USE_DEPLOY.equals("true") && CREATE_PROJECT != "true" && DELETE_CACHE !="true"){
                    echo "Restart Docker Container start"
                    sshPublisher(
                      publishers: [
                        sshPublisherDesc(
                          configName: "${SERVER_LEVEL}",
                          transfers: [
                            sshTransfer(
                              remoteDirectory: "${JOB_BASE_NAME}",
                              execCommand: '''pwd
                              docker restart ${JOB_BASE_NAME}
                              ~/${JOB_BASE_NAME}/shell/ice4-aws-all.sh cacheLoad ${JOB_BASE_NAME} ${SERVER_LEVEL} initload
                              ''',
                              excludes: '',
                              cleanRemote: false,
                              execTimeout: 2560000,
                              flatten: false,
                              makeEmptyDirs: false,
                              noDefaultExcludes: false,
                              patternSeparator: '[, ]+',
                              remoteDirectorySDF: false,
                              sourceFiles: '**/*.war,shell/backendCore-aws-all.sh, shell/ice4-aws-all.sh'
                        )],
                        usePromotionTimestamp: false,
                        useWorkspaceInPromotion: false,
                        verbose: false
                    )])
                    echo "Restart Docker Container finish"
                  }else{
                    echo "Restart Docker Container skip"
                  }
                }
              }
          }
        }
        stage('Restart Docker Container - Delete Cache') {
          steps {
            retry(5) {
              script {
                if(USE_DEPLOY.equals("true") && CREATE_PROJECT != "true" && DELETE_CACHE.equals("true")){
                  echo "Restart Docker Container start"
                  sshPublisher(
                    publishers: [
                      sshPublisherDesc(
                        configName: "${SERVER_LEVEL}",
                        transfers: [
                          sshTransfer(
                            remoteDirectory: "${JOB_BASE_NAME}",
                            execCommand: '''pwd
                            docker restart ${JOB_BASE_NAME}
                            ~/${JOB_BASE_NAME}/shell/ice4-aws-all.sh cacheLoad ${JOB_BASE_NAME} ${SERVER_LEVEL} initload
                            ''',
                            excludes: '',
                            cleanRemote: false,
                            execTimeout: 1280000,
                            flatten: false,
                            makeEmptyDirs: false,
                            noDefaultExcludes: false,
                            patternSeparator: '[, ]+',
                            remoteDirectorySDF: false,
                            sourceFiles: '**/*.war,shell/backendCore-aws-all.sh, shell/ice4-aws-all.sh'
                      )],
                      usePromotionTimestamp: false,
                      useWorkspaceInPromotion: false,
                      verbose: false
                  )])
                  echo "Restart Docker Container finish"
                }else{
                  echo "Restart Docker Container skip"
                }
              }
            }
          }
        }
      }
    }
     stage('Test - Postman') {
      steps {
        script {
          echo "Test start"
          // if(USE_TEST.equals("true")){
            // To stop error when test failed
            // try{
              // sh "newman run /var/lib/jenkins/workspace/${env.JOB_NAME}/postman/new/QA-Postman-Test.postman_collection.json -e /var/lib/jenkins/workspace/${env.JOB_NAME}/postman/new/Dev-Env.postman_environment.json"
              //sh "newman run /var/lib/jenkins/workspace/${JOB_NAME}/postman/core/admTest.json -e /var/lib/jenkins/workspace/${env.JOB_NAME}/postman/new/Dev-Env.postman_environment.json"
            // } catch (Exception error){
            //   slackSend (
            //     message: "${SERVER_LEVEL} TEST Failed (<${BUILD_URL}|Open>) : \n${error}. ",
            //     username: "${JOB_NAME}",
            //     channel: "${SLACK_CHANNEL}",
            //     color:"${RED}",
            //     tokenCredentialId: "${SLACK_TOKEN}",
            //   )
            //   echo "${error}"
              // break
          //   }
          //   echo "Test end"
          // }else{
          //   echo "Test skip"
          // }
        }
      }
    }
  }
  post('Post') {
    always {
      echo "One way or another, I have finished. Result: ${currentBuild.result}"
        script {
            if(DELETE_JENKINS_WORKSPACE.equals("true")){
               echo "Delete Jenkins Workspace"
               deleteDir()
            }
        }

    }
    success {
      // send slack message to notify start build process
      slackSend (
        message: "Deploy Success ${JOB_BASE_NAME}\nServer : ${SERVER_LEVEL} (<${BUILD_URL}|Open>)",
        username: "${JOB_NAME}",
        channel: "${SLACK_CHANNEL}",
        color: "${GREEN}",
        tokenCredentialId: "${SLACK_TOKEN}",
      )
      echo 'I succeeeded!'
    }
    failure {
      slackSend (
        message: "Deploy Failure ${JOB_BASE_NAME}\nServer : ${SERVER_LEVEL} (<${BUILD_URL}|Open>)",
        username: "${JOB_NAME}",
        channel: "${SLACK_CHANNEL}",
        color:"${RED}",
        tokenCredentialId: "${SLACK_TOKEN}",
      )
      echo 'I failed :('
    }
    unstable {
      slackSend (
        message: "Deploy Unstable ${JOB_BASE_NAME}\nServer : ${SERVER_LEVEL} (<${BUILD_URL}|Open>)",
        username: "${JOB_NAME}",
        channel: "${SLACK_CHANNEL}",
        color:"${YELLOW}",
        tokenCredentialId: "${SLACK_TOKEN}",
      )
      echo 'I am unstable :/'
    }
    changed {
      echo 'Things were different before...'
    }
  }
}

...