[Gitops--10]微服务项目部署流水线编写

微服务项目部署流水线编写

1. 部署环境说明

序号管理地址作用
1192.168.31.199GitLab
2192.168.31.104Harbor
3192.168.31.131kubesphere

1.1 GitLab

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

1.2 流水线

1.2.1 创建流水线

请添加图片描述

请添加图片描述

请添加图片描述

1.2.2 创建凭证

请添加图片描述

请添加图片描述

1.2.3 创建kubeconfig凭证

请添加图片描述

这里需要注意的是,config中如果使用的是域名,那么需要想办法把他解析或者改为ip地址

1.2.4 编辑流水线

[创建自定义流水线]
请添加图片描述

[确定],[确定],[确定]

这样一个简单的拉取代码已经完成.

请添加图片描述

运行

请添加图片描述

1.3 集成Sonarqube

部署步骤参见 https://blog.csdn.net/qq_29974229/article/details/129829094 第二章

token

4b0a43841b5feb73fcef631c374e9dadc0babad3

2. 参数化构建

在Jenkinsfile中追加

parameters {
    string(name: 'PROJECT_VERSION', defaultValue: 'v1.0', description: '')
    string(name: 'PROJECT_NAME', defaultValue: '', description: '')
  }

请添加图片描述

此时运行后会弹出窗口

请添加图片描述

3. 添加凭证

3.1 密码凭证和kubeconfig

添加harbor和gitlab的密码凭证及kubeconfig

请添加图片描述

3.2 Sonarqube凭证

93617fa07455d52234720d122f9179208ee56a95

请添加图片描述

创建Sonarqube凭证

请添加图片描述

创建

3.3 Webhook

获得的端口是30180,其实就是devops-jenkins的nodeport端口

kubectl get -n kubesphere-devops-system svc devops-jenkins -o jsonpath="{.spec.ports[0].nodePort}"

请添加图片描述

webhook地址为:

http://192.168.31.131:30180/sonarqube-webhook/

3.4 将webhook集成到ks-install

kubectl edit cc -n kubesphere-system ks-installer

确认token和url地址正确

    sonarqube:
      externalSonarToken: 93617fa07455d52234720d122f9179208ee56a95
      externalSonarUrl: http://192.168.31.131:30322

3.5 将Sonarqube添加到Jenkins

进入Jenkins,[系统管理] [Manage Credentials] [Jenkins] [全局凭证] [添加凭证]

请添加图片描述

确认

请添加图片描述

[系统管理] [系统配置] [SonarQube Server]

URL中填写sonarqube的管理页面访问地址

请添加图片描述

3.6 SonarQube URL添加到Kubesphere

kubectl edit cm -n kubesphere-system ks-console-config

添加3行内容

apiVersion: v1
data:
  local_config.yaml: |
    server:
      http:
        hostname: localhost
        port: 8000
        static:
          production:
            /public: server/public
            /assets: dist/assets
            /dist: dist
      redis:
        port: 6379
        host: redis.kubesphere-system.svc
      redisTimeout: 5000
      sessionTimeout: 7200000
    client:
      version:
        kubesphere: v3.1.0
        kubernetes: v1.21.5
        openpitrix: v3.1.0
      enableKubeConfig: true
      # 添加以下2行内容
      devops:
        sonarqubeURL: http://192.168.31.131:30322
    defaultClusterName: default
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: ks-core
    meta.helm.sh/release-namespace: kubesphere-system
  creationTimestamp: "2023-03-22T06:40:55Z"
  labels:
    app.kubernetes.io/managed-by: Helm
  name: ks-console-config
  namespace: kubesphere-system
  resourceVersion: "153798"
  uid: 4f928d03-28e4-42c6-89de-d61f0347a101
~

3.7 重启Devops服务

kubectl -n kubesphere-devops-system rollout restart deployment devops-apiserver
kubectl -n kubesphere-system rollout restart deployment ks-console
kubectl rollout restart deployment -n kubesphere-devops-system

4. 添加环境变量到Jenkinsfile

