zoukankan      html  css  js  c++  java
  • Jenkins实现自动化部署

    一、简介

    java语言开发,用于监控持续重复的工作,包括:持续的软件版本发布/测试项目,监控外部调用执行的工作。

    Jenkins中文网:http://www.jenkins.org.cn/

    Jenkins官网:https://www.jenkins.io/zh/

     

    二、自动化部署原理

    如图,Jenkins把一系列步骤串到一起实现自动化。

     

     

    三、依赖工具

      1.git   

    拉取代码需要git,***注意安装完要生成公钥添加到代码服务器***,不了解的可以参考  查看公钥

      2.maven   编译打包需要

      3.jdk   Jenkins是Java语言开发,需要Java环境

    四、安装

    安装方法和步骤网上很多,官网也有,针对自己的服务器系统(win、mac、Linux)选择即可。这里不再赘述,只说几个注意点

    1.安装后的初始密码位置:/var/lib/jenkins/secrets/initialAdminPassword

        cat /var/lib/jenkins/secrets/initialAdminPassword

    2.默认构建目录:/var/lib/jenkins/workspace

     每个任务都可以具体设置

    3.修改Jenkins配置文件:/etc/sysconfig/jenkins ,使用 root账户运行,否则会出现权限问题 JENKINS_USER="root"

    4.安装推荐的插件时,会卡在那里很久,解决办法网上很多。可以参考 Jenkins安装插件很慢

     

    五、配置和使用

     1.全局工具

       maven、git

     2.插件管理

      git plugin、publish over ssh 原则是需要什么安装什么

     3.系统配置

      系统管理->系统配置->Publish over SSH

      publish over ssh  :远程部署,即Jenkins所在服务器通过ssh连接到应用服务器,上传jar包,执行脚本。这一步要提前配置后面要用

     

     4.新建任务

      配置如下:

     a、构建一个maven项目

     b、源码管理:

       选择git、设置 repositories URL、Credentials(证书)选择无,因为我是通过Jenkins服务器生成公钥添加到代码管理平台、指定分支

     c、pre steps:

       构建前的动作,比如 切换到构建目录,清理旧构建

       

    #!/bin/bash
    cd /opt/workspase/minapp
    mvn clean

     d、build:

      设置自定义工作目录,因Jenkins服务需要执行多个项目的构建 ,最好分别建立目录以区分

     e、post steps:

       执行shell,拷贝jar部署

       注:本步骤是可选,如果应用服务器和Jenkins在一个服务器上,即本地部署

       shell脚本demo:

       

    #!/bin/bash
    
    #export BUILD_ID=dontKillMe避免被Jenkins杀掉。
    export BUILD_ID=dontKillMe
        
    #找到jar包
    cd /opt/workspase/minapp/guanyu-server/guanyu-server-minapp/target
    pwd
    jarName=$(find guanyu-server-minapp*.jar)
    echo  "本次更新的包名----${jarName}----"
        
    #拷贝
        
    cp -f ${jarName} /root/servers/
        
    #切换目录 
    cd  /root/servers/
        
        
    PID=`ps -aux | grep guanyu-server-minapp | grep -v grep | grep -v deploy | awk '{print $2}'`
    echo " ---旧进程PID:${PID}--"
    
    if [ -n "$PID" ]; 
    then
        echo "杀死旧的进程……"
        sleep 2
        kill -9 $PID
    else
        echo "无旧服务……"  
    fi
        
    echo "开始启动……"
    chmod +x ${jarName}
    nohup java -jar ${jarName} --spring.profiles.active=test &

     f、构建后操作:

       增加构建后操作步骤:Send build artifacts  over SSH  

        source files :需要上传的jar包位置(相对于自定义的工作空间)
        remove prefix: source files里jar包名以外的部分
        remote directory:jar包上传到远程服务器的目录(继承ssh servers的remote directory,即真实上传目录为:ssh servers的remote directory+此处的remote directory)
        exec command:远程服务器执行的shell脚本
        高级里 exec in pty 选项要勾选,否则可能会报错

       shell脚本:

       

    #!/bin/bash
    #加载环境变量,否则有些服务器无法执行java
    source /etc/profile
    BASEDIR=/home/microservice/middleplatform_8980
    newJar="corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar`date +"%Y-%m-%d-%H:%M:%S"`"
    #备份
    cd $BASEDIR
    mv corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar  ${newJar}
    #移动
    mv /home/microservice/temp/corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar  corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar
    
    #启动
    if [ -f "$BASEDIR/pid" ];then
            pid=$(cat $BASEDIR/pid)
            echo "进程号为:$pid"
            kill -9 $pid && rm -rf $BASEDIR/pid
            echo "服务关闭成功!"
    fi
    sleep 2
    nohup java -jar corn-middleplatform-dataservice-0.0.1-SNAPSHOT.jar  --meritdata.cloud.log.path=./logs --meritdata.cloud.log.level=debug --meritdata.cloud.log.consoleLevel=info --spring.cloud.zookeeper.connect-string=47.93.8.23:2181 --server.port=8980  --spring.profiles.active=test --spring.redis.host=119.3.254.222 --spring.redis.port=6379 --spring.redis.password=gy88623277 > middleplatform.log 2>&1 &
    echo $! > $BASEDIR/pid 
    #tail -f $BASEDIR/middleplatform.log
    sleep 5

      5.立即构建

     

     

     

     

     

     

    播种和收获通常不在一个季节,而中间的过程叫做坚持~
  • 相关阅读:
    null和undefined的区别
    减少页面加载时间的方法
    html5有哪些新特性、移除了那些元素?
    cookies,sessionStorage 和 localStorage 的区别
    小程序页面
    快速保存网页图片的工具
    Flex 布局教程
    第一阶段:Python开发基础 day08 Python基础语法入门--列表元组字典集合类型的内置方法
    第一阶段:Python开发基础 day08 数据类型的内置方法 课后作业
    python学习第一周知识内容回顾与小结
  • 原文地址:https://www.cnblogs.com/shog808/p/13208251.html
Copyright © 2011-2022 走看看