【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建)
作者:mmseoamin日期:2024-02-20

CI/CD是持续集成,持续部署,集成就是开发人员通过自动化编译,发布,测试的手段集成软件,在开发的测试环境上测试发现自己的错误;持续部署是自动化构建,部署,通常也是在测试环境上进行,方便开发人员查看效果。

生产环境的话要谨慎很多,在测试环境上由测试人员测试好后开始上生产环境,生产环境集成Jenkins要确保整个流程相当完善,形成一套pipeline,后续迭代更新也由Jenkins来做自动化更新,一键更新生产环境。

听同事说有的C语言的项目,只是编译就要好几个钟头,如果项目集成比较耗费时间,运行在master上会消耗过多资源,影响其他项目集成,这时候就需要建立多台设备,配置slave机器来为master提供负载服务,类似于zabbix分布式监控,这种构建方式叫做分布式构建。

文章目录

  • Pipeline介绍
  • Pipeline示例
    • 一、声明式
    • 二、脚本式
    • Pipeline项目
      • 一、项目内部写Pipeline
      • 二、代码内部写Pipeline
      • 分布式构建

        Pipeline介绍

        Pipeline就是运行在Jenkins上的工作流,把单个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。它的实现方式是Groovy的脚本,它支持从代码段中读取脚本,实现了Pipeline与代码的融合。

        Pipeline是用户定义的部署的流程,包含构建,测试,发布等步骤,有一些代码块需要我们去关注,比如Node,是一个机器,是Jenkins环境的一部分,可以执行Pipeline;还有Stage,Stage块定义在整个Pipeline中执行的概念上的不同的任务子集,例如,构建,测试,部署等,很多插件都通过这个代码块去做可视化,呈现Jenkins管道状态、进度;Step是一项任务,是一个步骤,告诉Jenkins在特定时间点,需要做什么,例如sh step:sh 'make’可以执行make这个shell命令。

        Pipeline示例

        Pipeline分为声明式和脚本式,两者相差不是很大,注意不要混淆,建议用声明式

        一、声明式

        pipeline{
        agent any
        stages{
            stage("get code"){
               steps{
                   echo "get code from scm"
               }
            }
            stage("package"){
                steps{
                    echo "packge code"
                }
            }
            stage("deploy"){
                steps{
                    echo "deploy packge to node1"
                }
            }
        }
        }
        

        二、脚本式

        node {
          stage('Build') {
            echo 'Build'
          }
          stage('Test') {
            echo 'Test'
          }
          stage('Deploy') {
            echo 'Deploy'
          }
        }
        

        Pipeline项目

        一、项目内部写Pipeline

        1、新建一个pipeline项目

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第1张

        2、粘贴声明式脚本

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第2张

        二、代码内部写Pipeline

        在代码仓库里新建个文件去写即可

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第3张

        pipeline{
        agent any
        // agent { label 'node1' }
        stages{
            stage("get code"){
               steps{
                   sh '/usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=html  -Dsonar.projectName=${JOB_NAME} -Dsonar.sources=.'
               }
            }
            stage("unit test"){
               steps{
                    echo "unit test"
               }
            }
            stage("package"){
                steps{
                    sh 'tar zcf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=jenkinsfile'
                }
            }
            stage("deploy"){
                steps{
                    sh 'ssh 10.0.0.8 "cd /usr/share/nginx && mkdir web-${BUILD_ID}"'
                    sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.8:/usr/share/nginx/web-${BUILD_ID}'
                    sh 'ssh 10.0.0.8 "cd /usr/share/nginx/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz && rm -rf web-${BUILD_ID}.tar.gz"'
                    sh 'ssh 10.0.0.8 "cd /usr/share/nginx && rm -rf html && ln -s web-${BUILD_ID} /usr/share/nginx/html"'
                }
            }
        }
        }
        

        这里用的是开发人员用户创建的jenkinsfile,申请合并到了master分支,又用root用户去同意合并了一下。

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第4张

        在Jenkins端测试获取

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第5张

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第6张

        点击构建测试,jenkinsfile是取到了但是构建失败了,因为我jenkinsfile的原因,这里大家根据业务需求去写自己的jenkinsfile就行,我这里只是把流程给大家跑通了。

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第7张

        分布式构建

        如果你的项目在集成的时候很耗费性能,那你千万不要可着一台机器去折腾,你可以配置一些slave机器为master机器提供负载服务。

        接下来我们部署一台slave服务器。

        1、在sonar上安装java,git。

        [root@Sonar ~]# yum -y install java git
        

        2、把以及配置好的sonar和maven的客户端,scp到sonar主机。

        [root@Jenkins ~]# scp -r /usr/local/sonar-scanner 10.0.0.203:/usr/local/
        [root@Jenkins ~]# scp -r /usr/local/maven 10.0.0.203:/usr/local/
        [root@Sonar ~]# mkdir -p /server/scripts
        [root@Jenkins ~]# scp /var/lib/jenkins/workspace/git_version/deploy_rollback.sh 10.0.0.203:/server/scripts/
        

        3、在Jenkins上创建节点

        系统管理,节点管理,新建节点。

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第8张

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第9张

        做免秘钥认证拷贝jenkins公钥到slave,私钥配置到jenkins

        ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.203
        

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第10张

        [root@Jenkins ~]# cat .ssh/id_rsa
        

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第11张

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第12张

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第13张

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第14张

        slave服务器上还需要做连接web的免秘钥认证,方便去推送代码,总之是把各个流程都打通,做这个前可以画个图按照图去操作。

        [root@Sonar ~]# ssh-keygen
        [root@Sonar ~]# ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7
        

        当构建任务超过2时,会分配给slave节点去构建,可能是我用的这个Jenkins版本太老了,好多功能都无法复现的很好,还有一些bug,推荐大家用新版本。

        【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建),在这里插入图片描述,第15张


        我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!