将以下配置加到pipeline中stages的同级

  environment {
    DOCKER_CREDENTIAL_ID = 'harbor'
    GITEE_CREDENTIAL_ID = 'gitlab'
    KUBECONFIG_CREDENTIAL_ID= 'sangomall-kubeconfig'
    REGISTRY = '192.168.31.104'
    DOCKERHUB_NAMESPACE = 'sangomall'
    GITEE_ACCOUNT = 'sangomall'
    SONAR_CREDENTIAL_ID = 'sonar-qube'
  }

添加后的pipeline

pipeline {
  agent {
    node {
      label 'maven'
    }
  }
  parameters {
    string(name: 'PROJECT_VERSION', defaultValue: 'v1.0', description: '')
    string(name: 'PROJECT_NAME', defaultValue: '', description: '')
  }
  stages {
    stage('代码拉取') {
      agent none
      steps {
        git(url: 'http://192.168.31.199/deploy/test.git', credentialsId: 'gitlab', branch: 'master', changelog: true, poll: false)
      }
    }
  }
  environment {
    DOCKER_CREDENTIAL_ID = 'harbor'
    GITEE_CREDENTIAL_ID = 'gitlab'
    KUBECONFIG_CREDENTIAL_ID= 'sangomall-kubeconfig'
    REGISTRY = '192.168.31.104'
    DOCKERHUB_NAMESPACE = 'sangomall'
    GITEE_ACCOUNT = 'sangomall'
    SONAR_CREDENTIAL_ID = 'sonar-qube'
  }
}

5. 代码扫描

添加[指定容器] maven

[添加凭证] SONAR_TOKEN

请添加图片描述

[添加嵌套步骤] [Sonarqube配置] sonar

请添加图片描述

[添加嵌套步骤] [shell]

mvn sonar:sonar -gs `pwd`/mvn_settings.xml -Dsonar.login=$SONAR_TOKEN

请添加图片描述

mvn_settings.xml的内容

<settings>
    <mirrors>
        <mirror>
            <id>nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>
</settings>

添加超时

请添加图片描述

在超时后面 添加代码质量检查

请添加图片描述

Jenkinsfile

pipeline {
  agent {
    node {
      label 'maven'
    }
  }
  stages {
    stage('代码拉取') {
      agent none
      steps {
        git(url: 'http://192.168.31.199/deploy/test.git', credentialsId: 'gitlab', branch: 'master', changelog: true, poll: false)
      }
    }
    stage('代码分析') {
      agent none
      steps {
        container('maven') {
          withCredentials([string(credentialsId : 'sonar-qube' ,variable : 'SONAR_TOKEN' ,)]) {
            withSonarQubeEnv('sonar') {
              sh 'mvn verify sonar:sonar -gs `pwd`/mvn_settings.xml -Dsonar.login=$SONAR_TOKEN'
            }
          }
          timeout(unit: 'MINUTES', activity: true, time: 30) {
            waitForQualityGate 'true'
          }
        }
      }
    }
  }
  environment {
    DOCKER_CREDENTIAL_ID = 'harbor'
    GITEE_CREDENTIAL_ID = 'gitlab'
    KUBECONFIG_CREDENTIAL_ID = 'sangomall-kubeconfig'
    REGISTRY = '192.168.31.104'
    DOCKERHUB_NAMESPACE = 'sangomall'
    GITEE_ACCOUNT = 'sangomall'
    SONAR_CREDENTIAL_ID = 'sonar-qube'
  }
  parameters {
    string(name: 'PROJECT_VERSION', defaultValue: 'v1.0', description: '')
    string(name: 'PROJECT_NAME', defaultValue: '', description: '')
  }
}

执行效果

请添加图片描述

此时sonarqube上可以看到sangomall的项目扫描结果

请添加图片描述

这里可能会因为代码质量扫描异常,可以调整Sonarqube质量阈来实现扫描通过

请添加图片描述

6. 容器构建

执行构建的前提是:

  1. jar包(mvn生成)
  2. Dockerfile
  3. harbor仓库
  4. harbor凭证

