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

news2024/11/24 21:22:59

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

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 -'
          }

        }

      }
    }

  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb ( 三 ) Web Server 服务器

1.5.Web Server服务器 Web Server 服务器是一种安装在服务器主机上的应用程序, 用于处理客户端(Web浏览器)的请求&#xff0c;并返回响应内容。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流。 简单说就是将http协议的信息翻译成对应开发语言可以处理的对象信息。…

lombok常用的注解及使用方法

lombok是⼀种简化源码提⾼编程效率的⼯具&#xff0c;⽤于⽣成常⽤的代码。 如何使用lombok 引⼊依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</ver…

【ChatGPT】吴恩达『提示工程』课程完全笔记下载

版权说明&#xff1a;『ChatGPT Prompt Engineering for Developers』是DeepLearning.AI出品的免费课程&#xff0c;版权属于DeepLearning.AI(https://www.deeplearning.ai/)。 本文是对该课程内容的翻译整理&#xff0c;只作为教育用途&#xff0c;不作为任何商业用途。 吴恩达…

Activiti7流程操作详解

一、Activiti流程操作步骤 定义流程&#xff0c;按照BPMN的规范&#xff0c;使用流程定义工具&#xff0c;用流程符号把整个流程描述出来 部署流程&#xff0c;把画好的流程定义文件&#xff0c;加载到数据库中&#xff0c;生成表的数据 启动流程&#xff0c;使用java代码来操…

4D成像雷达风口,谁在快速崛起?

4D成像雷达正进入规模量产落地的关键窗口期。 高工智能汽车注意到&#xff0c;毫米波雷达的发展某种程度上可以分为两个阶段&#xff1a;第一个阶段&#xff0c;传统毫米波雷达时代&#xff0c;市场基本被博世、大陆、安波福等国际Tier1巨头把持&#xff0c;市场格局长期稳固&…

树形结构的三级分类如何实现?

概述&#xff1a; 本三级联动分类服务端使用的是: Springboot MyBatis-plus&#xff0c;前端使用的是&#xff1a;VueElementUI&#xff0c;树形控件使用的是el-tree。本三级联动分类可以把任一拖拽子项到其它目录&#xff0c;可以添加、编辑、删除分类。 效果图&#xff1a…

编译原理笔记(一)引论

文章目录 1.什么是编译程序2.编译过程和编译程序的结构2.1.编译过程概述2.2.编译程序的结构2.3.编译阶段的组合 3.解释程序和一些软件工具3.1.解释程序3.2.处理源程序的软件工具 4.PL/0语言编译系统 学习总结&#xff1a;这一部分是编译原理的绪论部分内容&#xff0c;对编译程…

Tokenizer分词

分词的一般流程 在使用神经网络处理自然语言处理任务时&#xff0c;我们首先需要对数据进行预处理&#xff0c;将数据从字符串转换为神经网络可以接受的格式&#xff0c;一般会分为如下几步&#xff1a; &#xff08;1&#xff09;分词&#xff1a;使用分词器对文本数据进行分…

STM32CUBEMX 待机模式最简单的RTC定时唤醒(低功耗电池产品必备)

文章意义&#xff1a; 看到很多技术帖子讲述RTC定时唤醒功能的时候&#xff0c;老是需要去读取当前时间&#xff0c;再设定下一个闹钟唤醒时间&#xff0c;无形中多了很多变量和操作。所以我决定分享一种简单的RTC定时唤醒方法&#xff0c;适合于不需要实现具体时间获取的场合…

企业遇到知识管理困境该怎么办?这里有解决方案!寻找Baklib

随着企业业务不断扩大&#xff0c;员工数量的增加&#xff0c;知识管理成为了企业面临的一个重要问题。企业需要管理大量的知识&#xff0c;如产品手册、流程规范、客户信息等&#xff0c;这些知识对企业的生产和经营至关重要。但是&#xff0c;如何高效地管理这些知识&#xf…

LeetCode_双指针_中等_24.两两交换链表中的节点

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&a…

第40讲:Python for-in循环语句使用索引遍历序列

文章目录 方法一&#xff1a;遍历的是序列的元素方法二&#xff1a;遍历的是序列的索引方法三&#xff1a;while循环遍历实现方法四&#xff1a;调用内置函数enumerate实现1.什么是enumerate函数2.调用内置函数enumerate实现索引遍历序列 如果在遍历序列的过程中&#xff0c;需…

国产高端GPU,国产替代加速(附国产厂家汇总)

前言 2022年8月9日&#xff0c;壁仞科技在上海发布首款通用GPU芯片BR100&#xff0c;标志着中国企业第一次打破了此前一直由国际巨头保持的通用GPU全球算力纪录&#xff1b; 8月31日&#xff0c;美国政府命令芯片厂商英伟达&#xff08;NVIDIA&#xff09;以及超威半导体&…

借助 Google Play 游戏电脑版 Com2uS 为用户打造多平台无缝体验

作者 / Google Play 游戏总监 Arjun Dayal 吸引潜在用户在 PC 端畅享游戏 《魔灵召唤&#xff1a;克罗尼柯战记》是韩国游戏开发商 Com2uS 于 2023 年 3 月面向全球发布的一款移动端大型多人在线角色扮演游戏。迄今为止&#xff0c;《魔灵召唤》在全球的下载量超过 1.8 亿&…

Aztec:混合zkRollup,而非zkEVM

1. 引言 Aztec zkRollup为混合zkRollup&#xff1a; 支持通用私有计算的加密zkRollup&#xff08;命名为Aztec&#xff09;&#xff1a;构建trustless、可扩展的、去中心化的Layer2 zkRollup&#xff0c;同时支持private smart contract execution。同时支持public state和pr…

C++ Primer阅读笔记--参数传递

目录 1--三种基本传递方式 2--数组形参 3--main函数传递参数 4--传递可变形参 1--三种基本传递方式 ① 值传递&#xff1a; 使用值传递时&#xff0c;初始值会拷贝给变量&#xff0c;对变量的改动不会改变初始值的值&#xff1b; ② 指针传递&#xff1a; 使用指针传递时&…

Mysql 查询性能优化

查看数据库用户连接数量 show processlist;分析表结构 索引 show index from conference;查询锁状态 show status like %lock%;是否开启慢查询 show variables like %slow_query_log%;日志查询默认情况下&#xff1a;slow_query_log的Value为OFF 如要开启慢查询日志&#…

2023最新软件测试面试题汇总

常见的面试题汇总 1、你做了几年的测试、自动化测试&#xff0c;说一下 selenium 的原理是什么&#xff1f; 我做了五年的测试&#xff0c;1年的自动化测试&#xff1b; selenium 它是用 http 协议来连接 webdriver &#xff0c;客户端可以使用 Java 或者 Python 各种编程语言…

AI奇点将至 如何成为人工智能驱动型公司

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 2023年4月16日&#xff0c;中泰证券首席经济学家李迅雷先生发表了《奇点将至&#xff1a;AI或开启新一轮科技革命》的文章。李迅雷先生认为&#xff0c;以智能化为特征的第四次工业革命轮廓日渐清晰&#xff0c;在世界百年未…

Linux网络编程:socket、客户端服务器端使用socket通信

socket socket&#xff08;套接字&#xff09;&#xff0c;用于网络中不同主机间进程的通信。 socket是一个伪文件&#xff0c;包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信&#xff0c;但需要协议&#xff08;IPV4、IPV6等&#xff09;…