营销型网站(易网拓),电商网站开发,网站静态化怎么做,江苏建筑模板厂家❤️作者简介#xff1a;2022新星计划第三季云原生与云计算赛道Top5#x1f3c5;、华为云享专家#x1f3c5;、云原生领域潜力新星#x1f3c5; #x1f49b;博客首页#xff1a;C站个人主页#x1f31e; #x1f497;作者目的#xff1a;如有错误请指正#xff0c;将… ❤️作者简介2022新星计划第三季云原生与云计算赛道Top5、华为云享专家、云原生领域潜力新星 博客首页C站个人主页 作者目的如有错误请指正将来会不断的完善笔记帮助更多的Java爱好者入门共同进步 文章目录 DevOpsDevOps概述Jenkins流水线任务入门⭐Jenkins流水线任务的Hello World体验⭐Jenkins流水线语法例子Jenkins流水线语法生成器⭐ Jenkins实战4构建pipeline流水线的Jenkins项目⭐项目架构图Jenkins实战4的初步流水线模板功能全部都未实现⭐Jenkinsfile配置⭐在项目中编写Jenkinsfile来维护pipeline模板以后我们的pipeline语法都放在这个文件上⭐在Jenkins中配置Jenkinsfile在gitlab上的地址⭐测试构建看看Jenkinsfile是否能生效 架构图第2步案例将gitlab上面的项目代码拉取到Jenkins中⭐架构图第3步案例利用Maven构建项目的jar包⭐架构图第4步案例给Jenkins的pipeline任务配置SonarQube自动进行代码质量检测⭐架构图第5步案例Jenkins制作自定义镜像并上传到Harbor⭐架构图第6-7步案例通知目标服务器可以从Harbor上拉取镜像并运行容器注意这里有个坑⭐Jenkins流水线整合钉钉在构建完成后通知信息新增⭐下载安装钉钉并且注册账号电脑版和手机版都行⭐在Jenkins中下载钉钉插件DingTalk 2.4.7版本⭐在钉钉创建一个企业不然无法申请项目群⭐在钉钉创建一个新的项目群⭐在钉钉的项目群里创建一个机器人⭐在Jenkins中配置这个机器人⭐Jenkinsfile配置钉钉⭐ 实战4的Jenkinsfile全部代码⭐ DevOps
DevOps概述
软件开发最初是由两个团队共同组成没有采用DevOps之前
开发团队从头开始设计和整体系统的构建编写代码。需要系统不停的迭代更新。运维团队将开发团队的代码进行测试通过后再部署上线。确保系统稳定运行。
没有采用DevOps的缺点
这看似两个目标不同的团队需要协同完成一个软件的开发。在开发团队指定好计划并完成编写代码后需要把代码交给运维团队。运维团队向开发团队反馈需要修复的BUG以及一些需要返工的任务。这时开发团队需要经常等待运维团队的反馈。这无疑会延长整个软件开发的周期。
采用DevOps的优点
DevOps的方式可以让公司能够更快地应对更新和市场发展变化开发可以快速交付部署也更加稳定。核心就在于简化Dev和Ops团队之间的流程使整体软件开发过程更快速。说白了就是DevOps有利于快速完成项目不会浪费时间
整体的软件开发流程
PLAN开发团队根据客户的目标制定开发计划CODE根据PLAN开始编码过程需要将不同版本的代码存储在一个库中。BUILD编码完成后需要将代码构建并且运行。TEST成功构建项目后需要测试代码是否存在BUG或错误。DEPLOY代码经过手动测试和自动化测试后认定代码已经准备好部署并且交给运维团队。OPERATE运维团队将代码部署到生产环境中。MONITOR项目部署上线后需要持续的监控产品。INTEGRATE然后将监控阶段收到的反馈发送回PLAN阶段整体反复的流程就是DevOps的核心即持续集成、持续部署。
为了保证整体流程可以高效的完成各个阶段都有比较常见的工具如下图
Jenkins流水线任务入门⭐
Jenkins流水线任务的Hello World体验⭐ Jenkins流水线语法例子
// 所有脚本命令包含在pipeline{}中
pipeline { // 指定任务在哪个Jenkins集群节点中执行Jenkins是支持分布式// 这里的agent any是指该任务可以在任何Jenkins集群节点上执行。agent any// 声明全局变量格式为keyvalueenvironment{host 192.168.184.80}// 存放所有任务的合集stages {// 单个任务1stage(任务1) {// 实现任务的具体流程steps {echo 做任务1}}// 单个任务2stage(任务2) {// 实现任务的具体流程steps {echo 做任务2}}// 单个任务3stage(任务3) {// 实现任务的具体流程steps {echo 做任务3}}}
}Jenkins流水线语法生成器⭐ Jenkins实战4构建pipeline流水线的Jenkins项目⭐
项目架构图 Jenkins实战4的初步流水线模板功能全部都未实现⭐
pipeline {agent any// 存放所有任务的集合stages {stage(拉取Git仓库代码) {steps {echo 拉取Git仓库代码 - SUCCESS}}stage(通过maven构建项目) {steps {echo 通过maven构建项目 - SUCCESS}}stage(通过SonarQube做代码质量检测) {steps {echo 通过SonarQube做代码质量检测 - SUCCESS}}stage(通过Docker制作自定义镜像) {steps {echo 通过Docker制作自定义镜像 - SUCCESS}}stage(将自定义镜像推送到Harbor仓库) {steps {echo 将自定义镜像推送到Harbor仓库 - SUCCESS}}stage(通过Publish Over SSH通知目标服务器) {steps {echo 通过Publish Over SSH通知目标服务器 - SUCCESS}}}
}Jenkinsfile配置⭐
在项目中编写Jenkinsfile来维护pipeline模板以后我们的pipeline语法都放在这个文件上⭐
注意该文件名一定要为JenkinsfileJenkinsfile文件内容放在了上面可以直接复制 在Jenkins中配置Jenkinsfile在gitlab上的地址⭐ 测试构建看看Jenkinsfile是否能生效 架构图第2步案例将gitlab上面的项目代码拉取到Jenkins中⭐ 1配置git参数根据tag去拉取代码 2生成拉取git代码的流水线语法 生成的语法代码块如下注意下面有个地方branches的name从原来是/main被我改成了${tag}如果安装默认生成的话则是拉取最新版本代码我们这个意思就是安装tag去拉取对应代码和系统生成的语法不一样* checkout([$class: GitSCM, branches: [[name: ${tag}]], extensions: [], userRemoteConfigs: [[url: http://192.168.184.70:8929/root/mytest.git]]])3把生成的pipeline语法放到Jenkinsfile文件的指定位置 4测试构建 架构图第3步案例利用Maven构建项目的jar包⭐
1生成流水线语法生成如下 注意/var/jenkins_home/maven/bin/mvn要改成你的maven的mvn地址。
sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests2将上面生成的语法放到Jenkinsfile的对应位置上去然后上传到gitlab即可。省略
架构图第4步案例给Jenkins的pipeline任务配置SonarQube自动进行代码质量检测⭐
1生成流水线语法生成如下 注意下面的-Dsonar.login要用自己的SonarQube的token注意/var/jenkins_home/sonar-scanner/bin/sonar-scanner要改成你的sonar-scanner地址
sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources./ -Dsonar.projectname${JOB_NAME} -Dsonar.projectKey${JOB_NAME} -Dsonar.java.binaries./target/ -Dsonar.login7ad2200f7cca90c37a909fdba8db049ac700909f2将上面生成的语法放到Jenkinsfile的对应位置上去然后上传到gitlab即可。省略
架构图第5步案例Jenkins制作自定义镜像并上传到Harbor⭐
1生成制作自定义镜像的流水线语法生成如下
sh mv ./target/*.jar ./docker/
docker build -t ${JOB_NAME}:${tag} ./docker/2在Jenkinsfile文件定义全局变量environment记得要把下面的内容改成你自己的 harborAddress是harbor地址harborRepo是harbor仓库名harborUser是harbor账号harborPasswd是Harbor密码 environment{harborAddress 192.168.184.80:80harborRepo repoharborUser adminharborPasswd Harbor12345}3生成将镜像上传到Harbor仓库的流水线语法生成如下
sh docker login -u ${harborUser} -p ${harborPasswd} ${harborAddress}
docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}4防止Jenkins内部不能使用Docker所以重新设置一下权限有时候即使设置了权限也会自动变回来导致pipeline报错 切换目录到/var/run/ [rootcentos7-jenkins harbor]# cd /var/run/修改docker.sock文件的所属组 [rootcentos7-jenkins run]# chown root:root docker.sock修改docker.sock文件的权限 [rootcentos7-jenkins run]# chmod orw docker.sock5将上面生成的语法放到Jenkinsfile的对应位置上去然后上传到gitlab即可。 6执行构建即可。7进入Harbor可视化界面查看pipeline镜像是否push成功 架构图第6-7步案例通知目标服务器可以从Harbor上拉取镜像并运行容器注意这里有个坑⭐
1在所有目标服务器上都放一份shell脚本文件原理是Jenkins通知目标服务器去执行shell脚本文件从而让目标服务器在Harbor上面拉取指定镜像。 原来的架构图上是把Dockerfile传到目标服务器让目标服务器通过docker build构建镜像缺点是当目标服务器有多台那每一台目标服务器都需要build构建一次n台服务器就是n次这样十分浪费服务器资源。现在的架构图是把镜像在Jenkins容器内构建然后把镜像push到Harbor上Jenkins通知所有目标服务器不管有多少台然后目标服务器就会执行下面的shell脚本会从Harbor拉取指定镜像这样一来不管有多少台目标服务器都只是build构建一次节省了很多资源。
vi /root/deploy.sh内容如下
harbor_addr$1
harbor_repo$2
project$3
version$4
host_port$5
container_port$6imageName$harbor_addr/$harbor_repo/$project:$versioncontainerIddocker ps -a | grep ${project} | awk {print $1}
if [ $containerId ! ] ; thendocker stop $containerIddocker rm $containerId
fitagdocker images | grep ${project} | awk {print $2}if [[ $tag ~ $version ]] ; thendocker rmi -f $imageName
fidocker login -u admin -p Harbor12345 $harbor_addrdocker pull $imageNamedocker run -d -p $host_port:$container_port --name $project $imageNameecho SUCCESS2给deploy.sh权限
chmod ax /root/deploy.sh3把所有目标服务器的deploy.sh都放到/usr/bin下
[rootcentos7-jenkins ~]# mv /root/deploy.sh /usr/bin/4配置Jenkins参数 5生成流水线语法 提示Exec command deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $host_port $container_port6将生成的语法放到Jenkinsfile的对应位置上去然后上传到gitlab即可。⭐注意这里有个坑⭐ 坑坑坑sshPublisher的execCommand要用双引号默认是单引号。一定要改成双引号否则语法无法生效⭐ ⭐下面的是修改之后的并且是测试通过的流水线语法
sshPublisher(publishers: [sshPublisherDesc(configName: mytest, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $host_port $container_port, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ], remoteDirectory: , remoteDirectorySDF: false, removePrefix: , sourceFiles: )], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])7最后测试构建即可省略
Jenkins流水线整合钉钉在构建完成后通知信息新增⭐
下载安装钉钉并且注册账号电脑版和手机版都行⭐
钉钉下载官网
在Jenkins中下载钉钉插件DingTalk 2.4.7版本⭐ 在钉钉创建一个企业不然无法申请项目群⭐ 在钉钉创建一个新的项目群⭐ 在钉钉的项目群里创建一个机器人⭐ 在Jenkins中配置这个机器人⭐ Jenkinsfile配置钉钉⭐
1编写流水线语法 注意robot的值就是我们在Jenkins的系统配置所设置的机器人id一定要进行修改
post {success {dingtalk (robot: Jenkins-dingding,type:MARKDOWN,title: success: ${JOB_NAME},text: [- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}])}failure {dingtalk (robot: Jenkins-dingding,type:MARKDOWN,title: fail: ${JOB_NAME},text: [- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}])}}2将上面的语法放到Jenkinsfile的stages外面并上传gitlab 3点击构建Jenkins 4查看钉钉项目群 实战4的Jenkinsfile全部代码⭐
pipeline {agent anyenvironment{harborAddress 192.168.184.80:80harborRepo repoharborUser adminharborPasswd Harbor12345}// 存放所有任务的集合stages {stage(拉取Git仓库代码) {steps {checkout([$class: GitSCM, branches: [[name: ${tag}]], extensions: [], userRemoteConfigs: [[url: http://192.168.184.70:8929/root/mytest.git]]])}}stage(通过maven构建项目) {steps {sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests}}stage(通过SonarQube做代码质量检测) {steps {sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources./ -Dsonar.projectname${JOB_NAME} -Dsonar.projectKey${JOB_NAME} -Dsonar.java.binaries./target/ -Dsonar.login7ad2200f7cca90c37a909fdba8db049ac700909f}}stage(通过Docker制作自定义镜像) {steps {sh mv ./target/*.jar ./docker/docker build -t ${JOB_NAME}:${tag} ./docker/}}stage(将自定义镜像推送到Harbor仓库) {steps {sh docker login -u ${harborUser} -p ${harborPasswd} ${harborAddress}docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}}}stage(通过Publish Over SSH通知目标服务器) {steps {sshPublisher(publishers: [sshPublisherDesc(configName: mytest, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $host_port $container_port, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ], remoteDirectory: , remoteDirectorySDF: false, removePrefix: , sourceFiles: )], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}post {success {dingtalk (robot: Jenkins-dingding,type:MARKDOWN,title: success: ${JOB_NAME},text: [- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}])}failure {dingtalk (robot: Jenkins-dingding,type:MARKDOWN,title: fail: ${JOB_NAME},text: [- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}])}}}