学习笔记八:基于Jenkins+k8s+Git+DockerHub等技术链构建企业级DevOps容器云平台

基于Jenkins+k8s+Git+DockerHub等技术链构建企业级DevOps容器云平台

  • 测试jenkins的CI/CD
    • 在Jenkins中安装kubernetes插件
    • 安装blueocean插件
    • 配置jenkins连接到我们存在的k8s集群
    • 配置pod-template
    • 添加自己的dockerhub凭据
    • 测试通过Jenkins部署应用发布到k8s开发环境、测试环境、生产环境
  • 基于Jenkins+k8s+Git+harbor构建DevOps容器云平台
    • 编写jenkins pipeline
    • Jenkins实现k8s应用按照指定版本回滚
  • jenkins+k8s+harbor实现DevOps
    • 编写jenkins pipeline
  • Jenkins接入Sonarqube
  • Jenkins+k8s+nexus+gitlab+harbor+sonarqube+springloud构建DevOps
    • 配置sonarqube
    • Jenkins界面添加harbor凭据
    • 安装nexus
      • 概念:
    • 安装gitlab
      • 在Jenkins安装git插件
      • 提交本地代码到gitlab:
    • Jenkins+k8s+nexus+sonarqube+harbor+gitlab构建DevOps
  • Jenkins Pipeline语法介绍
    • Jenkins Pipeline介绍
    • 总结

测试jenkins的CI/CD

在Jenkins中安装kubernetes插件

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/

系统管理------>插件管理------>可选插件------>搜索kubernetes------>出现如下

在这里插入图片描述

清华大学jekins源

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/

安装blueocean插件

在这里插入图片描述

配置jenkins连接到我们存在的k8s集群

访问http://192.168.40.180:30002/configureClouds/
新增一个云,在下拉菜单中选择kubernets并添加
在这里插入图片描述

填写云kubernetes配置内容

名称: kubernetes
Kubernetes地址: 
https://192.168.40.180:6443

在这里插入图片描述

测试jenkins和k8s是否可以通信

Kubernetes名称空间: jenkins-k8s-sa

在这里插入图片描述

点击连接测试,如果显示Connected to Kubernetes v1.23.1,说明测试成功,Jenkins可以和k8s进行通信
Jenkins地址:

http://jenkins-service.jenkins-k8s.svc.cluster.local:8080

在这里插入图片描述

配置pod-template

配置pod template
在这里插入图片描述
在这里插入图片描述

点击Pod Template details
在这里插入图片描述

点击容器列表下的添加容器
在这里插入图片描述

名称:jnlp
Docker镜像:jenkins-slave-latest:v1

jenkins-slave-latest:v1

在这里插入图片描述
在这里插入图片描述

给上面的pod template添加卷
在这里插入图片描述
在这里插入图片描述

/var/run/docker.sock
/var/run/docker.sock

/root/.kube
/home/jenkins/.kube

在k8smaster1 执行

scp -r /root/.kube/  k8snode1:/root/

在Service Account处输入jenkins-k8s-sa,这个sa就是我们最开始安装jenkins时的sa

在这里插入图片描述

上面配置好之后,Apply(应用)------>Save(保存)

在这里插入图片描述

添加自己的dockerhub凭据

首页------>系统管理Manage Credentials(管理凭据)------>点击Stores scoped to Jenkins下的第一行jenkins后的全局,显示如下

在这里插入图片描述

点击添加凭据,出现如下------>
在这里插入图片描述

username:test
password:1989*****
ID:dockerhub
描述:随意写一段描述即可
上面改好之后选择确定即可

测试通过Jenkins部署应用发布到k8s开发环境、测试环境、生产环境

开发提交代码到代码仓库gitlab–>jenkins检测到代码更新–>调用k8s api在k8s中创建jenkins slave pod:
Jenkins slave pod拉取代码—>通过maven把拉取的代码进行构建成war包或者jar包—>上传代码到Sonarqube,进行静态代码扫描- -->基于war包构建docker image–>把镜像上传到harbor镜像仓库–>基于镜像部署应用到开发环境–>部署应用到测试环境—>部署应用到生产环境。

