github.com/NpoolPlatform/chain-middleware@v0.0.0-20240228100535-eb1bcf896eb9/Jenkinsfile (about)

     1  pipeline {
     2    agent any
     3    environment {
     4      GOPROXY = 'https://goproxy.cn,direct'
     5    }
     6    tools {
     7      go 'go'
     8    }
     9    stages {
    10      stage('Clone') {
    11        steps {
    12          git(url: scm.userRemoteConfigs[0].url, branch: '$BRANCH_NAME', changelog: true, credentialsId: 'KK-github-key', poll: true)
    13        }
    14      }
    15  
    16      stage('Prepare') {
    17        steps {
    18          sh 'rm -rf ./output/*'
    19          sh 'make deps'
    20        }
    21      }
    22  
    23      stage('Linting') {
    24        when {
    25          expression { BUILD_TARGET == 'true' }
    26        }
    27        steps {
    28          sh 'make verify'
    29        }
    30      }
    31  
    32      stage('Compile') {
    33        when {
    34          expression { BUILD_TARGET == 'true' }
    35        }
    36        steps {
    37          sh(returnStdout: false, script: '''
    38            make verify-build
    39          '''.stripIndent())
    40        }
    41      }
    42  
    43      stage('Switch to current cluster') {
    44        when {
    45          anyOf {
    46            expression { BUILD_TARGET == 'true' }
    47            expression { DEPLOY_TARGET == 'true' }
    48          }
    49        }
    50        steps {
    51          sh 'cd /etc/kubeasz; ./ezctl checkout $TARGET_ENV'
    52        }
    53      }
    54  
    55      stage('Config target') {
    56        when {
    57          anyOf {
    58            expression { BUILD_TARGET == 'true' }
    59            expression { DEPLOY_TARGET == 'true' }
    60          }
    61        }
    62        steps {
    63          sh 'rm .apollo-base-config -rf'
    64          sh 'git clone https://github.com/NpoolPlatform/apollo-base-config.git .apollo-base-config'
    65          sh(returnStdout: false, script: '''
    66            PASSWORD=`kubectl get secret --namespace "kube-system" mysql-password-secret -o jsonpath="{.data.rootpassword}" | base64 --decode`
    67            kubectl exec --namespace kube-system mysql-0 -- mysql -h 127.0.0.1 -uroot -p$PASSWORD -P3306 -e "create database if not exists chain_manager;"
    68  
    69            username=`helm status rabbitmq --namespace kube-system | grep Username | awk -F ' : ' '{print $2}' | sed 's/"//g'`
    70            for vhost in `cat cmd/*/*.viper.yaml | grep hostname | awk '{print $2}' | sed 's/"//g' | sed 's/\\./-/g'`; do
    71              kubectl exec --namespace kube-system rabbitmq-0 -- rabbitmqctl add_vhost $vhost
    72              kubectl exec --namespace kube-system rabbitmq-0 -- rabbitmqctl set_permissions -p $vhost $username ".*" ".*" ".*"
    73  
    74              cd .apollo-base-config
    75              ./apollo-base-config.sh $APP_ID $TARGET_ENV $vhost
    76              ./apollo-item-config.sh $APP_ID $TARGET_ENV $vhost database_name chain_manager
    77              cd -
    78            done
    79          '''.stripIndent())
    80        }
    81      }
    82  
    83      stage('Unit Tests') {
    84        when {
    85          expression { BUILD_TARGET == 'true' }
    86        }
    87        steps {
    88          sh(returnStdout: false, script: '''
    89            devboxpod=`kubectl get pods -A | grep development-box | head -n1 | awk '{print $2}'`
    90            servicename="chain-middleware"
    91  
    92            kubectl exec --namespace kube-system $devboxpod -- make -C /tmp/$servicename after-test || true
    93            kubectl exec --namespace kube-system $devboxpod -- rm -rf /tmp/$servicename || true
    94            kubectl cp ./ kube-system/$devboxpod:/tmp/$servicename
    95  
    96            kubectl exec --namespace kube-system $devboxpod -- make -C /tmp/$servicename deps before-test test after-test
    97            kubectl exec --namespace kube-system $devboxpod -- rm -rf /tmp/$servicename
    98  
    99            swaggeruipod=`kubectl get pods -A | grep swagger | awk '{print $2}'`
   100            kubectl cp message/npool/*.swagger.json kube-system/$swaggeruipod:/usr/share/nginx/html || true
   101          '''.stripIndent())
   102        }
   103      }
   104  
   105      stage('Generate docker image for development') {
   106        when {
   107          expression { BUILD_TARGET == 'true' }
   108        }
   109        steps {
   110          sh 'make verify-build'
   111          sh 'DOCKER_REGISTRY=$DOCKER_REGISTRY make generate-docker-images'
   112        }
   113      }
   114  
   115      stage('Tag patch') {
   116        when {
   117          expression { TAG_PATCH == 'true' }
   118        }
   119        steps {
   120          sh(returnStdout: false, script: '''
   121            set +e
   122            revlist=`git rev-list --tags --max-count=1`
   123            rc=$?
   124            set -e
   125            if [ 0 -eq $rc -a x"$revlist" != x ]; then
   126              tag=`git describe --tags $revlist`
   127  
   128              major=`echo $tag | awk -F '.' '{ print $1 }'`
   129              minor=`echo $tag | awk -F '.' '{ print $2 }'`
   130              patch=`echo $tag | awk -F '.' '{ print $3 }'`
   131  
   132              case $TAG_FOR in
   133                testing)
   134                  patch=$(( $patch + $patch % 2 + 1 ))
   135                  ;;
   136                production)
   137                  patch=$(( $patch + 1 ))
   138                  git reset --hard
   139                  git checkout $tag
   140                  ;;
   141              esac
   142  
   143              tag=$major.$minor.$patch
   144            else
   145              tag=0.1.1
   146            fi
   147            git tag -a $tag -m "Bump version to $tag"
   148          '''.stripIndent())
   149  
   150          withCredentials([gitUsernamePassword(credentialsId: 'KK-github-key', gitToolName: 'git-tool')]) {
   151            sh 'git push --tag'
   152          }
   153        }
   154      }
   155  
   156      stage('Tag minor') {
   157        when {
   158          expression { TAG_MINOR == 'true' }
   159        }
   160        steps {
   161          sh(returnStdout: false, script: '''
   162            set +e
   163            revlist=`git rev-list --tags --max-count=1`
   164            rc=$?
   165            set -e
   166            if [ 0 -eq $rc -a x"$revlist" != x ]; then
   167              tag=`git describe --tags $revlist`
   168  
   169              major=`echo $tag | awk -F '.' '{ print $1 }'`
   170              minor=`echo $tag | awk -F '.' '{ print $2 }'`
   171              patch=`echo $tag | awk -F '.' '{ print $3 }'`
   172  
   173              minor=$(( $minor + 1 ))
   174              patch=1
   175  
   176              tag=$major.$minor.$patch
   177            else
   178              tag=0.1.1
   179            fi
   180            git tag -a $tag -m "Bump version to $tag"
   181          '''.stripIndent())
   182  
   183          withCredentials([gitUsernamePassword(credentialsId: 'KK-github-key', gitToolName: 'git-tool')]) {
   184            sh 'git push --tag'
   185          }
   186        }
   187      }
   188  
   189      stage('Tag major') {
   190        when {
   191          expression { TAG_MAJOR == 'true' }
   192        }
   193        steps {
   194          sh(returnStdout: false, script: '''
   195            set +e
   196            revlist=`git rev-list --tags --max-count=1`
   197            rc=$?
   198            set -e
   199            if [ 0 -eq $rc -a x"$revlist" != x ]; then
   200              tag=`git describe --tags $revlist`
   201  
   202              major=`echo $tag | awk -F '.' '{ print $1 }'`
   203              minor=`echo $tag | awk -F '.' '{ print $2 }'`
   204              patch=`echo $tag | awk -F '.' '{ print $3 }'`
   205  
   206              major=$(( $major + 1 ))
   207              minor=0
   208              patch=1
   209  
   210              tag=$major.$minor.$patch
   211            else
   212              tag=0.1.1
   213            fi
   214            git tag -a $tag -m "Bump version to $tag"
   215          '''.stripIndent())
   216  
   217          withCredentials([gitUsernamePassword(credentialsId: 'KK-github-key', gitToolName: 'git-tool')]) {
   218            sh 'git push --tag'
   219          }
   220        }
   221      }
   222  
   223      stage('Generate docker image for testing or production') {
   224        when {
   225          expression { BUILD_TARGET == 'true' }
   226        }
   227        steps {
   228          sh(returnStdout: false, script: '''
   229            set +e
   230            revlist=`git rev-list --tags --max-count=1`
   231            rc=$?
   232            set -e
   233            if [ 0 -eq $rc -a x"$revlist" != x ]; then
   234              tag=`git describe --tags $revlist`
   235              git reset --hard
   236              git checkout $tag
   237            fi
   238          '''.stripIndent())
   239          sh 'make verify-build'
   240          sh 'DOCKER_REGISTRY=$DOCKER_REGISTRY make generate-docker-images'
   241        }
   242      }
   243  
   244      stage('Release docker image for development') {
   245        when {
   246          expression { RELEASE_TARGET == 'true' }
   247        }
   248        steps {
   249          sh(returnStdout: false, script: '''
   250            branch=latest
   251            if [ "x$BRANCH_NAME" != "xmaster" ]; then
   252              branch=`echo $BRANCH_NAME | awk -F '/' '{ print $2 }'`
   253            fi
   254            set +e
   255            docker images | grep chain-middleware | grep $branch
   256            rc=$?
   257            set -e
   258            if [ 0 -eq $rc ]; then
   259              DOCKER_REGISTRY=$DOCKER_REGISTRY make release-docker-images
   260            fi
   261            images=`docker images | grep entropypool | grep chain-middleware | grep none | awk '{ print $3 }'`
   262            for image in $images; do
   263              docker rmi $image -f
   264            done
   265          '''.stripIndent())
   266        }
   267      }
   268  
   269      stage('Release docker image for testing') {
   270        when {
   271          expression { RELEASE_TARGET == 'true' }
   272        }
   273        steps {
   274          sh(returnStdout: false, script: '''
   275            set +e
   276            revlist=`git rev-list --tags --max-count=1`
   277            rc=$?
   278            set -e
   279  
   280            if [ 0 -eq $rc -a x"$revlist" != x ]; then
   281              tag=`git tag --sort=-v:refname | grep [1\\|3\\|5\\|7\\|9]$ | head -n1`
   282              set +e
   283              docker images | grep chain-middleware | grep $tag
   284              rc=$?
   285              set -e
   286              if [ 0 -eq $rc ]; then
   287                DOCKER_REGISTRY=$DOCKER_REGISTRY make release-docker-images
   288              fi
   289            fi
   290          '''.stripIndent())
   291        }
   292      }
   293  
   294      stage('Release docker image for production') {
   295        when {
   296          expression { RELEASE_TARGET == 'true' }
   297        }
   298        steps {
   299          sh(returnStdout: false, script: '''
   300            set +e
   301            taglist=`git rev-list --tags`
   302            rc=$?
   303            set -e
   304  
   305            if [ 0 -eq $rc -a x"$taglist" != x ]; then
   306              tag=`git tag --sort=-v:refname | grep [0\\|2\\|4\\|6\\|8]$ | head -n1`
   307              set +e
   308              docker images | grep chain-middleware | grep $tag
   309              rc=$?
   310              set -e
   311              if [ 0 -eq $rc ]; then
   312                DOCKER_REGISTRY=$DOCKER_REGISTRY make release-docker-images
   313              fi
   314            fi
   315          '''.stripIndent())
   316        }
   317      }
   318  
   319      stage('Deploy for development') {
   320        when {
   321          expression { DEPLOY_TARGET == 'true' }
   322          expression { TARGET_ENV ==~ /.*development.*/ }
   323        }
   324        steps {
   325          sh(returnStdout: false, script: '''
   326            branch=latest
   327            if [ "x$BRANCH_NAME" != "xmaster" ]; then
   328              branch=`echo $BRANCH_NAME | awk -F '/' '{ print $2 }'`
   329            fi
   330            sed -i "s/chain-middleware:latest/chain-middleware:$branch/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   331            sed -i "s/uhub.service.ucloud.cn/$DOCKER_REGISTRY/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   332            sed -i "s#currency_proxy: \\\"\\\"#currency_proxy: \\\"$CURRENCY_REQUEST_PROXY\\\"#g" cmd/chain-middleware/k8s/00-configmap.yaml
   333            if [ "x$REPLICAS_COUNT" == "x" ];then
   334              REPLICAS_COUNT=2
   335            fi
   336            sed -i "s/replicas: 2/replicas: $REPLICAS_COUNT/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   337            make deploy-to-k8s-cluster
   338          '''.stripIndent())
   339        }
   340      }
   341  
   342      stage('Deploy for testing') {
   343        when {
   344          expression { DEPLOY_TARGET == 'true' }
   345          expression { TARGET_ENV ==~ /.*testing.*/ }
   346        }
   347        steps {
   348          sh(returnStdout: false, script: '''
   349            set +e
   350            revlist=`git rev-list --tags --max-count=1`
   351            rc=$?
   352            set -e
   353            if [ ! 0 -eq $rc -o x"$revlist" == x]; then
   354              exit 0
   355            fi
   356            tag=`git tag --sort=-v:refname | grep [1\\|3\\|5\\|7\\|9]$ | head -n1`
   357  
   358            git reset --hard
   359            git checkout $tag
   360            sed -i "s/chain-middleware:latest/chain-middleware:$tag/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   361            sed -i "s/uhub.service.ucloud.cn/$DOCKER_REGISTRY/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   362            sed -i "s#currency_proxy: \\\"\\\"#currency_proxy: \\\"$CURRENCY_REQUEST_PROXY\\\"#g" cmd/chain-middleware/k8s/00-configmap.yaml
   363            if [ "x$REPLICAS_COUNT" == "x" ];then
   364              REPLICAS_COUNT=2
   365            fi
   366            sed -i "s/replicas: 2/replicas: $REPLICAS_COUNT/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   367            sed -i "s/imagePullPolicy: Always/imagePullPolicy: IfNotPresent/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   368            make deploy-to-k8s-cluster
   369          '''.stripIndent())
   370        }
   371      }
   372  
   373      stage('Deploy for production') {
   374        when {
   375          expression { DEPLOY_TARGET == 'true' }
   376          expression { TARGET_ENV ==~ /.*production.*/ }
   377        }
   378        steps {
   379          sh(returnStdout: false, script: '''
   380            set +e
   381            taglist=`git rev-list --tags`
   382            rc=$?
   383            set -e
   384            if [ ! 0 -eq $rc -o x"$revlist" == x]; then
   385              exit 0
   386            fi
   387            tag=`git tag --sort=-v:refname | grep [0\\|2\\|4\\|6\\|8]$ | head -n1`
   388            git reset --hard
   389            git checkout $tag
   390            sed -i "s/chain-middleware:latest/chain-middleware:$tag/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   391            sed -i "s/uhub.service.ucloud.cn/$DOCKER_REGISTRY/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   392            if [ "x$REPLICAS_COUNT" == "x" ];then
   393              REPLICAS_COUNT=2
   394            fi
   395            sed -i "s/replicas: 2/replicas: $REPLICAS_COUNT/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   396            sed -i "s/imagePullPolicy: Always/imagePullPolicy: IfNotPresent/g" cmd/chain-middleware/k8s/02-chain-middleware.yaml
   397            make deploy-to-k8s-cluster
   398          '''.stripIndent())
   399        }
   400      }
   401  
   402      stage('Post') {
   403        steps {
   404          // Assemble vet and lint info.
   405          // warnings parserConfigurations: [
   406          //   [pattern: 'govet.txt', parserName: 'Go Vet'],
   407          //   [pattern: 'golint.txt', parserName: 'Go Lint']
   408          // ]
   409  
   410          // sh 'go2xunit -fail -input gotest.txt -output gotest.xml'
   411          // junit "gotest.xml"
   412          sh 'echo Posting'
   413        }
   414      }
   415    }
   416    post('Report') {
   417      fixed {
   418        script {
   419          sh(script: 'bash $JENKINS_HOME/wechat-templates/send_wxmsg.sh fixed')
   420       }
   421        script {
   422          // env.ForEmailPlugin = env.WORKSPACE
   423          emailext attachmentsPattern: 'TestResults\\*.trx',
   424          body: '${FILE,path="$JENKINS_HOME/email-templates/success_email_tmp.html"}',
   425          mimeType: 'text/html',
   426          subject: currentBuild.currentResult + " : " + env.JOB_NAME,
   427          to: '$DEFAULT_RECIPIENTS'
   428        }
   429       }
   430      success {
   431        script {
   432          sh(script: 'bash $JENKINS_HOME/wechat-templates/send_wxmsg.sh successful')
   433       }
   434        script {
   435          // env.ForEmailPlugin = env.WORKSPACE
   436          emailext attachmentsPattern: 'TestResults\\*.trx',
   437          body: '${FILE,path="$JENKINS_HOME/email-templates/success_email_tmp.html"}',
   438          mimeType: 'text/html',
   439          subject: currentBuild.currentResult + " : " + env.JOB_NAME,
   440          to: '$DEFAULT_RECIPIENTS'
   441        }
   442       }
   443      failure {
   444        script {
   445          sh(script: 'bash $JENKINS_HOME/wechat-templates/send_wxmsg.sh failure')
   446       }
   447        script {
   448          // env.ForEmailPlugin = env.WORKSPACE
   449          emailext attachmentsPattern: 'TestResults\\*.trx',
   450          body: '${FILE,path="$JENKINS_HOME/email-templates/fail_email_tmp.html"}',
   451          mimeType: 'text/html',
   452          subject: currentBuild.currentResult + " : " + env.JOB_NAME,
   453          to: '$DEFAULT_RECIPIENTS'
   454        }
   455       }
   456      aborted {
   457        script {
   458          sh(script: 'bash $JENKINS_HOME/wechat-templates/send_wxmsg.sh aborted')
   459       }
   460        script {
   461          // env.ForEmailPlugin = env.WORKSPACE
   462          emailext attachmentsPattern: 'TestResults\\*.trx',
   463          body: '${FILE,path="$JENKINS_HOME/email-templates/fail_email_tmp.html"}',
   464          mimeType: 'text/html',
   465          subject: currentBuild.currentResult + " : " + env.JOB_NAME,
   466          to: '$DEFAULT_RECIPIENTS'
   467        }
   468       }
   469    }
   470  }