学习笔记八:基于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 versiondef 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.软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。
相关文章:
学习笔记八:基于Jenkins+k8s+Git+DockerHub等技术链构建企业级DevOps容器云平台
基于Jenkinsk8sGitDockerHub等技术链构建企业级DevOps容器云平台 测试jenkins的CI/CD在Jenkins中安装kubernetes插件安装blueocean插件配置jenkins连接到我们存在的k8s集群配置pod-template添加自己的dockerhub凭据测试通过Jenkins部署应用发布到k8s开发环境、测试环境、生产环…...
科研绘图系列:R语言柱状图分布(histogram plot)
文章目录 介绍加载R包读取数据画图介绍 柱状图(Bar Chart)是一种常用的数据可视化图表,用于展示和比较不同类别或组的数据。它通过在二维平面上绘制一系列垂直或水平的柱子来表示数据的大小,每个柱子的长度或高度代表一个数据点的数值。柱状图非常适合于展示分类数据的分布…...
vue3+ts封装类似于微信消息的组件
组件代码如下: <template><div:class"[voice-message, { sent: isSent, received: !isSent }]":style"{ backgroundColor: backgroundColor }"click"togglePlayback"><!-- isSent为false在左侧,为true在右…...
ES6 reduce方法详解:示例、应用场景与实用技巧
在JavaScript中,reduce 方法是一个非常强大的数组方法,它允许你将数组中的元素归并(reduce)为单个值。reduce 方法执行一个由你提供的reducer函数(归并函数),将其结果汇总为单一的返回值。 一.…...
java后端保存的本地图片通过ip+端口直接访问
直接上代码吧 package com.ydx.emms.datapro.controller;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.…...
2024 年高教社杯全国大学生数学建模竞赛B题4小问解题思路(第二版)
原文链接:https://www.cnblogs.com/qimoxuan/articles/18399415 问题 1:抽样检测方案设计 详细解题思路: 确定抽样检测目标:企业需要确定一个可接受的次品率上限(标称值),以及在该次品率下&am…...
docker-nginx数据卷挂载
一、案例1-利用Nginx容器部署静态资源 1.1、需求: 创建Nginx容器, 修改nginx容器内的html目录下的index.html文件,查看变化将静态资源部署到nginx的html目录 1.2、修改html目录下的index.html文件,查看变化 因为docker运用得最小化系统环境,解决办法就…...
项目实战 ---- 商用落地视频搜索系统(8)---优化(2)---查询逻辑层优化
目录 背景 技术衡量与方案 一种可实现方案 可实现方案及设计描述 可能存在的问题 一种创新实现方案 方案的改良设计 策略公式 优化的实现 完整代码 代码解释 异常场景的考量 处理方式 运行注意事项 运行结果 结果优化对比与解释 背景 在项目实战 ---- 商用落地…...
山东大学机试试题合集
🍰🍰🍰高分篇已经涵盖了绝大多数的机试考点,由于临近预推免,各校的机试蜂拥而至,我们接下来先更一些各高校机试题合集,算是对前边学习成果的深入学习,也是对我们代码能力的锻炼。加油…...
餐厅食品留样管理系统小程序的设计
管理员账户功能包括:系统首页,个人中心,窗口负责人管理,窗口员工管理,冰柜管理,排班信息管理,留样食品管理,教育宣传管理,系统管理 微信端账号功能包括:系统…...
亚马逊运营:如何提高亚马逊销量和运营效率?
不少亚马逊卖家们为了扩大业务规模和提高销量,会创建多个卖家账户来同时运营多个亚马逊店铺。问题是,这种多店铺运营模式并非没有风险——亚马逊运营的一个重要方面就是账户的健康管理。一旦某个账户出现问题,亚马逊的算法就可能会启动关联检…...
设计模式背后的设计原则和思想
设计模式背后的设计原则和思想是一套指导我们如何设计高质量软件系统的准则和方法论。这些原则和思想不仅有助于提升软件的可维护性、可扩展性和可复用性,还能帮助开发团队更好地应对复杂多变的需求。以下是一些核心的设计原则和思想: 1. 设计原则 设计…...
项目总体框架
一.后端(包装servlet) 使用BaseServlet进行请求的初步处理(利用继承进行执行这个) 在BaseServlet中 处理请求的类型找到对象的方法,并使用注解找到参数名,执行参数自动注入。 package com.csdn.controlle…...
k8s Prometheus
一、部署 Prometheus kubectl create ns kube-ops# 创建 prometheus-cm.yaml apiVersion: v1 kind: ConfigMap metadata:name: prometheus-confignamespace: kube-ops data:prometheus.yml: |global:scrape_interval: 15s # 表示 prometheus 抓取指标数据的频率,默…...
glsl着色器学习(九)屏幕像素空间和设置颜色
在上一篇文章中,使用的是裁剪空间进行绘制,这篇文章使用屏幕像素空间的坐标进行绘制。 上一篇的顶点着色器大概是这样子的 回归一下顶点着色的主要任务: 通常情况下,顶点着色器会进行一系列的矩阵变换操作,将输入的顶…...
前端框架有哪些?
前言 用户体验是每个开发网站的企业中的重中之重。无论后台有多方面的操作和功能,用户的视图和体验都必须是无缝的最友好的。这需要使用前端框架来简化交互式、以用户为中心的网站的开发。 前端框架是一种用于简化Web开发的工具,它提供了一套预定义的代…...
分类预测|基于黑翅鸢优化轻量级梯度提升机算法数据预测Matlab程序BKA-LightGBM多特征输入多类别输出 含对比
分类预测|基于黑翅鸢优化轻量级梯度提升机算法数据预测Matlab程序BKA-LightGBM多特征输入多类别输出 含对比 文章目录 一、基本原理BKA(Black Kite Algorithm)的原理LightGBM分类预测模型的原理BKA与LightGBM的模型流程总结 二、实验结果三、核心代码四、…...
利用大模型实时提取和检索多模态数据探索-利用 Indexify 进行文档分析
概览 传统的文本提取方法常常无法理解非结构化内容,因此提取数据的数据往往是错误的。本文将探讨使用 Indexify,一个用于实时多模态数据提取的开源框架,来更好地分析pdf等非结构化文件。我将介绍如何设置 Indexify,包括服务器设置…...
函数式接口实现策略模式
函数式接口实现策略模式 1.案例背景 我们在日常开发中,大多会写if、else if、else 这样的代码,但条件太多时,往往嵌套无数层if else,阅读性很差,比如如下案例,统计学生的数学课程的成绩: 90-100分&#…...
鸿蒙Next-拉起支付宝的三种方式——教程
鸿蒙Next-拉起支付宝的三种方式——教程 鸿蒙Next系统即将上线,应用市场逐渐丰富、很多APP都准备接入支付宝做支付功能,目前来说有三种方式拉起支付宝:通过支付宝SDK拉起、使用OpenLink拉起、传入支付宝包名使用startAbility拉起。以上的三种…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...





























