• 持续集成/持续部署(3)Jenkins(2)


    JenkinsPipeline

    CI/CD持续集成/持续部署

    持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
    比如(你家装修厨房,其中一项是铺地砖,边角地砖要切割大小。如果一次全切割完再铺上去,发现尺寸有误的话浪费和返工时间就大了,不如切一块铺一块。这就是持续集成。)

    持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化相对也提高了人的效率。
    比如(装修厨房有很多部分,每个部分都有检测手段,如地砖铺完了要测试漏水与否,线路铺完了要通电测试电路通顺,水管装好了也要测试冷水热水。如果全部装完了再测,出现问题可能会互相影响,比如电路不行可能要把地砖给挖开……。那么每完成一部分就测试,这是持续部署。)

    持续交付 Continuous Delivery:频繁地将软件的新版本,交付给质量团队或者用户,以供评审尽早发现生产环境中存在的问题;如果评审通过,代码就进入生产阶段
    比如(全部装修完了,你去验收,发现地砖颜色不合意,水池太小,灶台位置不对,返工吗?所以不如没完成一部分,你就去用一下试用验收,这就是持续交付。)
    敏捷思想中提出的这三个观点,还强调一件事:通过技术手段自动化这三个工作。加快交付速度。

    pipeline介绍

    1. 什么是pipeline
      Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
    2. Pipeline 概念
      Pipeline 是一个用户定义的 CD 流水线模式。Pipeline 代码定义了通常包含构建、测试和发布步骤的完整的构建过程。

    Node
       node 是一个机器,它是 Jenkins 环境的一部分,并且能够执行 Pipeline。同时,node 代码块也是脚本式 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"
            }
        }
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    执行完成查看结果
    在这里插入图片描述

    将freestyle项目集成到pipeline
    在这里插入图片描述
    将jenkinsfile写入到game项目中
    在这里插入图片描述

    pipeline{
    agent any
    // agent { label 'node1' }
    stages{
        stage("get code"){
           steps{
                echo "get code"
           }   
        }
        stage("unit test"){
    
    	   steps{
               sh '/usr/local/sonar/bin/sonar-scanner -Dsonar.projectKey=html  -Dsonar.projectName=${JOB_NAME} -Dsonar.sources=.'
    		}
        }
        stage("package"){
            steps{
                sh 'tar zcf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=jenkinsfile'
            }
        }
        stage("deploy"){
            steps{
                sh 'ssh 10.0.0.7 "cd /code/ && mkdir web-${BUILD_ID}"'
                sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.7:/code/web-${BUILD_ID}'
                sh 'ssh 10.0.0.7 "cd /code/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz && rm -rf web-${BUILD_ID}.tar.gz"'
                sh 'ssh 10.0.0.7 "cd /code && rm -rf html && ln -s web-${BUILD_ID} html"'
            }
        }
    }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述
    完成后点击提交改变

    在jenkins执行pipeline测试

    在sonar客户端配置文件中需要配置 服务端的信息

    [root@jenkins conf]# pwd
    /usr/local/sonar/conf
    [root@jenkins conf]# cat sonar-scanner.properties 
    #Configure here general information about the environment, such as SonarQube server connection details for example
    #No information about specific project should appear here
    
    #----- Default SonarQube server
    sonar.host.url=http://10.0.0.202:9000
    sonar.login=f254aa77ea29dead6ac3f9990052cab3f3809918
    
    #----- Default source code encoding
    sonar.sourceEncoding=UTF-8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    配置完成在继续执行pipeline
    在这里插入图片描述

    参数化构建

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

    执行参数化构建
    在这里插入图片描述

    脚本

    [root@jenkins scripts]# cat deploy.sh
    #!/bin/sh
    CODE_DIR="/var/lib/jenkins/workspace/devloy-job/"
    WEB_DIR="/code"
    
    
    
    get_code_tar(){
            cd $CODE_DIR && tar zcf /opt/web_${git_version}.tar.gz ./*
    }
    
    scp_code_web(){
            scp /opt/web_${git_version}.tar.gz 10.0.0.7:$WEB_DIR
    }
    
    code_tarxf(){
            ssh 10.0.0.7 "cd $WEB_DIR &&mkdir web_${git_version} && tar xf web_${git_version}.tar.gz -C web_${git_version} && rm -rf web_${git_version}.tar.gz"
    
    }
    ln_html(){
             ssh 10.0.0.7 "cd $WEB_DIR && rm -rf html && ln -s web_${git_version} html"
    }
    
    main(){
    
            get_code_tar;
            scp_code_web;
            code_tarxf;
            ln_html;
    }
    if [ "$deploy_env" == "deploy" ];then.
    		#判断如果版本已经发布过则退出
    		if [ $GIT_COMMIT  = $GIT_PREVIOUS_SUCCESSFUL_COMMIT ]
    		then
    		     echo "当前版本已经发布过不允许重复构建"
    		     exit
    		else
           		main
    		fi
    elif [ "$deploy_env" == "rollback" ];then
            ln_html
    fi
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    Jenkins创建Maven

    安装maven

    在jenkins服务器执行
    删除maven rpm包解压
    [root@jenkins ~]# ll
    total 291048
    -rw-r--r-- 1 root root   8491533 Aug 27  2018 apache-maven-3.3.9-bin.tar.gz
    [root@jenkins ~]# tar xf apache-maven-3.3.9-bin.tar.gz 
    [root@jenkins ~]# mv apache-maven-3.3.9-bin.tar.gz /usr/local/maven
    
    PATH变量添加mvn命令路径
    [root@jenkins ~]# tailf -1 /etc/profile
    export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sonar/bin/:/usr/local/maven/bin"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用mvn编译代码

    1. 上传hellow word包
    [root@jenkins ~]# ll
    drwxr-xr-x 5 root root        91 Aug  6  2019 hello-world-war
    [root@jenkins ~]# cd hello-world-war/
    [root@jenkins hello-world-war]# 
    #mvn package 打包 
    #mvn clean   清除上一次的打包编译
    [root@jenkins hello-world-war]# mvn package
    ...........执行成功
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    执行成功后会看到 jar包

    [root@jenkins hello-world-war]# ll target/
    total 4
    -rw-r--r-- 1 root root 2402 Aug 11 15:02 hello-world-war-1.0.0.war
    
    • 1
    • 2
    • 3

    安装tomcat

    10.0.0.7:安装jdk和tomcat
    1.下载tomcat

    [root@test ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz --no-check-certificate
    
    • 1

    2.将war包放入ROOT代码目录

    [root@jenkins hello-world-war]# scp target/hello-world-war-1.0.0.war 10.0.0.7:/usr/local/tomcat/webapps/ROOT
    hello-world-war-1.0.0.war                                                    100% 2402     2.5MB/s   00:00 
    
    • 1
    • 2

    3.启动tomcat

    [root@test ~]# /usr/local/tomcat/bin/startup.sh
    
    • 1

    4.访问10.0.0.7:8080

    代码集成到jenkins

    1.上传java代码到gitlab
    上传java代码到10.0.0.200
    2.在gitlab上创建java项目
    自己在gitlab创建一个名称为java的项目 属于test组
    3. 设置远程仓库 将代码推送到gitlab java项目

    [root@gitlab ~]# cd hello-world-war/
    [root@gitlab hello-world-war]# git remote remove origin
    [root@gitlab hello-world-war]# git remote add origin git@gitlab.ahui.com:test/java.git
    [root@gitlab hello-world-war]# git push -u origin master
    Counting objects: 37, done.
    Compressing objects: 100% (24/24), done.
    Writing objects: 100% (37/37), 4.48 KiB | 0 bytes/s, done.
    Total 37 (delta 8), reused 0 (delta 0)
    To git@gitlab.ahui.com:test/java.git
     * [new branch]      master -> master
    Branch master set up to track remote branch master from origin.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.jenkins创建项目拉取代码并执行mvn编译
    在这里插入图片描述

    创建后在全局工具配置maven的家目录
    在这里插入图片描述

    修改maven的默认仓库

    将配置粘贴到配置文件中的第158行的下面
    /usr/local/maven/conf/settings.xml

    <mirror> 
    <id>nexus-aliyun</id> 
    <mirrorOf>*</mirrorOf> 
    <name>Nexus aliyun</name> 
    <url>http://maven.aliyun.com/nexus/content/groups/public</url> 
    </mirror>
    
    ----------------------------------------------------------------------------
    [root@jenkins conf]# cd /usr/local/maven/conf/
    [root@jenkins conf]# vim settings.xml
    157     </mirror>
    158      -->		
    159         <mirror>
    160         <id>nexus-aliyun</id>
    161         <mirrorOf>*</mirrorOf>
    162         <name>Nexus aliyun</name>
    163         <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    164         </mirror>
    165   </mirrors>
    166 
    167   <!-- profiles
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    命令行测试mvn

    [root@jenkins ~]# cd hello-world-war/
    [root@jenkins hello-world-war]# mvn package
    #查看走的是阿里云的maven仓库
    Downloading: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar
    Downloaded: http://maven.aliyun.com/nexus/content/groups/public/xpp3/xpp3_min/1.1.4c/xpp3_min-1.1.4c.jar (0 B at 0.0 KB/sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    安装nexus私服

    [root@nexus ~]# ll
    total 286068
    -rw-r--r-- 1 root root 170023183 Aug 14  2018 jdk-8u181-linux-x64.rpm
    -rw-r--r-- 1 root root 122904706 Aug 22  2018 nexus-3.13.0-01-unix.tar.gz
    [root@nexus ~]# tar xf nexus-3.13.0-01-unix.tar.gz 
    [root@nexus ~]# ll
    total 286068
    -rw-r--r-- 1 root root 170023183 Aug 14  2018 jdk-8u181-linux-x64.rpm
    drwxr-xr-x 9 root root       163 Aug 11 15:44 nexus-3.13.0-01
    -rw-r--r-- 1 root root 122904706 Aug 22  2018 nexus-3.13.0-01-unix.tar.gz
    drwxr-xr-x 3 root root        20 Aug 11 15:44 sonatype-work
    [root@nexus ~]# mv nexus-3.13.0-01 /usr/local/nexus
    
    启动nexus
    [root@nexus ~]# cd /usr/local/nexus/bin/
    [root@nexus bin]# ll
    [root@nexus bin]# ./nexus  start
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    登录nexus

    http://10.0.0.203:8081/
    默认用户名: admin
    默认密码: admin123

    在这里插入图片描述

    配置maven

    将/usr/local/maven/conf/settings.xml备份
    将settings.xml复制到/usr/local/maven/conf
    IP地址修改成自己nexus服务器的地址

    配置jenkins的集群

    安装部署基础环境

    第一步: 把10.0.0.8作为jenkins的从节点
    安装 jdk

    安装 git

    10.0.0.8和10.0.0.7做免秘钥(需要推送代码到7)

    [root@web02 ~]# ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7
    
    • 1

    将jenkins的sonar客户端目录拷贝到10.0.0.8

    [root@jenkins ~]# scp -r /usr/local/sonar/ 10.0.0.8:/usr/local/
    
    • 1

    将jenkins的maven目录拷贝到10.0.0.8

    [root@jenkins ~]# scp -r /usr/local/maven/ 10.0.0.8:/usr/local/
    
    • 1

    创建脚本目录

    [root@web02 ~]# mkdir -p /server/scripts
    [root@jenkins ~]# scp /server/scripts/* 10.0.0.8:/server/scripts/
    
    • 1
    • 2

    做 hosts解析

    [root@web02 ~]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.0.0.200 gitlab.ahui.com
    
    • 1
    • 2
    • 3
    • 4

    第二步: jenkins服务器和从节点10.0.0.8做免秘钥

    [root@jenkins ~]# ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.8
    
    • 1

    第三步: 将10.0.0.8从节点的公钥放到gitlab的root账号下 拥有下载代码的权限

    [root@web02 ~]# ssh-keygen
    [root@web02 ~]# cat .ssh/id_rsa.pub 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0qPazNGJ+PsJk5109Zn7qEnlnZ+sipEUKJn4oS2AYMxMPvHacgRtzEyNI35rOVKPb6G/N5dF+F+SwHfCHz2/mIrTmVkvBCTROHQ4EhTReR9BdW9y0Eo1S9fmI7zoBchqH0SJQRazoVuhmxWkDhwLAQ93IDMm1eMKFZgxpXXoxy0e7FBOcH+xWwd4OmrYWgp0SQOXgZcQRegeRcLNJp2+sBFwwEGxPCUgl7lgUokAaICRpNpmZgXwnIcqYt0b5Zfgefej0yNnIMnioYIWwTkSfvU+3LmYa92ibBWRFxMVlTnTiIYa7cUP5tNqT+hMYg+M7ukTICT82O3g0ObpETB57 root@web02
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    添加节点

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

    配置从节点SSH连接方式
    在这里插入图片描述
    添加jenkins的私钥
    在这里插入图片描述

    添加客户端的工具位置
    在这里插入图片描述

  • 相关阅读:
    hr的sql
    Spring Data JPA 按多个列排序
    【LeetCode】49. 字母异位词分组
    java毕业设计成品基于JSP实现的飞机票售票管理系统[包运行成功]
    获取阿里云Docker镜像加速器
    python爬虫
    Node.js精进(6)——文件
    解决Qt程序桌面图标有锯齿的问题
    02-线性结构3 Reversing Linked List
    树上背包dp
  • 原文地址:https://blog.csdn.net/AHui_CSDN/article/details/126291292