Jenkins CICD 单项目多服务可选服务部署

5 篇文章 1 订阅
2 篇文章 0 订阅

1. Jenkins多选参数

有时候想要指定部署哪个服务,可以多选,安装插件Extended Choice Parameter
在这里插入图片描述
sc-auth,sc-gateway,sc-admin,sc-register,sc-info-device,sc-info-space,sc-info-car,sc-info-people,sc-info-community,sc-config
在这里插入图片描述
认证中心,网关,权限管理,注册中心,信息设备管理,信息空间管理,信息车辆管理,信息人员管理,信息社区管理,联动配置
在这里插入图片描述

2. jenkinsfile

def label = "slave-${UUID.randomUUID().toString()}"

def helmLint(String chartDir) {
    println "校验 chart 模板"
    sh "helm lint ${chartDir}"
}

def helmRepo(Map args) {
  println "添加 sc repo"
  sh "helm repo add sc http://${args.dockerRegistryUrl}/chartrepo/smartcommunity --username ${args.username} --password ${args.password}"

  println "更新 repo"
  sh "helm repo update"

  println "获取 Chart 包"
  sh """
    helm fetch sc/sc
    tar -xzvf sc-0.1.0.tgz
    """
}

def helmDeploy(Map args) {
    helmRepo(args)

    if (args.dry_run) {
        println "Debug 应用 ${args.profile} 环境"
        sh "helm upgrade --dry-run --debug --install ${args.name} ${args.chartDir} \
        --set register.image.repository=${args.registerImage} --set register.image.tag=${args.registerTag} \
        --set gateway.image.repository=${args.gatewayImage} --set gateway.image.tag=${args.gatewayTag} \
        --set admin.image.repository=${args.adminImage} --set admin.image.tag=${args.adminTag} \
        --set txManager.image.repository=${args.txManagerImage} --set txManager.image.tag=${args.txManagerTag} \
        --set auth.image.repository=${args.authImage} --set auth.image.tag=${args.authTag} \
        --set infoDevice.image.repository=${args.infoDeviceImage} --set infoDevice.image.tag=${args.infoDeviceTag} \
        --set infoSpace.image.repository=${args.infoSpaceImage} --set infoSpace.image.tag=${args.infoSpaceTag} \
        --set infoCar.image.repository=${args.infoCarImage} --set infoCar.image.tag=${args.infoCarTag} \
        --set infoPeople.image.repository=${args.infoPeopleImage} --set infoPeople.image.tag=${args.infoPeopleTag} \
        --set infoCommunity.image.repository=${args.infoCommunityImage} --set infoCommunity.image.tag=${args.infoCommunityTag} \
        --set statisticAnalysis.image.repository=${args.statisticAnalysisImage} --set statisticAnalysis.image.tag=${args.statisticAnalysisTag} \
        --set smartAnalysis.image.repository=${args.smartAnalysisImage} --set smartAnalysis.image.tag=${args.smartAnalysisTag} \
        --set profile=${args.profile} --set imagePullSecrets[0].name=myreg-in --namespace=${args.namespace}"
    } else {
        println "部署应用 到 ${args.profile} 环境"
        sh "helm upgrade --install ${args.name} ${args.chartDir} \
        --set register.image.repository=${args.registerImage} --set register.image.tag=${args.registerTag} \
        --set gateway.image.repository=${args.gatewayImage} --set gateway.image.tag=${args.gatewayTag} \
        --set admin.image.repository=${args.adminImage} --set admin.image.tag=${args.adminTag} \
        --set txManager.image.repository=${args.txManagerImage} --set txManager.image.tag=${args.txManagerTag} \
        --set auth.image.repository=${args.authImage} --set auth.image.tag=${args.authTag} \
        --set infoDevice.image.repository=${args.infoDeviceImage} --set infoDevice.image.tag=${args.infoDeviceTag} \
        --set infoSpace.image.repository=${args.infoSpaceImage} --set infoSpace.image.tag=${args.infoSpaceTag} \
        --set infoCar.image.repository=${args.infoCarImage} --set infoCar.image.tag=${args.infoCarTag} \
        --set infoPeople.image.repository=${args.infoPeopleImage} --set infoPeople.image.tag=${args.infoPeopleTag} \
        --set infoCommunity.image.repository=${args.infoCommunityImage} --set infoCommunity.image.tag=${args.infoCommunityTag} \
        --set statisticAnalysis.image.repository=${args.statisticAnalysisImage} --set statisticAnalysis.image.tag=${args.statisticAnalysisTag} \
        --set smartAnalysis.image.repository=${args.smartAnalysisImage} --set smartAnalysis.image.tag=${args.smartAnalysisTag} \
        --set profile=${args.profile} --set imagePullSecrets[0].name=myreg-in --namespace=${args.namespace}"
        echo "应用 ${args.name} 部署成功. 可以使用 helm status ${args.name} 查看应用状态"
    }
}