6.1 构建镜像

制作jar包

mvn clean package -Dmaven.test.skip=true -gs `pwd`/mvn_settings.xml

镜像制作

cd $PROJECT_NAME && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER .

6.2 镜像上传到仓库

添加凭证,这里要注意下,上面是密码,下面是用户名

HARBOR_PASSWORD
HARBOR_USERNAME

请添加图片描述

登录harbor

echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin

推送镜像

docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest
docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER
docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest

请添加图片描述

6.3 Harbor登录失败处理

这里可能会出现maven镜像登录harbor失败.在ks-node节点的/etc/systemd/system/docker.service中添加以下配置

ExecStart=/usr/bin/dockerd  --insecure-registry 192.168.31.104 --insecure-registry harbor.intra.com

配置添加后需要重启docker服务

systemctl daemon-reload && systemctl restart docker

6.4 运行构建

请添加图片描述

Jenkinsfile

pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  stages {
    stage('代码拉取') {
      agent none
      steps {
        git(url: 'http://192.168.31.199/deploy/sangomall.git', credentialsId: 'gitlab', branch: 'master', changelog: true, poll: false)
      }
    }

    stage('代码分析') {
      agent none
      steps {
        container('maven') {
          withCredentials([string(credentialsId : 'sonar-qube' ,variable : 'SONAR_TOKEN' ,)]) {
            withSonarQubeEnv('sonar') {
              sh 'mvn verify sonar:sonar -gs `pwd`/mvn_settings.xml -Dsonar.login=$SONAR_TOKEN'
            }

          }

          timeout(unit: 'HOURS', activity: true, time: 1) {
            waitForQualityGate 'true'
          }

        }

      }
    }

    stage('容器构建') {
      agent none
      steps {
        container('maven') {
          sh 'mvn clean install -Dmaven.test.skip=true -gs `pwd`/mvn_settings.xml'
          sh 'cd $PROJECT_NAME && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER .'
          withCredentials([usernamePassword(credentialsId : 'harbor' ,passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,)]) {
            sh 'echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin'
            sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest'
          }

        }

      }
    }

  }
  environment {
    DOCKER_CREDENTIAL_ID = 'harbor'
    GITEE_CREDENTIAL_ID = 'gitlab'
    KUBECONFIG_CREDENTIAL_ID = 'sangomall-kubeconfig'
    REGISTRY = 'harbor.intra.com'
    DOCKERHUB_NAMESPACE = 'sangomall'
    GITEE_ACCOUNT = 'sangomall'
    SONAR_CREDENTIAL_ID = 'sonar-qube'
  }
  parameters {
    string(name: 'PROJECT_VERSION', defaultValue: 'v1.0', description: '')
    string(name: 'PROJECT_NAME', defaultValue: 'mall-gateway', description: '')
  }
}

同时在ks-node节点中可以看到相应镜像的生成,这取决于maven运行在哪个节点上.

root@ks-node4:~# docker images|grep mall
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-83   09d37b7fdbe9   About a minute ago   571MB
harbor.intra.com/sangomall/mall-gateway                                    latest        09d37b7fdbe9   About a minute ago   571MB
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-81   0c988d315159   11 minutes ago       571MB
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-80   2ea22f1109a3   17 minutes ago       571MB
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-78   26bc7c406339   41 minutes ago       571MB
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-76   974154795e4a   About an hour ago    571MB
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-72   a3eba99f1956   2 hours ago          571MB
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-70   3f792a1b690d   2 hours ago          571MB
harbor.intra.com/sangomall/mall-order                                      SANPSHOT-68   15c9899f6e4d   2 hours ago          610MB
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-67   78eca4b72558   2 hours ago          571MB
registry.cn-shanghai.aliyuncs.com/kbsphere/mall-gateway                    SANPSHOT-64   6697c227d030   42 hours ago         571MB
registry.cn-shanghai.aliyuncs.com/kbsphere/mall-gateway                    SANPSHOT-62   4d6db79b8400   42 hours ago         571MB
registry.cn-shanghai.aliyuncs.com/kbsphere/mall-gateway                    SANPSHOT-59   eb5d1a775497   42 hours ago         571MB
registry.cn-shanghai.aliyuncs.com/kbsphere/mall-gateway                    SANPSHOT-55   58c4ef9f7571   42 hours ago         571MB
harbor.intra.com/sangomall/mall-gateway                                    SANPSHOT-52   ecff5a92358f   43 hours ago         571MB
192.168.31.104/sangomall/mall-gateway                                      SANPSHOT-50   056fc1fb7b3d   43 hours ago         571MB