在这里插入图片描述

复制 jenkins-pipeline-script.txt 文件内容至Pipeline Script
在k8s的控制节点创建名称空间

kubectl create ns devlopment
kubectl create ns production
kubectl create ns qatest

回到首页:
开始创建一个新任务------>

在这里插入图片描述

输入一个任务名称:jenkins-variable-test-deploy------>
在这里插入图片描述

流水线------>
在这里插入图片描述
确定------>
在Pipeline script处输入如下内容

node('testhan') {
    stage('Clone') {
        echo "1.Clone Stage"
        git url: "https://github.com/luckylucky421/jenkins-sample.git"
        script {
            build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
        }
    }
    stage('Test') {
      echo "2.Test Stage"

    }
    stage('Build') {
        echo "3.Build Docker Image Stage"
        sh "docker build -t xianchao/jenkins-demo:${build_tag} ."
    }
    stage('Push') {
        echo "4.Push Docker Image Stage"
        withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
            sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"
            sh "docker push xianchao/jenkins-demo:${build_tag}"
        }
    }
    stage('Deploy to dev') {
        echo "5. Deploy DEV"
		sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev.yaml"
        sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev.yaml"
//        sh "bash running-devlopment.sh"
        sh "kubectl apply -f k8s-dev.yaml  --validate=false"
	}	
	stage('Promote to qa') {	
		def userInput = input(
            id: 'userInput',

            message: 'Promote to qa?',
            parameters: [
                [
                    $class: 'ChoiceParameterDefinition',
                    choices: "YES\nNO",
                    name: 'Env'
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        if (userInput == "YES") {
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa.yaml"
//            sh "bash running-qa.sh"
            sh "kubectl apply -f k8s-qa.yaml --validate=false"
            sh "sleep 6"
            sh "kubectl get pods -n qatest"
        } else {
            //exit
        }
    }
	stage('Promote to pro') {	
		def userInput = input(

            id: 'userInput',
            message: 'Promote to pro?',
            parameters: [
                [
                    $class: 'ChoiceParameterDefinition',
                    choices: "YES\nNO",
                    name: 'Env'
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        if (userInput == "YES") {
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod.yaml"
//            sh "bash running-production.sh"
            sh "cat k8s-prod.yaml"
            sh "kubectl apply -f k8s-prod.yaml --record --validate=false"
        }
    }
}

应用------>保存------>立即构建,在#1的Console Output可看到构建过程:

在这里插入图片描述

在这里插入图片描述

在Console Output如果看到如下:

在这里插入图片描述

点击Input requested

在这里插入图片描述

点击继续

在这里插入图片描述

上面可以看到已经把应用部署到dev环境了
点击Input requested

在这里插入图片描述

在这里插入图片描述

通过上面可以看到把应用部署到了pro环境了

验证是否在devlopment和production名称空间下有应用

kubectl get pods -n production
kubectl get pods -n devlopment
kubectl get pods -n qatest

通过上面可以看到jenkins对接k8s,可以把应用发布到k8s集群的开发、测试、生产环境了。

基于Jenkins+k8s+Git+harbor构建DevOps容器云平台

需要有一台harbor服务,我的harbor安装在了192.168.40.182机器上
添加凭据
首页------>系统管理管理凭据------>点击Stores scoped to Jenkins下的第一行jenkins,显示如下

在这里插入图片描述

点击这个全局凭据,出现如下------>
在这里插入图片描述
点击左侧的添加凭据,出现如下------>
在这里插入图片描述

username:admin
password:Harbor12345
ID:dockerharbor

编写jenkins pipeline

因为镜像要上传到harbor私有镜像仓库,所以需要在harbor上创建一个项目,项目名称是jenkins-demo,如下所示:
在这里插入图片描述

上面项目创建成功之后,执行如下步骤:
复制jenkins-pipeline-harbor-script.txt文件 里面内容到Pipeline Script

新建一个任务------>输入一个任务名称处输入jenkins-harbor------>流水线------>确定------>在Pipeline script处输入如下内容

node('testhan') {
    stage('Clone') {
        echo "1.Clone Stage"
        git url: "https://github.com/luckylucky421/jenkins-sample.git"
        script {
            build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
        }
    }
    stage('Test') {
      echo "2.Test Stage"

    }
    stage('Build') {
        echo "3.Build Docker Image Stage"
        sh "docker build -t 192.168.40.182/jenkins-demo/jenkins-demo:${build_tag} ."
    }
    stage('Push') {
        echo "4.Push Docker Image Stage"
        withCredentials([usernamePassword(credentialsId: 'dockerharbor', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
            sh "docker login 192.168.40.182 -u ${dockerHubUser} -p ${dockerHubPassword}"
            sh "docker push 192.168.40.182/jenkins-demo/jenkins-demo:${build_tag}"
        }
    }
    stage('Deploy to dev') {
        echo "5. Deploy DEV"
		sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev-harbor.yaml"
        sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev-harbor.yaml"
//        sh "bash running-devlopment.sh"
        sh "kubectl apply -f k8s-dev-harbor.yaml  --validate=false"
	}	
	stage('Promote to qa') {	
		def userInput = input(
            id: 'userInput',

            message: 'Promote to qa?',
            parameters: [
                [
                    $class: 'ChoiceParameterDefinition',
                    choices: "YES\nNO",
                    name: 'Env'
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        if (userInput == "YES") {
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa-harbor.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa-harbor.yaml"
//            sh "bash running-qa.sh"
            sh "kubectl apply -f k8s-qa-harbor.yaml --validate=false"
            sh "sleep 6"
            sh "kubectl get pods -n qatest"
        } else {
            //exit
        }
    }
	stage('Promote to pro') {	
		def userInput = input(

            id: 'userInput',
            message: 'Promote to pro?',
            parameters: [
                [
                    $class: 'ChoiceParameterDefinition',
                    choices: "YES\nNO",
                    name: 'Env'
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        if (userInput == "YES") {
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod-harbor.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod-harbor.yaml"
//            sh "bash running-production.sh"
            sh "cat k8s-prod-harbor.yaml"
            sh "kubectl apply -f k8s-prod-harbor.yaml --record --validate=false"
        }
    }
}

应用------>保存------>立即构建即可,打开blue ocean会看到如下流程,可以手动点击确认
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Jenkins实现k8s应用按照指定版本回滚

回到首页:
新建一个任务------>输入一个任务名称处输入jenkins-variable-test-deploy-rollout------>流水线------>确定------>在Pipeline script处输入如下内容

node('testhan') {
  stage('git clone') {
    git url: "https://github.com/luckylucky421/jenkins-rollout"
    sh "ls -al"
    sh "pwd"
}
  stage('select env') {
    def envInput = input(
      id: 'envInput',
      message: 'Choose a deploy environment',
      parameters: [
         [
             $class: 'ChoiceParameterDefinition',
             choices: "devlopment\nqatest\nproduction",
             name: 'Env'
         ]
     ]
)
echo "This is a deploy step to ${envInput}"
sh "sed -i 's/<namespace>/${envInput}/' getVersion.sh"
sh "sed -i 's/<namespace>/${envInput}/' rollout.sh"
sh "bash getVersion.sh"
// env.WORKSPACE = pwd()
// def version = readFile "${env.WORKSPACE}/version.csv"
// println version
}
  stage('select version') {
     env.WORKSPACE = pwd()
  def version = readFile "${env.WORKSPACE}/version.csv"
  println version
      def userInput = input(id: 'userInput',
                                        message: '选择回滚版本',
                                        parameters: [
            [
                 $class: 'ChoiceParameterDefinition',
                 choices: "$version\n",
                 name: 'Version'
       ]
      ]
)
       sh "sed -i 's/<version>/${userInput}/' rollout.sh"
}
  stage('rollout deploy') {
      sh "bash rollout.sh"
}
}

在这里插入图片描述

点击应用->保存-立即构建
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

jenkins+k8s+harbor实现DevOps

添加凭据
首页------>系统管理管理凭据------>点击Stores scoped to Jenkins下的第一行jenkins,显示如下

在这里插入图片描述

点击这个全局凭据,出现如下------>
在这里插入图片描述

点击左侧的添加凭据,出现如下------>
在这里插入图片描述

username:admin
password:Harbor12345
ID:dockerharbor
描述:随意

上面改好之后选择确定即可

编写jenkins pipeline

因为镜像要上传到harbor私有镜像仓库,所以需要在harbor上创建一个项目,项目名称是jenkins-demo,如下所示:
在这里插入图片描述
新建一个任务------>输入一个任务名称处输入jenkins-harbor------>流水线------>确定------>在Pipeline script处输入如下内容

node('testhan') {
    stage('Clone') {
        echo "1.Clone Stage"
        git url: "https://github.com/luckylucky421/jenkins-sample.git"
        script {
            build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
        }
    }
    stage('Test') {
      echo "2.Test Stage"

    }
    stage('Build') {
        echo "3.Build Docker Image Stage"
        sh "docker build -t 192.168.40.132/jenkins-demo/jenkins-demo:${build_tag} ."
    }
    stage('Push') {
        echo "4.Push Docker Image Stage"
        withCredentials([usernamePassword(credentialsId: 'dockerharbor', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
            sh "docker login 192.168.40.132 -u ${dockerHubUser} -p ${dockerHubPassword}"
            sh "docker push 192.168.40.132/jenkins-demo/jenkins-demo:${build_tag}"
        }
    }
    stage('Deploy to dev') {
        echo "5. Deploy DEV"
		sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev-harbor.yaml"
        sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev-harbor.yaml"
//        sh "bash running-devlopment.sh"
        sh "kubectl apply -f k8s-dev-harbor.yaml  --validate=false"
	}	
	stage('Promote to qa') {	
		def userInput = input(
            id: 'userInput',

            message: 'Promote to qa?',
            parameters: [
                [
                    $class: 'ChoiceParameterDefinition',
                    choices: "YES\nNO",
                    name: 'Env'
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        if (userInput == "YES") {
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa-harbor.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa-harbor.yaml"
//            sh "bash running-qa.sh"
            sh "kubectl apply -f k8s-qa-harbor.yaml --validate=false"
            sh "sleep 6"
            sh "kubectl get pods -n qatest"
        } else {
            //exit
        }
    }
	stage('Promote to pro') {	
		def userInput = input(

            id: 'userInput',
            message: 'Promote to pro?',
            parameters: [
                [
                    $class: 'ChoiceParameterDefinition',
                    choices: "YES\nNO",
                    name: 'Env'
                ]
            ]
        )
        echo "This is a deploy step to ${userInput}"
        if (userInput == "YES") {
            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod-harbor.yaml"
            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod-harbor.yaml"
//            sh "bash running-production.sh"
            sh "cat k8s-prod-harbor.yaml"
            sh "kubectl apply -f k8s-prod-harbor.yaml --record --validate=false"
        }
    }
}

应用------>保存------>立即构建即可,打开blue ocean会看到如下流程,可以手动点击确认
在这里插入图片描述

Jenkins接入Sonarqube

在dockerharbor上安装sonarqube:

docker run   -d   --name postgres10   -p 5432:5432   -e POSTGRES_USER=sonar   -e POSTGRES_PASSWORD=123456   postgres
docker run   -d   --name sonarqube7.9   -p 9000:9000   --link postgres10   -e SONARQUBE_JDBC_URL=jdbc:postgresql://postgres10:5432/sonar   -e SONARQUBE_JDBC_USERNAME=sonar   -e SONARQUBE_JDBC_PASSWORD=123456   -v sonarqube_conf:/opt/sonarqube/conf   -v sonarqube_extensions:/opt/sonarqube/extensions   -v sonarqube_logs:/opt/sonarqube/logs   -v sonarqube_data:/opt/sonarqube/data   sonarqube

在jenkins中安装sonarqube插件:
系统管理->插件管理->可选插件:搜索sonar,找到Sonarqube Scanner
在这里插入图片描述
在这里插入图片描述
选择Sonarqube Scanner直接安装,安装之后重启jenkins即可
在这里插入图片描述
在sonarqube的web界面创建一个token:
在这里插入图片描述
在这里插入图片描述
选择Generate出现如下:
在这里插入图片描述

把copy后面的一串token记录下来:

2b91be9d40a28385d8b2f61b0fc0a52efd5abf97

回到k8s的master1节点:

cd /root/microservic-test
mvn sonar:sonar   -Dsonar.host.url=http://192.168.40.181:9000 -Dsonar.login=2b91be9d40a28385d8b2f61b0fc0a52efd5abf97

这样就可以把代码上传到sonarqube了

在这里插入图片描述

在这里插入图片描述

Jenkins+k8s+nexus+gitlab+harbor+sonarqube+springloud构建DevOps

配置sonarqube

如上面步骤

Jenkins界面添加harbor凭据

如上面步骤

安装nexus

概念:

  • Nexus服务器是一个代码包管理的服务器,可以理解 Nexus 服务器是一个巨大的 Library 仓库。Nexus 可以支持管理的工具包括 Maven , npm 等,对于 JAVA 开发来说,只要用到 Maven 管理就可以了。
  • Nexus服务器作用:因为传统的中央仓库在国外,其地理位置比较远,下载速度比较缓慢。因此,当公司开发人员数量越来越多时,如果不架设一台自己的Nexus服务器,会产生大量的流量阻塞带宽,并且在出现一些不可抗原因(光缆被挖断)导致无法连接到中央仓库时,开发就会因为无法下载相关依赖包而进度停滞。
  • 因此在本地环境部署一台私有的Nexus服务器来缓存所有依赖包,并且将公司内部开发的私有包也部署上去,方便其他开发人员下载,是非常有必要的。因为 Nexus 有权限控制,因此外部人员是无法得到公司内部开发的项目包的。
    下面将介绍如何将自己的maven构件发布到nexus私服 上呢?

在192.168.40.133上安装:

docker run -d -p 8081:8081 -p 8082:8082 -p 8083:8083 -v /etc/localtime:/etc/localtime --name nexus3   sonatype/nexus3

在日志中,会看到一条消息: Started Sonatype Nexus OSS 3.20.1-01 这意味着Nexus Repository Manager可以使用了。现在转到浏览器并打开

http://your-ip-addr:8081

第一步:在 pom.xml 文件中声明发布的宿主仓库和 release 版本发布的仓库。

<!-- 发布构件到Nexus -->
    <distributionManagement>
        <repository>
            <id>releases</id>
            <name>nexus-releases</name>
            <url>http://192.168.40.133:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <name>nexus-snapshots</name>
            <url>http://192.168.40.133:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

第二步:在 settings.xml 文件中配置
由于用 Maven 分发构件到远程仓库需要认证,须要在~/.m2/settings.xml或者中加入验证信息:

<servers>  
   <server>  
           <id>public</id>  
           <username>admin</username>  
           <password>123456</password>  
       </server>  
   <server>  
           <id>releases</id>  
           <username>admin</username>  
           <password>123456</password>  
       </server>  
   <server>  
           <id>snapshots</id>  
           <username>admin</username>  
           <password>123456</password>  
       </server>  
 </servers>

注意: settings.xml 中 server 元素下 id 的值必须与 POM 中 repository 或 snapshotRepository 下 id 的值完全一致 。

安装gitlab

在192.168.40.135上安装

docker run -d  -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce  gitlab/gitlab-ce

改配置:增加如下三行:

cat /home/gitlab/config/gitlab.rb
external_url 'http://192.168.40.135'
gitlab_rails['gitlab_ssh_host'] = '192.168.40.135'
gitlab_rails['gitlab_shell_ssh_port'] = 222

重启docker:

docker restart gitlab

登录192.168.40.135即可登录:
第一次登录注册账号密码之后,报错如下:
Your account is pending approval from your GitLab administrator and hence bl

docker exec -it gitlab sh
irb(main):004:0> u=User.where(id:1).first
=> #<User id:1 @root>
irb(main):005:0> u.password='12345678'
=> "12345678"
irb(main):006:0> u.password_confirmation='12345678' 
=> "12345678"
irb(main):007:0> u.save!
=> true

再次登录192.168.40.135

用户名是root
密码是12345678

在Jenkins安装git插件

系统管理-插件管理-可选插件-搜索git安装即可
Jenkins-凭据-全局凭据
在这里插入图片描述
在gitlab上新建项目:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建密钥对:

ssh-keygen -t rsa
#一路回车

上传密钥:

cat ~/.ssh/id_rsa.pub #查看公钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8KZUe+PJykjZzJherolD+vXsw8/aL3OMyX/x1HF6Rz73dNZFCERQxA6t/9ahRrya8iY7IIloLjzi5iX666mzYI3fAEq1Ga3Dz2MWqEeWZGdbNKvL9lf0qTy0aLBIRe2fnQwrkrP2YakiqzDRpyjQgr05VkrnF5bVLX2HCHuC2GXwnHUAuJEkjb1f9vmII7YP0BmYDMOMpricQ1LeFnQ9cc2ZvPw6212yiXOrbhrbiMtjCYTPoRA8EIfmRAPcNcVl4GT3fZxAVocDk70rA/tEWCgu+zzFFH+aWhaIXMdkC70FEWLD28AxLWwwKj22KA9ezqp0eoxofzU3tSCIymVU9 root@localhost.localdomain

在这里插入图片描述

在这里插入图片描述

提交本地代码到gitlab:

yum install git -y
unzip microservic-test.zip
cd microservic-test
git init  #建仓
git add * #把当前文件夹所有代码提交
git commit -m "add microservic-test" #代码提交到缓冲区
git remote add origin http://192.168.40.135/root/microservic-test.git   #代码提交到远程仓库
git push -u origin master  #最后一步push推送过去,push的时候,会让你输入账号和密码,这里的用户名和密码就是gitlab上注册的用户了

回到gitlab首页,可以看到,已经有项目了

在这里插入图片描述

Jenkins+k8s+nexus+sonarqube+harbor+gitlab构建DevOps

jenkins-jnlp-v2.tar.gz这个压缩包封装的镜像带有mvn命令
上传至k8snode1

docker load -i jenkins-jnlp-v2.tar.gz

在http://192.168.40.180:30002/configureClouds/,把Container Template镜像改成jenkins-jnlp-v2.tar.gz压缩包解压之后的镜像xianchao/jenkins-jnlp:v2

在这里插入图片描述

修改gitlab上portal.yaml文件:
在这里插入图片描述
把image镜像变成:192.168.40.132/microservice/jenkins-demo:v1
注意:microservice需要在harbor里提前创建这个仓库
打开Jenkins,新建流水线,流水线名字是mvn-gitlab-harbor-springcloud
在Pipeline Script处输入如下内容:

node('testhan') {
   stage('Clone') {
       echo "1.Clone Stage"
      git credentialsId: 'gitlab', url: 'http://192.168.40.135/root/microservic-test.git '
       script {
           build_tag = sh(returnStdout: true, script: 'git rev-parse --shortHEAD').trim()
       }
    }

   stage('Test') {
     echo "2.Test Stage"
    }
   stage('mvn') {
     sh "mvn clean package -D maven.test.skip=true"
    }
   stage('Build') {
       echo "3.Build Docker Image Stage"
       sh "cd /home/jenkins/agent/workspace/mvn-gitlab-harbor-springcloud/portal-service"
       sh "docker build --tag 192.168.40.132/microservice/jenkins-demo:v1 /home/jenkins/agent/workspace/mvn-gitlab-harbor-springcloud/portal-service/"
    }
   stage('Push') {
       echo "4.Push Docker Image Stage"
       withCredentials([usernamePassword(credentialsId: 'dockerharbor',passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
           sh "docker login 192.168.40.132 -u ${dockerHubUser} -p ${dockerHubPassword}"
           sh "docker push 192.168.40.132/microservice/jenkins-demo:v1"
       }
    }
     stage('Promoteto pro') {    
    sh "kubectl apply -f /home/jenkins/agent/workspace/mvn-gitlab-harbor-springcloud/k8s/portal.yaml"
      }
}

立即构建即可
注意事项:url: http://192.168.40.135/root/microservic-test.git

Jenkins Pipeline语法介绍

Jenkins Pipeline介绍

Jenkins pipeline (流水线)是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。它把持续提交流水线(Continuous Delivery Pipeline)的任务集成到Jenkins中。
pipeline 是jenkins2.X 最核心的特性, 帮助jenkins 实现从CI到CD与DevOps的转变。

持续提交流水线(Continuous Delivery Pipeline)会经历一个复杂的过程: 从版本控制、向用户和客户提交软件,软件的每次变更(提交代码到仓库)到软件发布(Release)。这个过程包括以一种可靠并可重复的方式构建软件,以及通过多个测试和部署阶段来开发构建好的软件(称为Build)。

总结

1.Jenkins Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。
2.持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完
整过程的自动化表现。
3.软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。

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

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

相关文章

手机玩机常识-----小米系列机型 Android 15 更新计划 那些机型将会更新安卓15

小米机型是很多米粉最喜欢把玩的&#xff0c;其中解锁bl root 刷写twrp以及刷第三方系统资源相对其他品牌机型来说比较丰富。目前安卓15快要更新到很多机型。我们来了解下小米系列机型的更新计划是咋样的 小米会定期更新有关 Redmi红米 设备的支持日期的数据&#xff0c;包括可…

嵌入式学习(内核链表)

内核链表和普通链表的区别&#xff1a; 1. 普通链表当中数据域和指针域&#xff0c;没有做到区分&#xff0c;数据与指针形成了一个整体&#xff0c;而内核链表数据与指针是完全剥离的没有直接的关系。 2. 在普通链表当中所有节点的数据都是一样的类型&#xff0c;而内核链表中…

HarmonyOS开发实战( Beta5.0)Native Drawing自绘制能力替代Canvas提升性能

简介 Canvas 画布组件是用来显示自绘内容的组件&#xff0c;它具有保留历史绘制内容、增量绘制的特点。Canvas 有 CanvasRenderingContext2D/OffscreenCanvasRenderingContext2D 和 DrawingRenderingContext 两套API&#xff0c;应用使用两套API绘制的内容都可以在绑定的 Canv…

【WPS Excel】复制表格时,提示“图片太大,超过部份将被截去“ 问题

WPS表格 2019版本 升级到 WPS最新版 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 使用最新版就能够解决这个问题&#xff0c;如果仍旧无法解决可以勾选如下配置 重启Excel解决。 请勾选&#xff1a;文件 - 选项 - 编辑 - 不提示且不压缩文件中的图像

html 页面引入 vue 组件之 http-vue-loader.js

一、http-vue-loader.js http-vue-loader.js 是一个 Vue 单文件组件加载器&#xff0c;可以让我们在传统的 HTML 页面中使用 Vue 单文件组件&#xff0c;而不必依赖 Node.js 等其他构建工具。它内置了 Vue.js 和样式加载器&#xff0c;并能自动解析 Vue 单文件组件中的所有内容…

电脑知识:如何恢复 Word、媒体和存档文件?

如果您是 Word 用户&#xff0c;那么您一定对无法打开 Word 文档的问题很熟悉。当文档包含大量关键信息时&#xff0c;情况会变得更加复杂。如果您遇到这种情况&#xff0c;那么您将如何处理&#xff1f; 我们再怎么强调在外部存储位置&#xff08;如外部硬盘、网络位置&#…

jenkins 工具使用

使用方式 替代手动&#xff0c;自动化拉取、集成、构建、测试&#xff1b;是CI/CD持续集成、持续部署主流开发模式中重要的环节&#xff1b;必须组件 jenkins-gitlab&#xff0c;代码公共仓库服务器&#xff08;至少6G内存&#xff09;&#xff1b;jenkins-server&#xff0c;…

flutter Image

Flutter中&#xff0c;Image是一个用于显示图片的控件&#xff0c;可以显示网络图片、本地图片以及Asset中的图片。Image控件支持多种常见的图片格式&#xff0c;例如PNG、JPEG、GIF等。 const Image({super.key,required this.image,this.frameBuilder,this.loadingBuilder,th…

社区电商系统源码之卷轴模式:商业模式分析

随着互联网技术的发展&#xff0c;电商平台的竞争日益激烈&#xff0c;如何留住用户并提升用户粘性成为了各大电商平台关注的重点。卷轴模式作为一种新兴的用户参与和激励机制&#xff0c;在社区电商系统中得到了广泛的应用。本文将从技术角度探讨卷轴模式在社区电商系统中的实…

数据分析:R语言计算XGBoost线性回归模型的SHAP值

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍SHAP用途计算方法:应用加载R包导入数据数据预处理函数模型介绍 SHAP(SHapley Additive exPlanations)值是一种解释机器学习模型预测的方法。它基于博弈论中的Shapley值概念,…

第10讲 后端2

主要目标&#xff1a;理解滑动窗口法、位姿图优化、带IMU紧耦合的优化、掌握g2o位姿图。 第9讲介绍了以为BA为主的图优化。BA能精确优化每个相机位姿与特征点位置。不过在更大的场景中&#xff0c;大量特征点的存在会严重降低计算效率&#xff0c;导致计算量越来越大&#xff0…

3.8 串操作指令

&#x1f393; 微机原理考点专栏&#xff08;通篇免费&#xff09; 欢迎来到我的微机原理专栏&#xff01;我将帮助你在最短时间内掌握微机原理的核心内容&#xff0c;为你的考研或期末考试保驾护航。 为什么选择我的视频&#xff1f; 全程考点讲解&#xff1a;每一节视频都…

2024 高教社杯 数学建模国赛 (C题)深度剖析|农作物的种植策略|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; CS团队倾注了大量时间和心血&#xff0c;深入挖掘解…

ChauffeurNet:通过模仿最佳驾驶和合成最坏情况进行学习驾驶

ChauffeurNet: Learning to Drive by Imitating the Best and Synthesizing the Worst ChauffeurNet&#xff1a;通过模仿最佳驾驶和合成最坏情况进行学习驾驶 https://arxiv.org/abs/1812.03079 Abstract Our goal is to train a policy for autonomous driving via imit…

4000字三合一!Stata、SPSS、MATLAB实现多元线性回归详解!

参加数学建模的小伙伴要注意了&#xff1a;多元线性回归几乎是所有分析方式里面最核心、最常用、最全面的模型&#xff0c;博主本科大致参加了10次数模&#xff0c;还有一次正大杯市场调研赛&#xff0c;其中获得拿得出手的奖有9次&#xff0c;有5次都用到了多元线性回归——至…

分享7款实现社会实践报告AI生成论文网站

在当今社会&#xff0c;AI技术的快速发展极大地改变了我们的生活方式和工作方式。特别是在学术研究和写作领域&#xff0c;AI工具的应用已经变得越来越普遍。本文将详细介绍7款实现社会实践报告AI生成的论文网站&#xff0c;并重点推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper…

Flink 1.14.*中flatMap,filter等基本转换函数源码

这里以flatMap&#xff0c;filter为例&#xff0c;介绍Flink如果要实现这些基本转换需要实现哪些接口&#xff0c;Flink运行时调用这些实现类的入口&#xff0c;这些基本转换函数之间的类关系 一、创建基本转换函数需要实现类继承AbstractRichFunction并实现特性接口1、RichFla…

批量为某跟空间下的pod添加env(例如标签)

1、修改kube-apiserver配置文件&#xff0c;添加PodNodeSelector参数&#xff1a; –enable-admission-pluginsPodNodeSelector # 多个参数&#xff0c;则用逗号隔开systemctl daemon-reload systemctl restart kube-apiserver 2、修改指定命名空间内容&#xff1a; kubec…

SprinBoot+Vue校园活动报名微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

C# NX二次开发-获取体全部面

使用 UF_MODL_ask_body_faces 或获取一个体的全部面&#xff1a; 代码&#xff1a; theUf.Modl.AskBodyFaces(body.Tag, out var face_list);face_list.Foreach(x > x.NxListing()); 免责声明&#xff1a; 只用于参考&#xff0c;如果有什么问题不要找我呀。