podTemplate(label: label, containers: [
  containerTemplate(name: 'maven', image: 'registry.cn-shanghai.aliyuncs.com/wanfei/maven:3.6-alpine-aliyun', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'docker', image: 'docker', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'helm', image: 'hypnoglow/kubernetes-helm:3.0.2', command: 'cat', ttyEnabled: true)
], volumes: [
  persistentVolumeClaim(claimName: 'maven-pvc', mountPath: '/root/.m2'),
  hostPathVolume(mountPath: '/root/.kube', hostPath: '/root/.kube'),
  hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
]) {
  node(label) {
    def myRepo = checkout scm
    def gitCommit = myRepo.GIT_COMMIT
    def gitBranch = myRepo.GIT_BRANCH
    def gitPre = sh(script: "git rev-parse --short HEAD", returnStdout: true).trim()
    def imageTag = "sc-${gitPre}"
    def dockerRegistryUrl = "10.8.6.49:30032"
    def projectName = "smartcommunity"

    def registerImageName = "sc-register"
    def gatewayImageName = "sc-gateway"
    def adminImageName = "sc-admin"
    def txManagerImageName = "sc-tx-manager"
    def authImageName = "sc-auth"
    def infoDeviceImageName = "sc-info-device"
    def infoSpaceImageName = "sc-info-space"
    def infoCarImageName = "sc-info-car"
    def infoPeopleImageName = "sc-info-people"
    def infoCommunityImageName = "sc-info-community"
    def statisticAnalysisImageName = "sc-statistic-analysis"
    def smartAnalysisImageName = "sc-smart-analysis"

    def registerImage = "${dockerRegistryUrl}/${projectName}/${registerImageName}"
    def gatewayImage = "${dockerRegistryUrl}/${projectName}/${gatewayImageName}"
    def adminImage = "${dockerRegistryUrl}/${projectName}/${adminImageName}"
    def txManagerImage = "${dockerRegistryUrl}/${projectName}/${txManagerImageName}"
    def authImage = "${dockerRegistryUrl}/${projectName}/${authImageName}"
    def infoDeviceImage = "${dockerRegistryUrl}/${projectName}/${infoDeviceImageName}"
    def infoSpaceImage = "${dockerRegistryUrl}/${projectName}/${infoSpaceImageName}"
    def infoCarImage = "${dockerRegistryUrl}/${projectName}/${infoCarImageName}"
    def infoPeopleImage = "${dockerRegistryUrl}/${projectName}/${infoPeopleImageName}"
    def infoCommunityImage = "${dockerRegistryUrl}/${projectName}/${infoCommunityImageName}"
    def statisticAnalysisImage = "${dockerRegistryUrl}/${projectName}/${statisticAnalysisImageName}"
    def smartAnalysisImage = "${dockerRegistryUrl}/${projectName}/${smartAnalysisImageName}"
    def list = "${SELECT_DEPLOY}".tokenize(",")

    stage('单元测试') {
      echo "1.测试阶段"
    }
    stage('代码编译打包') {
      try {
        container('maven') {
          echo "2. 代码编译打包阶段"
          sh "mvn -U clean package -Dmaven.test.skip=true"
        }
      } catch (exc) {
        println "构建失败 - ${currentBuild.fullDisplayName}"
        throw(exc)
      }
    }
    stage('构建 Docker 镜像') {
      withCredentials([[$class: 'UsernamePasswordMultiBinding',
        credentialsId: 'Harbor',
        usernameVariable: 'DOCKER_HUB_USER',
        passwordVariable: 'DOCKER_HUB_PASSWORD']]) {
          container('docker') {
            echo "3. 构建 Docker 镜像阶段, 需要部署 ${list} 微服务"
            sh """
            ls -la
            docker login ${dockerRegistryUrl} -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_PASSWORD}
            """
            if (list.contains(registerImageName)) {
                echo "构建 ${registerImageName} 镜像"
                sh """
                docker build -t ${registerImage}:${imageTag} ./sc-register/
                docker push ${registerImage}:${imageTag}
                """
            }
            if (list.contains(gatewayImageName)) {
                echo "构建 ${gatewayImageName} 镜像"
                sh """
                docker build -t ${gatewayImage}:${imageTag} ./sc-gateway/
                docker push ${gatewayImage}:${imageTag}
                """
            }
            if (list.contains(adminImageName)) {
                echo "构建 ${adminImageName} 镜像"
                sh """
                docker build -t ${adminImage}:${imageTag} ./sc-upms/sc-upms-biz/
                docker push ${adminImage}:${imageTag}
                """
            }
            if (list.contains(txManagerImageName)) {
                echo "构建 ${txManagerImageName} 镜像"
                sh """
                docker build -t ${txManagerImage}:${imageTag} ./sc-tx-manager/
                docker push ${txManagerImage}:${imageTag}
                """
            }
            if (list.contains(authImageName)) {
                echo "构建 ${authImageName} 镜像"
                sh """
                docker build -t ${authImage}:${imageTag} ./sc-auth/
                docker push ${authImage}:${imageTag}
                """
            }
            if (list.contains(infoDeviceImageName)) {
                echo "构建 ${infoDeviceImageName} 镜像"
                sh """
                docker build -t ${infoDeviceImage}:${imageTag} ./sc-info/sc-info-device/sc-info-device-biz/
                docker push ${infoDeviceImage}:${imageTag}
                """
            }
            if (list.contains(infoSpaceImageName)) {
                echo "构建 ${infoSpaceImageName} 镜像"
                sh """
                docker build -t ${infoSpaceImage}:${imageTag} ./sc-info/sc-info-space/sc-info-space-biz/
                docker push ${infoSpaceImage}:${imageTag}
                """
            }
            if (list.contains(infoCarImageName)) {
                echo "构建 ${infoCarImageName} 镜像"
                sh """
                docker build -t ${infoCarImage}:${imageTag} ./sc-info/sc-info-car/sc-info-car-biz/
                docker push ${infoCarImage}:${imageTag}
                """
            }
            if (list.contains(infoPeopleImageName)) {
                echo "构建 ${infoPeopleImageName} 镜像"
                sh """
                docker build -t ${infoPeopleImage}:${imageTag} ./sc-info/sc-info-people/sc-info-people-biz/
                docker push ${infoPeopleImage}:${imageTag}
                """
            }
            if (list.contains(infoCommunityImageName)) {
                echo "构建 ${infoCommunityImageName} 镜像"
                sh """
                docker build -t ${infoCommunityImage}:${imageTag} ./sc-info/sc-info-community/sc-info-community-biz/
                docker push ${infoCommunityImage}:${imageTag}
                """
            }
            if (list.contains(statisticAnalysisImageName)) {
                echo "构建 ${statisticAnalysisImageName} 镜像"
                sh """
                docker build -t ${statisticAnalysisImage}:${imageTag} ./sc-statistic-analysis/sc-statistic-analysis-biz/
                docker push ${statisticAnalysisImage}:${imageTag}
                """
            }
            if (list.contains(smartAnalysisImageName)) {
                echo "构建 ${smartAnalysisImageName} 镜像"
                sh """
                docker build -t ${smartAnalysisImage}:${imageTag} ./sc-smart-analysis/sc-smart-analysis-biz/
                docker push ${smartAnalysisImage}:${imageTag}
                """
            }
        }
      }
    }

    stage('运行 Helm') {
      withCredentials([[$class: 'UsernamePasswordMultiBinding',
        credentialsId: 'Harbor',
        usernameVariable: 'DOCKER_HUB_USER',
        passwordVariable: 'DOCKER_HUB_PASSWORD']]) {
          container('helm') {
            echo "4. [INFO] 开始 Helm 部署"
            def registerTag = "${imageTag}"
            def gatewayTag = "${imageTag}"
            def adminTag = "${imageTag}"
            def txManagerTag = "${imageTag}"
            def authTag = "${imageTag}"
            def infoDeviceTag = "${imageTag}"
            def infoSpaceTag = "${imageTag}"
            def infoCarTag = "${imageTag}"
            def infoPeopleTag = "${imageTag}"
            def infoCommunityTag = "${imageTag}"
            def statisticAnalysisTag = "${imageTag}"
            def smartAnalysisTag = "${imageTag}"

            def tagUrl = 'curl -u USER:PASS -X GET "HURL/api/v2.0/projects/PROJECT_NAME/repositories/IMAGE/artifacts?page=1&page_size=1&with_tag=true&with_label=false&with_scan_overview=false&with_signature=false&with_immutable_status=false" -H "accept: application/json" | sed \'s/,/\\n/g\' | grep "name" | awk -F \':\' \'{print $2}\' | sed \'s/"//g\''
                        .replaceAll("USER", "${DOCKER_HUB_USER}")
                        .replaceAll("PASS", "${DOCKER_HUB_PASSWORD}")
                        .replaceAll("HURL", "${dockerRegistryUrl}")
                        .replaceAll("PROJECT_NAME", "${projectName}")

            if (!list.contains(registerImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", registerImageName)
                registerTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${registerImageName} 使用老镜像号为 ${registerTag}"
            }
            if (!list.contains(gatewayImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", gatewayImageName)
                gatewayTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${gatewayImageName} 使用老镜像号为 ${gatewayTag}"
            }
            if (!list.contains(adminImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", adminImageName)
                adminTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${adminImageName} 使用老镜像号为 ${adminTag}"
            }
            if (!list.contains(txManagerImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", txManagerImageName)
                txManagerTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${txManagerImageName} 使用老镜像号为 ${txManagerTag}"
            }
            if (!list.contains(authImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", authImageName)
                authTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${authImageName} 使用老镜像号为 ${authTag}"
            }
            if (!list.contains(infoDeviceImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", infoDeviceImageName)
                infoDeviceTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${infoDeviceImageName} 使用老镜像号为 ${infoDeviceTag}"
            }
            if (!list.contains(infoSpaceImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", infoSpaceImageName)
                infoSpaceTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${infoSpaceImageName} 使用老镜像号为 ${infoSpaceTag}"
            }
            if (!list.contains(infoCarImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", infoCarImageName)
                infoCarTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${infoCarImageName} 使用老镜像号为 ${infoCarTag}"
            }
            if (!list.contains(infoPeopleImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", infoPeopleImageName)
                infoPeopleTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${infoPeopleImageName} 使用老镜像号为 ${infoPeopleTag}"
            }
            if (!list.contains(infoCommunityImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", infoCommunityImageName)
                infoCommunityTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${infoCommunityImageName} 使用老镜像号为 ${infoCommunityTag}"
            }
            if (!list.contains(statisticAnalysisImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", statisticAnalysisImageName)
                statisticAnalysisTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${statisticAnalysisImageName} 使用老镜像号为 ${statisticAnalysisTag}"
            }
            if (!list.contains(smartAnalysisImageName)) {
                def getTagUrl = tagUrl.replaceAll("IMAGE", smartAnalysisImageName)
                smartAnalysisTag = sh(script: "${getTagUrl}", returnStdout: true).trim()
                echo "${smartAnalysisImageName} 使用老镜像号为 ${smartAnalysisTag}"
            }

            helmDeploy(
                dry_run     : false,
                name        : "sc",
                chartDir    : "sc",
                namespace   : "sc-${SPRING_PROFILE}",
                registerImage       : "${registerImage}",
                gatewayImage       : "${gatewayImage}",
                adminImage       : "${adminImage}",
                txManagerImage       : "${txManagerImage}",
                authImage       : "${authImage}",
                infoDeviceImage       : "${infoDeviceImage}",
                infoSpaceImage       : "${infoSpaceImage}",
                infoCarImage       : "${infoCarImage}",
                infoPeopleImage       : "${infoPeopleImage}",
                infoCommunityImage       : "${infoCommunityImage}",
                statisticAnalysisImage       : "${statisticAnalysisImage}",
                smartAnalysisImage       : "${smartAnalysisImage}",
                registerTag         : "${registerTag}",
                gatewayTag         : "${gatewayTag}",
                adminTag         : "${adminTag}",
                txManagerTag         : "${txManagerTag}",
                authTag         : "${authTag}",
                infoDeviceTag         : "${infoDeviceTag}",
                infoSpaceTag         : "${infoSpaceTag}",
                infoCarTag         : "${infoCarTag}",
                infoPeopleTag         : "${infoPeopleTag}",
                infoCommunityTag         : "${infoCommunityTag}",
                statisticAnalysisTag         : "${statisticAnalysisTag}",
                smartAnalysisTag         : "${smartAnalysisTag}",
                username    : "${DOCKER_HUB_USER}",
                password    : "${DOCKER_HUB_PASSWORD}",
                dockerRegistryUrl    : "${dockerRegistryUrl}",
                profile     : "${SPRING_PROFILE}"
            )
            echo "[INFO] Helm 部署应用成功..."
          }
      }
    }
  }
}

tagUrl:获取Harbor镜像仓库某个镜像最新的tag号,新提交代码的服务可以使用

    def gitPre = sh(script: "git rev-parse --short HEAD", returnStdout: true).trim()
    def imageTag = "sc-${gitPre}"

gitCommitId作为tag号,并构建新的镜像上传到Harbor,没有更新代码的服务没必要更新镜像上传到Harbor,只要获取到上次上传的最新的tag号,就能在helm upgrade --install更新服务时,不更新这个老服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值