• Jenkins持续集成


    Jenkins持续集成


    一、Jenkins简介

    image-20220929205119426

    Jenkins官方

    Jenkins是一个开源CI&CD软件、提供友好操作界面的持续集成(CI)工具。

    起源于Hudson(Hudson是商用的),主要用于持续、自动化的构建(包括编译,发布,测试)软件项目、监控外部任务的运行;Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行;通常与版本管理工具(SCM)、构建工具结合使用。

    常用的版本控制工具:SVN、GIT

    构建工具有:Maven、Ant、Gradle

    二、Jenkins特性

    1)开源的java语言开发持续集成工具,支持CI,CD

    2) 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理

    3)消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告

    4)分布式构建:支持Jenkins能够让多台计算机一起构建/测试

    5)文件指纹信息:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等

    6)丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等

    7)变更支持:Jenkins 能从代码仓库(SVN/Git)中获取并产生代码更新列表,并输出到编译输出信息中

    8)支持永久链接:用户是通过 Web 来访问 Jenkins 的,而这些 Web 页面的链接地址都是永久链接地址,可以在各种文档中直接使用该链接

    三、Jenkins用处

    1. 定时拉取代码并编译

    2. 静态代码分析

    3. 定时打包发布测试版

    4. 自定义操作,如跑单元测试等

    5. 出错提醒

    四、Jenkins工作原理

    1.开发者检入代码到源代码仓库。

    2.CI系统会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区。

    3.CI系统会在对应的工作区内执行构建过程。

    4.(配置如果存在)构建完成后,CI系统会在一个新的构件中执行定义的一套测试。完成后触发通知(Email,RSS等等)给相关的当事人。

    5.(配置如果存在)如果构建成功,这个构件会被打包并转移到一个部署目标(如应用服务器)或存储为软件仓库中的一个新版本。软件仓库可以是CI系统的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像 SourceForge、Java.net之类的网站。

    6.CI系统通常会根据请求发起相应的操作,诸如即时构建、生成报告,或者检索一些构建好的构件。

    image-20220930114257284

    五、CI/CD介绍

    CI(Continuous integration|持续集成)

    ​ 是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。借用网络图片对CI加以理解。

    image-20220929205546198

    CD(Continuous Delivery|持续交付)

    ​ 是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境) 中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。下图反应的是CI/CD 的大概工作模式。
    image-20220929205632007

    CD持续部署(Continuous Deployment|持续部署)

    ​ 是 CI持续集成 ,CD持续交付的延伸。自动将交付的应用部署到生产环境。能及时收到用户反馈,降低部署的风险。持续部署是持续交付的下一步,在持续交付的基础上,由开发人员或运维人员自助式的定期向生产环境部署稳定的构建版本,持续部署的目标是代码在任何时刻都是可部署的,并可自动进入到生产环境。

    image-20220929205838709

    总结

    • 持续集成:指程序员在代码的开发工程中,可以频繁的将代码部署到主干上,并进行自动化测试
    • 持续交互:指在持续集成的基础之上,将代码部署到线上测试环境
    • 持续部署:指在持续交互的基础之上,将要部署的代码实现自动部署,包括持续交互、持续部署

    下面是一张完整流程图

    image-20220930113712469

    六、Maven介绍

    • Maven 就是构建 java 里面的一个 war 包的;
    • Maven 项目对象模型(POM)是可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具;
    • Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于Maven的缺省构建规则有较高的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项目;
    • 由于Maven的面向项目的方法,许多Apache Jakarta 项目发文时使用Maven,而且公司项目采用Maven的比例在持续增长。

    六、Jenkins部署

    使用tomcat容器安装jenkins

    注意!要用9版本的tomcat进行部署,目前10版本的有bug。

    #安装jdk
    [root@localhost ~]# dnf -y install java-17-openjdk
    
    #安装tomcat
    [root@localhost ~]# cd /usr/local/src/
    [root@localhost src]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat9.0.67.tar.gz
    [root@localhost src]# tar -xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
    [root@localhost local]# mv apache-tomcat-9.0.67/ tomcat
    
    #安装jenkins
    [root@localhost local]# cd tomcat/webapps/
    [root@localhost webapps]# ls
    docs  examples  host-manager  manager  ROOT
    #下载到此目录,tomcat运行时会自动解压
    [root@localhost webapps]# wget http://mirrors.jenkins.io/war-stable/2.346.3/jenkins.war
    
    #启动tomcat服务
    [root@localhost webapps]# ../bin/catalina.sh start
    

    七、Jenkins的Web界面管理

    初始化设置

    在浏览器的地址栏输入IP:8080/Jenkins

    访问到此页面后会提示你初始密码文件的位置,用cat查看该文件内容,然后copy过来即可登录

    image-20220929214931510

    [root@localhost ~]# cat /root/.jenkins/secrets/initialAdminPassword
    6ec3f80da8234a10af076d753babee86
    

    身为运维人员当然要选自定义安装来熟悉Jenkins的Web界面啦!

    image-20220929215310943

    点击【无】进行安装,后面需要什么插件就手动去安装

    image-20220929215501533

    为了方便记忆,我的用户名与密码都设为【admin】。你请随意,只要别忘了就行。

    image-20220929215632866

    设置访问Jenkins的URL的根路径,我这里保持默认。

    image-20220929215803876

    上述步骤相续完成后就可以看见Jenkins的首页【Welcome to Jenkins!】了。

    image-20220929215903889

    替换国内源,安装中文插件

    替换源步骤:点击 Advanced —> 更新为国内源 —> Submit

    原国外插件源地址:https://updates.jenkins.io/update-center.json

    国内插件源地址:https://mirror.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

    image-20220929220320191

    进到【Advanced】界面后往下划,要设置的地方在最底下

    image-20220929220518505

    我把原有的源替换成了国内源,这能极大的加快我们的访问速度!

    别忘了点击底下的【Submit】噢

    image-20220929220625276

    下面进行安装中文语言界面

    image-20220929221003827

    在安装界面可以勾选我所标记的。因安装插件需要重启才能生效,当然!我们也可以手动进行重启,下面就来演示一番

    image-20220929221032309

    演示手动重启Jenkins

    请仔细看这张图的URL栏与上张有何区别。我把Jenkins根路径后面删掉了,然后输入了restart,然后敲回车键即可。

    image-20220929221244490

    输入初次登陆时设置的用户名与密码

    image-20220929221446232

    安装中文插件并重启生效后可以发现是不是不一样了。虽说是中文插件,可也并非完全汉化了,或许有些名词术语用英文表述更加准确吧

    image-20220929221633213

    安装Git、Github、Gitlab、Gitee插件,安装后重启Jenkins生效。跟安装中文语言插件的步骤相同就不一一示范了,请你举一反四~

    任务管理

    image-20220929222812491

    输入一个任务名,选择该任务的类型

    image-20220929222922800

    image-20220929223041672

    此时返回首页就能看到刚刚新建的任务

    image-20220929223110285

    全局工具配置

    image-20220929223405362

    image-20220929223617835

    节点管理

    image-20220929223747833

    image-20220929223806677

    系统配置

    image-20220929223926572

    image-20220929224101765


    八、Jenkins流水线项目发布流程

    环境说明

    主机名IP地址应用服务工具包操作系统
    node1192.168.92.132Jenkins、tomcatgit、maven、sshpassCentos8
    node2192.168.92.130tomcatwgetCentos8

    1.关闭防火墙与SELinux

    systemctl disable --now firewalld.service
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    

    2.在node1主机部署

    #安装jdk
    [root@node1 ~]# dnf -y install java-17-openjdk
    
    #安装tomcat9.0.67版本
    [root@node1 ~]# cd /usr/local/src/
    [root@node1 src]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz
    [root@node1 src]# tar -xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
    [root@node1 local]# mv apache-tomcat-9.0.67/ tomcat
    
    #安装jenkins
    [root@node1 local]# cd tomcat/webapps/
    [root@node1 webapps]# ls
    docs  examples  host-manager  manager  ROOT
    #下载到此目录,tomcat运行时会自动解压
    [root@node1 webapps]# wget http://mirrors.jenkins.io/war-stable/2.346.3/jenkins.war
    
    #启动jenkins
    [root@node1 webapps]# /usr/local/tomcat/bin/catalina.sh start
    
    #下载git(拉代码)、maven(打包)
    [root@node1 ~]# dnf -y install git maven wget
    
    #解决centos8无sshpass问题
    [root@node1 ~]# rpm -ivh http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/Packages/sshpass-1.09-4.el8.x86_64.rpm
    
    #将GitHub的IP映射到本地/etc/hosts文件,查询IP网站 https://ip.tool.chinaz.com/
    [root@node1 ~]# echo "20.205.243.166" >> /etc/hosts
    
    #配置免密登录
    [root@node1 ~]# ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:7dZb9rhhNzocmHEwOiSaZoq8s/IQQlJ6HbrQK83dZ7U root@node1
    The key's randomart image is:
    +---[RSA 3072]----+
    |  . .            |
    | + o . . . o     |
    |+.+ . o o o o    |
    |o= + *   = o .   |
    |= * = . S E =    |
    |.= .   o . + .   |
    |. .       o o *..|
    |.+       .   B.=.|
    |.o+         ..+..|
    +----[SHA256]-----+
    #将公钥传至node2主机
    [root@node1 ~]# ssh-copy-id root@192.168.92.130
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    root@192.168.92.130's password:
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'root@192.168.92.130'"
    and check to make sure that only the key(s) you wanted were added.
    
    #测试免密登录
    [root@node1 ~]# ssh root@192.168.92.130
    Last login: Thu Sep 29 22:46:13 2022 from 192.168.92.1
    [root@node2 ~]# exit
    

    注意:完成上述配置就可以访问Web界面了,web的一些初始化设置前面已经提过,在此就不浪费版面了,只给出需要注意的配置页面。

    这次选择安装推荐的插件,这样可以节省我们后续一个个的找插件安装的时间

    image-20220930001312423

    耐心等待安装插件的过程,

    image-20220930001518783

    新建任务

    image-20220930002247265

    给任务命名,选择任务类型

    image-20220930002608118

    添加文本参数

    image-20220930002726553

    添加GitHub仓库

    image-20220930002937227

    添加客户端的IP地址

    image-20220930003218824

    添加ssh密码

    image-20220930003406393

    添加打包工具

    image-20220930003801712

    定义tomcat路径

    image-20220930003908289

    流水线脚本

    编写流水线脚本。该脚本会自动帮你把客户端的tomcat部署好

    image-20220930004303438

    脚本内容如下,方便他人copy

    pipeline {
        agent any
        
        stages {
            stage('pull code') {
                steps {
                    git '${git_url}'
                }
            }
            stage('package') { 
                steps { 
                    sh """ 
    	            mvn clean
    	            mvn package
    	            """
    	        }
            }
            stage('deploy') { 
    	        steps { 
    	            sh """
    	            sshpass -p "${ssh_pass}" ssh root@${client_ip} 'yum -y install java-11-openjdk > /dev/null'
    	            sshpass -p "${ssh_pass}" ssh root@${client_ip} 'wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz -P /tmp'
    	            sshpass -p "${ssh_pass}" ssh root@${client_ip} 'tar xf /tmp/apache-tomcat-9.0.67.tar.gz -C /usr/local'
    	            sshpass -p "${ssh_pass}" ssh root@${client_ip} 'ln -s /usr/local/apache-tomcat-9.0.67 ${tomcat_path}'
    	            sshpass -p "${ssh_pass}" ssh root@${client_ip} '${tomcat_path}/bin/catalina.sh start'
    	            sshpass -p "${ssh_pass}" scp target/${maven_packages}.war root@${client_ip}:${tomcat_path}/webapps/
                    sshpass -p "${ssh_pass}" ssh root@${client_ip} '${tomcat_path}/bin/catalina.sh stop && ${tomcat_path}/bin/catalina.sh start'
    		    """
                }
            }
        }
    }
    

    先点击【Build with Parameters】后点击【开始构建】

    image-20220930004428408

    报错便签:/etc/hosts文件添加github的IP。脚本的变量少打了个s。要按照sshpass和wget工具。已在前面文档添加这些操作

    蓝色为构建中。绿色为构建成功。红色为构建失败。除第一次构建外,之后的集成操作都相当耗时。

    如构建失败可把鼠标移至该红框里会出现【logs】的按钮,点击可查看报错在哪一步,然后对应解决就可以了

    image-20220930024638717

    构建成功后,在浏览器URL栏输入客户端IP:8080/ly-simple-tomcat-0.0.1-SNAPSHOT

    image-20220930120153895


    九、Jenkins脚本语法(拓展)

    #简单结构语法:
    stages{
    	stage(''){
    		steps{
    			commands
    		}
    	}
    }
    
    #常规命令的写法:
      sh "mvn -Dmaven.test.failure.ignore=true clean package"
      sh "mv target/ly-simple-tomcat-0.0.1-SNAPSHOT.war target/app.war"
    #命令3点写法:
      sh '''
      	mvn -Dmaven.test.failure.ignore=true clean package
      	mv target/ly-simple-tomcat-0.0.1-SNAPSHOT.war target/app.war
      '''
    
    #环境变量的使用
    environment{
    	DISABLE_AUTH = 'true'
    	DB_ENGINE = 'sqlite'
    }
    stages{
    	stage('hello'){
    	steps{
    			echo DISABLE_AUTH
    			echo DB_ENGINE
    		}
    	}
    }
    
    
    #清理和通知
    #post部分会在pipeline结束的时候运行,所以可以添加通知去完成步骤清理
    #deleteDir是固定写法,可以清理workspace目录下的文件
    post{
    	always{
    	deleteDir()
    	}
    	success{
    		echo '清理成功'
    	}
    	failure{
    		echo '清理失败'
    	}
    }
    
    
    
    #电子邮箱
    post{
    	failure{
    		mail to: '主题',
    			subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
    			body: "XXX ${env.BUILD_URL}"
    	}
    }
    
    #部署(重点)
    #持续交付肯定会有3个阶段,构建,测试,部署,稳定的构建和测试阶段是任何部署的前提
    pipeline{
    	agent any
    	stages{
    		stage('Build'){
    			steps{
    				echo '命令1'
    		}
    	}
    		stage('Test'){
    			steps{
    				echo '命令2'
    		}
    	}
    		stage('Deploy') {
    			steps{
    				echo '命令3'
    			}
    		}	
    	}
    }
    
    #input命令会等待你的确认命令
    
  • 相关阅读:
    两台笔记本之间快速传输文件,电脑对电脑怎么传送数据
    【MySQL】初见数据库
    SpringBoot整合dubbo(一)
    Sharding-JDBC(二)- Sharding-JDBC介绍
    世界粮食日:宏工科技有对策,赋能食品生产高效可持续发展
    Java实现一棵二叉树,并完成二叉树的层次遍历,两种中序遍历 递归 &非递归
    『现学现忘』Docker基础 — 40、发布镜像到Docker Hub
    MyBatisPlus(五)配置表名前缀:table-prefix
    【PG】PostgreSQL查看与修改参数
    iOS“超级签名”绕过App Store作弊解决方案
  • 原文地址:https://blog.csdn.net/m0_50111062/article/details/127121466