• 持续集成(CI)工具-----jenkins


    1.jenkins

    1.1. 什么是jenkins

       Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。

            Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更重要的业务逻辑实现上。同时Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象的展示项目构建的趋势和稳定性。

    简而言之,jenkins就是持续开发部署的软件

    1.2. 什么是持续集成(CI)

            因为开发部门同时维护多个版本,多个版本的发布,测试需要大量人力,所以要有一个专业的持续集成工具来管理持续重复的工作。具体来说是开发人员提交新代码后立即进行构建,测试。根据测试结果我们可以确定新代码和原代码是否能正确的集成到一起.

    1.3. 为什么使用jenkins

    使用 Jenkins之前使用 Jenkins之后
    一旦所有开发人员都完成了分配的编码任务,他们通常会同时提交所有代码。后来测试并部署了Build,构建了代码提交,并且测试周期非常少,并且几天后就完成了一次构建。一旦开发人员提交代码,便会构建并测试代码。 Jenkin将在一天中多次构建和测试代码,如果构建成功,则Jenkins将源代码部署到测试服务器中并通知部署团队;如果构建失败,则Jenkins将错误通知开发人员团队。
    由于代码是一次构建的,因此一些开发人员需要等到其他开发人员完成编码才能检查其构建在任何开发人员提交之后,将立即构建代码。
    隔离,检测和修复多个提交的错误并非易事。由于代码是在单个开发人员的每次提交之后构建的,因此很容易检测出导致构建失败的代码
    代码构建和测试过程完全是手动的,因此有很多失败的机会。自动化的构建和测试过程可节省时间并减少缺陷。
    修复并测试所有错误后,将部署代码。每次成功构建和测试后,都将部署代码。
    开发周期慢开发周期很快。新功能更易于用户使用。增加利润。

     

    jenkins本身没有编译打包的功能,集成maven完成编译和打包, jenkins本身不会拉取gitee远程仓库的代码,集成git从远程仓库拉取代码, jenkins本身也不会运行jar,需要集成jdk来运行jar

    2. 安装Jenkins

    (1) 准备条件

    1.安装JDK。
    下载jdk,上传至linux并解压

    配置/etc/profile的内容
    ############JDK
    export JAVA_HOME=/usr/local/jdk1.8.0_161
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$JAVA_HOME/bin:$PATH
    使配置生效
    source /etc/profile
    检测java环境信息
    java  
    javac

    (2)安装Jenkins

    1. 下载jenkins 或 把jenkins的war放入虚拟机中
     

    wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war 


    2. 启动jenkins
    # 使用nohup命令启动 nohup 当虚拟机黑屏时 也会运行   日志--->输出到jenkins.log   & 后台运行
     

    nohup java -jar /usr/local/jenkins.war  --httpPort=8777 --httpsPort=8778 > /usr/local/jenkins.log 2>&1 &

    3. 使用tail命令查看启动日志,日志中会输出jenkins密码

     cat jenkins.log 

     4. 通过浏览器访问jenkins
    http://192.168.19.151:8777     

     

     输入刚才获取的密码,然后选择安装推荐的插件

     

     

     成功登录后的页面

    2.1. 修改密码

    如果忘记密码

    • 进入到jenkins的工作目录,找到config.xml,我这里是/root/.jenkins/config.xml

    • 修改该配置文件useSecurity的节点值为false

    <useSecurity>trueuseSecurity>
    • 重启jenkins项目后,再次访问jenkins站点

    • 进入到系统管理

     

    •  找到全局安全配置

     

    • 进入到用户列表,找到admin用户

     

    • 使用新密码登录即可

    2.2.  jenkins集成jdk

    (1)下载Linux版JDK  jenkins

    链接: https://pan.baidu.com/s/1Xd-zDEQDMc6Q0kwZ6o3PAA 
    提取码: bq6s

    (2)上传至Linux并解压

    tar -zxvf jdk8u181.tar.gz

    (3)配置/etc/profile文件

    vi /etc/profile

    # 在最底部加入以下内容后保存并退出
    # JDK
    export JAVA_HOME=/usr/local/java/jdk1.8.0_181
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    (4)使配置文件生效,并检查版本号

    source /etc/profile

    java -version
    java version "1.8.0_181"
    Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

    (5)jenkins中配置JDK路径

    jenkins-》全局工具配置-》JDK-》新增JDK

     

    2.4. jenkins集成git

    为了jenkins能够拉取代码,需要安装Git环境和jenkins对应的Git插件

    1. CentOS 7上安装Git环境

    # 安装
     yum install git -y
    # 查看版本
     git --version

    2.jenkins安装Git插件

     3.jenkins配置Git环境

    此处无需在jenkins中配置Git环境,采用默认生成的即可

    4. Gitee上任意建一个仓库

     

     5.测试凭据是否能够使用

    ​ jenkins-》新建item-》自由风格项目

     

     

     

     

     进入jenkins的工作空间查看文件是否拉取下来,所有拉取的文件都会存放在jenkins工作空间中

     到此用户名密码方式的凭证已经打通Git

    2.5. jenkins集成maven

    jenkins上发布Java项目时需要使用Maven来进行构建打包(Gradle项目则需要安装配置Gradle)

    必须在我们jenkins所在的服务器,安装maven.

    1.把安装包拉到/usr/local下并解压

    tar -zxvf apache-maven-3.8.6-bin.tar.gz

         # 当前maven的安装目录为:/usr/local/apache-maven-3.8.6

    2.配置maven的环境变量

    vi /etc/profile

    1. #在最后面JDK配置上作出一些更改
    2. export MAVEN_HOME=/usr/local/apache-maven-3.8.6
    3. export PATH=$PATH:$MAVEN_HOME/bin

     

    source /etc/profile   使配置生效
    mvn --version    查看安装情况

     

    3.修改maven的镜像   

    1. cd apache-maven-3.8.6
    2. vi conf/settings.xml

     

    修改本地仓库位置

     

     

    1. <localRepository>/data/software/repositorylocalRepository>
    2. <mirror>
    3. <id>aliyun-mavenid>
    4. <mirrorOf>centralmirrorOf>
    5. <name>aliyun maven mirrorname>
    6. <url>http://maven.aliyun.com/nexus/content/groups/public/url>
    7. mirror>

    保存并退出

    4.jenkins配置Maven

     5.安装Maven插件

     

     6.测试maven项目

     如果gitee上的maven项目内容发生改变,则会拉取并进行编译 打包了

    (1)创建一个gitee仓库

    (2)idea中创建一个maven工程

    (3) 把idea项目上传到git远程仓库  

     (4)jenkins拉取项目

     

     

     

    从日志可以看到代码已经在拉取了,第一次拉取过程会比较长。

    通过查看/usr/local/repmaven可以看到有存放拉取的jar包,通过这2个证据可以证明settings.xml文件配置成功且有效

     到此Maven集成完毕

    3. jenkins自动拉取gitee远程仓库的代码

     1.jenkins中安装gitee插件  

     

     修改任务项目:

     

     

     点击添加

    测试   修改代码  上传gitee

    成功

     

     

    4. 需要把jenkins打包好的项目复制到测试服务器

    企业: jenkins所在的服务器和我们项目运行时的服务器应该不是同一台机器。

    由于jenkins构建消耗内存极大,一般jenkins是一台单独的工具机器,java项目一般在其他的机器上,这里我需要重新安装一台虚拟机,有条件的可以直接开阿里云的ECS

    jenkins编译打包好的软件在jenkins所在的服务器。

    151上的jar远程复制到152上。---->

    scp 文件名  root@远程ip:/远程的目录
    scp maven-jenkins-0.0.1-SNAPSHOT.jar root@192.168.19.152:/usr/local

    在复制过程中需要手动输入密码:

    远程登录其他服务器时,能否免密登录。

    4.1. 设置远程登录免密

    如何设置免密:

    (1)在jenkins所在的服务器上输入如下命令

    ssh-keygen -t rsa    敲三次回车

     (2)接下来需要将公钥导入到认证文件中

     cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

     如果希望ssh公钥生效需满足至少下面两个条件:

    •  ssh目录的权限必须是700  r4 w2 x1
    • ssh/authorized_keys文件权限必须是600

    (3) 给对应文件授权

    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

    (4)将authorized_keys文件拷贝到另一台应用服务器的root用户.ssh目录下

    把151上的公钥复制到156上

    # 在应用服务器(192.168.19.152)上用root用户创建/root/.ssh文件夹

    mkdir -p /root/.ssh

    # 在jenkins服务器(192.168.19.151)上将pub公钥文件拷贝到应用服务器的.ssh目录下

     scp -p ~/.ssh/id_rsa.pub root@192.168.19.152:/root/.ssh/authorized_keys

    (5)测试免密连接152服务器

    ssh 192.168.19.152

    exit     退出 

    到此免密登录和拷贝实现成功,为接下来jar包部署提供了快捷的帮助  

     4.2. 使用脚本在jenkins 完成jar的复制

    1. #!/bin/bash
    2. echo "部署的目录和项目名称"
    3. DIR="/data/app"
    4. projectName="my-boot"
    5. echo "待部署的应用服务器,可多台"
    6. server_ips="192.168.19.152"
    7. for server_ip in ${server_ips[@]}
    8. do
    9. echo "ssh连接进行备份操作"
    10. ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
    11. mkdir -p $DIR/backup/${projectName}
    12. mkdir -p $DIR/${projectName}
    13. if [ -f "$DIR/${projectName}/${projectName}.jar" ];then
    14. mv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar
    15. fi
    16. EOF
    17. echo "拷贝jar包到目标服务器的tmp目录"
    18. scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jar
    19. echo "ssh远程连接进行发布操作"
    20. ssh -q -oStrictHostKeyChecking=no root@${server_ip} <<EOF
    21. mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar
    22. EOF
    23. done
    24. echo "success"

     记得修改要部署的服务器 

    修改代码并上传到gitee   测试是否能够自动复制到应用服务器中152

     此时152已复制项目

     在项目所在文件夹创建一个启动脚本start.sh,让项目自动启动

    vi start.sh

    1. #!/bin/bash
    2. set -e #任何命令出错就退出
    3. set -o pipefail
    4. APP_ID=my-boot
    5. APP_DIR="/data/app"
    6. nohup java -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log &
    7. start_ok=false
    8. if [[ $? = 0 ]];then
    9. sleep 3
    10. tail -n 10 release_out.log
    11. sleep 5
    12. tail -n 50 release_out.log
    13. fi
    14. aaa=`grep "Started" release_out.log | awk '{print $1}'`
    15. if [[ -n "${aaa}" ]];then
    16. echo "Application started ok"
    17. exit 0
    18. else
    19. echo "Application started error"
    20. exit 1
    21. fi

     创建一个关闭脚本,让项目自动关闭

    vi stop.sh

    1. #!/bin/bash
    2. APP_ID=my-boot
    3. ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh

    此时权限不够

    chmod 777 start.sh

    chmod 777 stop.sh

    此时两个脚本的运行还需要手动运行

     

    sh $DIR/${projectName}/stop.sh
    sh $DIR/${projectName}/start.sh

    再次修改代码测试是否成功,能否自动启动

     

     

  • 相关阅读:
    力扣-234-回文链表
    2403C++,C++20协程通道
    Android WIFI架构
    Generator
    Matlab绘制垂直的直线图
    springboot-starter如何整合阿里云datahub呢?
    14. UE5 RPG使用GameplayTag
    ArrayBlockingQueue
    Java中获取Class对象的三种方式
    【Python】Flask蓝图(bluePrint)
  • 原文地址:https://blog.csdn.net/weixin_68509156/article/details/126286050