7. 项目Release

7.1 创建TAG判断

return params.PROJECT_VERSION =~ /V.*/

请添加图片描述

@project-admin 
是否允许推送本次项目代码及容器镜像

请添加图片描述

添加凭证

GITLAB_PASSWORD
GITLAB_USERNAME

请添加图片描述

添加shell命令

git config --global user.email "project-admin@intra.com"
git config --global user.name "project-admin"

添加TAG(shell命令)

git tag -a $PROJECT_VERSION -m "$PROJECT_VERSION"

上传

git push http://$GITLAB_USERNAME:$GITLAB_PASSWORD@gitlab.intra.com/deploy/sangomall.git --tags --ipv4

7.2 添加harbor

添加凭证

HARBOR_PASSWORD
HARBOR_USERNAME

镜像tag

docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION
docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION

请添加图片描述

请添加图片描述

Jenkinsfile

pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  stages {
    stage('代码拉取') {
      agent none
      steps {
        git(url: 'http://192.168.31.199/deploy/sangomall.git', credentialsId: 'gitlab', branch: 'master', changelog: true, poll: false)
      }
    }

    stage('代码分析') {
      agent none
      steps {
        container('maven') {
          withCredentials([string(credentialsId : 'sonar-qube' ,variable : 'SONAR_TOKEN' ,)]) {
            withSonarQubeEnv('sonar') {
              sh 'mvn verify sonar:sonar -gs `pwd`/mvn_settings.xml -Dsonar.login=$SONAR_TOKEN'
            }

          }

          timeout(unit: 'HOURS', activity: true, time: 1) {
            waitForQualityGate 'true'
          }

        }

      }
    }

    stage('容器构建') {
      agent none
      steps {
        container('maven') {
          sh 'mvn clean install -Dmaven.test.skip=true -gs `pwd`/mvn_settings.xml'
          sh 'cd $PROJECT_NAME && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER .'
          withCredentials([usernamePassword(credentialsId : 'harbor' ,passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,)]) {
            sh 'echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin'
            sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest'
          }

        }

      }
    }

    stage('TAG定义') {
      agent none
      when {
        expression {
          return params.PROJECT_VERSION =~ /V.*/
        }

      }
      steps {
        container('maven') {
          input(message: '''@project-admin  
是否允许推送本次项目代码及容器镜像''', submitter: 'project-admin')
          withCredentials([usernamePassword(credentialsId : 'gitlab' ,passwordVariable : 'GITLAB_PASSWORD' ,usernameVariable : 'GITLAB_USERNAME' ,)]) {
            sh 'git config --global user.email "project-admin@intra.com"'
            sh 'git config --global user.name "project-admin"'
            sh 'git tag -a $PROJECT_VERSION -m "$PROJECT_VERSION"'
            sh 'git push http://$GITLAB_USERNAME:$GITLAB_PASSWORD@192.168.31.199/deploy/sangomall.git --tags --ipv4'
          }

          withCredentials([usernamePassword(credentialsId : 'harbor' ,passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,)]) {
            sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION'
          }

        }

      }
    }

  }
  environment {
    DOCKER_CREDENTIAL_ID = 'harbor'
    GITEE_CREDENTIAL_ID = 'gitlab'
    KUBECONFIG_CREDENTIAL_ID = 'sangomall-kubeconfig'
    REGISTRY = 'harbor.intra.com'
    DOCKERHUB_NAMESPACE = 'sangomall'
    GITEE_ACCOUNT = 'sangomall'
    SONAR_CREDENTIAL_ID = 'sonar-qube'
  }
  parameters {
    string(name: 'PROJECT_VERSION', defaultValue: 'V1.0', description: '')
    string(name: 'PROJECT_NAME', defaultValue: 'mall-gateway', description: '')
  }
}

7.3 运行构建

请添加图片描述

project-admin审批

请添加图片描述

审批后构筑继续

请添加图片描述

至此CI部分已经完成

8. 部署项目到kubesphere

8.1 添加审核

这步如果需要就增加,实际生产环境中不一定需要

@project-admin 
是否允许部署到K8s环境

8.2 部署容器

添加kubeconfig的凭证

KUBECONFIG_CONTENT

伸缩

mkdir ~/.kube && echo "$KUBECONFIG_CONTENT" > ~/.kube/config && envsubst < $PROJECT_NAME/deploy/deploy.yaml | kubectl apply -f -

请添加图片描述

至此CD部分也完成了

9. JenkinsFile

调整parameters和env位置

将以下内容添加到gitlab sangomall项目下的Jenkinsfile文件中

pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  parameters {
    string(name: 'PROJECT_VERSION', defaultValue: 'V1.0', description: '')
    string(name: 'PROJECT_NAME', defaultValue: 'mall-gateway', description: '')
  }
  environment {
    DOCKER_CREDENTIAL_ID = 'harbor'
    GITEE_CREDENTIAL_ID = 'gitlab'
    KUBECONFIG_CREDENTIAL_ID = 'sangomall-kubeconfig'
    REGISTRY = 'harbor.intra.com'
    DOCKERHUB_NAMESPACE = 'sangomall'
    GITEE_ACCOUNT = 'sangomall'
    SONAR_CREDENTIAL_ID = 'sonar-qube'
  }
  stages {
    stage('代码拉取') {
      agent none
      steps {
        git(url: 'http://192.168.31.199/deploy/sangomall.git', credentialsId: 'gitlab', branch: 'master', changelog: true, poll: false)
      }
    }

    stage('代码分析') {
      agent none
      steps {
        container('maven') {
          withCredentials([string(credentialsId : 'sonar-qube' ,variable : 'SONAR_TOKEN' ,)]) {
            withSonarQubeEnv('sonar') {
              sh 'mvn verify sonar:sonar -gs `pwd`/mvn_settings.xml -Dsonar.login=$SONAR_TOKEN'
            }

          }

          timeout(unit: 'HOURS', activity: true, time: 1) {
            waitForQualityGate 'true'
          }

        }

      }
    }

    stage('容器构建') {
      agent none
      steps {
        container('maven') {
          sh 'mvn clean install -Dmaven.test.skip=true -gs `pwd`/mvn_settings.xml'
          sh 'cd $PROJECT_NAME && docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER .'
          withCredentials([usernamePassword(credentialsId : 'harbor' ,passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,)]) {
            sh 'echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin'
            sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:latest'
          }

        }

      }
    }

    stage('TAG定义') {
      agent none
      when {
        expression {
          return params.PROJECT_VERSION =~ /V.*/
        }

      }
      steps {
        container('maven') {
          input(message: '''@project-admin  
是否允许推送本次项目代码及容器镜像''', submitter: 'project-admin')
          withCredentials([usernamePassword(credentialsId : 'gitlab' ,passwordVariable : 'GITLAB_PASSWORD' ,usernameVariable : 'GITLAB_USERNAME' ,)]) {
            sh 'git config --global user.email "project-admin@intra.com"'
            sh 'git config --global user.name "project-admin"'
            sh 'git tag -a $PROJECT_VERSION -m "$PROJECT_VERSION"'
            sh 'git push http://$GITLAB_USERNAME:$GITLAB_PASSWORD@192.168.31.199/deploy/sangomall.git --tags --ipv4'
          }

          withCredentials([usernamePassword(credentialsId : 'harbor' ,passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,)]) {
            sh 'docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:SANPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION'
          }

        }

      }
    }

    stage('部署到Kubesphere') {
      agent none
      steps {
        input(message: '''@project-admin  
是否允许部署到K8s环境''', submitter: 'project-admin')
        container('maven') {
          withCredentials([kubeconfigContent(credentialsId : 'sangomall-kubeconfig' ,variable : 'KUBECONFIG_CONTENT' ,)]) {
            sh 'mkdir ~/.kube && echo "$KUBECONFIG_CONTENT" > ~/.kube/config && envsubst < $PROJECT_NAME/deploy/deploy.yaml | kubectl apply -f -'
          }

        }

      }
    }

  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BetaFlight统一硬件配置文件研读之serial命令

BetaFlight统一硬件配置文件研读之serial命令 1. 源由2. 代码分析3. 实例分析4. 配置情况5. 参考资料 统一硬件配置文件的设计是一种非常好的设计模式&#xff0c;可以将硬件和软件的工作进行解耦。 1. 源由 cli命令中serial是对UART串口的配置&#xff0c;通常情况下BetaFli…

Redo log详解

WAL&#xff08;Write-Ahead Logging&#xff09;机制 WAL 的全称是 Write-Ahead Logging&#xff0c;中文称预写式日志(日志先行)&#xff0c;是一种数据安全写入机制。就是先写日志&#xff0c;然后再写入磁盘&#xff0c;这样既能提高性能又可以保证数据的安全性。Mysql中的…

基于Python的PROSAIL模型介绍以及使用

1、介绍 PROSAIL是两种模型耦合得到的。 SAIL是冠层尺度的辐射传输模型&#xff0c;把冠层假设成是连续的且具有给定几何形状和密度的水平均匀分布的介质层&#xff0c;从而模拟入射辐射与均匀介质之间的相互作用&#xff0c;具体还是挺复杂的。而PROSPECT就是叶片尺度的辐射传…

Kafka知识概况

Kafka知识概况 Kafka简介Kafka 生产者Kafka BrokerKafka 消费者Kafka-Eagle 监控Kafka-Kraft 模式集成 SpringBoot Kafka简介 消息队列简介&#xff1a; 目 前企业中比较常见的消息队列产 品主 要有 Kafka、ActiveMQ 、RabbitMQ 、RocketMQ 等。在大数据场景主要采用 Kafka 作…

vmware虚拟机安装k8s(之前已经安装过docker)

1、安装开始 先执行&#xff1a;curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add 再执行更改源&#xff1a;echo "deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main" >> /etc/apt/sources.list …

redis分布式锁

文章目录 锁的种类一个靠谱分布式锁需要具备的条件和刚需独占性高可用防死锁不乱抢重入性 如何一步一步实现一个完备的分布式锁单机版加锁Redis分布式锁setnx宕机与过期 防死锁防止误删key的问题lua脚本保证原子性 hsetnx 可重入锁简单工厂模式RedisDistributeLockDistributed…

阿里云服务器购买教程(新手入门指南)

阿里云服务器ECS选购指南&#xff0c;阿里云百科分享2023阿里云服务器新手选择流程&#xff0c;选购云服务器有两个入口&#xff0c;一个是选择活动机&#xff0c;只需要选择云服务器地域、系统、带宽即可&#xff1b;另一个是在云服务器页面&#xff0c;自定义选择云服务器配置…

mac下用git客户端生成ssh秘钥并配置到souretree进行使用

一、使用git 生成 ssh 密钥 1、Mac 安装 git 客户端 打开终端&#xff0c;执行命令&#xff1a; $ brew install git2、执行命令 $ git config --global user.name "xxx" 你自己的名字 $ git config --global user.email "xxxxxx.com&q…

深度学习的环境搭建(window+pytorch)

1.检查是否安装CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由 NVIDIA 推出的一种并行计算平台和编程模型&#xff0c;用于利用 NVIDIA GPU&#xff08;Graphics Processing Unit&#xff09;的强大计算能力进行高性能计算任务。CUDA 的主要特点是…

App违反Google数据安全政策,解决方案

前言 google隐私政策阶段性会进行更新&#xff0c;时长关注隐私政策变化&#xff0c;避免app被强制下架&#xff0c;影响后续运营工作。 邮件内容 摘录邮件详情 我们在以下区域发现了问题&#xff1a; SPLIT_BUNDLE 2:政策声明&#xff0c;数据安全部分&#xff1a;“https:…

大数据企业应用合作解决方案案例

打造产教融合的就业育人的综合服务平台&#xff0c;给予十余年的数据智能产业实践经验&#xff0c;专注于大数据和人工智能方向。 目前合作的企业案例包括&#xff1a;信访大数据平台解决方案、工业废水处理解决方案、找齐远程监控解决方案、道路运输安全、广电用户服务大数据解…

清洁赛道新势力,米博凭“减法”突围?

在五四青年节这个特殊的日子&#xff0c;方太旗下的高端智能清洁品牌“米博”发布了新一代无滚布洗地机7系列。 5月4日晚&#xff0c;米博以“减法生活&#xff0c;净请7代”为主题&#xff0c;举办了新品发布会。在发布会上&#xff0c;从小红书翻红的董洁作为方太集团米博产…

Windows命令提示行使用指南一

命令提示行使用指南 前言一、起源和发展二、和DOS的关系三、常用命令 前言 cmd 是 Windows 操作系统中的命令行界面&#xff08;CLI&#xff09;&#xff0c;也称为命令提示符&#xff08;CMD&#xff09;或批处理文件。它是 Windows 命令行界面的主要组成部分&#xff0c;用于…

ASK,FSK和PSK

一、ASK&#xff0c;FSK和PSK 数字信号只有有限个离散值&#xff0c;使用数字信号对载波进行调制的方式称为键控(Keying),分为幅度键控&#xff08;ASK)、频移键控&#xff08;FSK)和相移键控&#xff08;PSK)。 幅度键控可以通过乘法器和开关电路来实现&#xff0c;在数字信…

八、(了解即可)MyBatis懒加载(或者叫延迟加载)

文章目录 八、懒加载(了解即可)8.1 为啥需要懒加载?8.2 懒加载是什么&#xff1f;8.3 开启方式8.4 既然fetchType可以控制懒加载那么我仅仅配置fetchType不配置全局的可以吗&#xff1f;8.5 aggressiveLazyLoading是做什么么的&#xff1f;8.6 注意点8.7 案例验证懒加载准备工…

自学Python必须知道的优秀社区

国内学习Python网站&#xff1a; 知乎学习平台&#xff1a;Python - 基础入门 - 知学堂黑马程序员视频库&#xff1a;大数据学习路线2023版-黑马程序员大数据学习路线图菜鸟教程&#xff1a;菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01;极客学院&#xff1a;极…

进阶自动化测试,这3点你一定要知道的...

自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化测试框架一般可以分为两个层次&#xff0c;上层是管理整个自动化测试的开发&a…

玩转服务器之Java Web篇:手把手教你搭建Java Web环境

前言 Java Web项目&#xff0c;简单来说就是我们在浏览器上可以看到的内容。就简单的Web来说&#xff0c;服务器上也同样需要有计算机上所需要的运行环境&#xff0c;如&#xff1a;java,tomcat,mysql 。Java Web环境可以用来开发和部署各种Web应用程序&#xff0c;例如网站、…

Redis基础

Redis基础 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis 1. 前言 1.1 什么是Redis Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0…

HTTP的特点

灵活可扩展 HTTP 协议最初诞生的时候就比较简单&#xff0c;本着开放的精神只规定了报文的基本格式&#xff0c;比如用空格分隔单词&#xff0c;用换行分隔字段&#xff0c;“headerbody”等&#xff0c;报文里的各个组成部分都没有做严格的语法语义限制&#xff0c;可以由开发…