Jenkins将构建生成的程序包部署到服务器(一)

这篇具有很好参考价值的文章主要介绍了Jenkins将构建生成的程序包部署到服务器(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Jenkins将构建生成的程序包部署到服务器的常用方法有:
1. Rsync over SSH
使用rsync命令通过SSH把程序包复制到服务器上。在Jenkins的“执行shell脚本”构建后操作中执行rsync命令,指定本地和远程服务器的程序包目录即可。
2. SFTP
使用SFTP客户端(Jenkins自带的内置SFTP服务或第三方插件提供的服务)上传程序包到服务器。在构建后操作的“Send files or execute commands over SSH”中填写远程服务器信息和程序包目录,上传文件即可。
3. SSH 执行命令
直接在“执行shell脚本”中使用scp或sftp命令上传程序包。或者使用ssh登录到服务器,并使用tar/unzip解压命令部署程序包。
4.FTP 上传
如果服务器支持FTP服务,可以使用Jenkins自带的FTP功能上传程序包。在“Send files or execute commands over FTP”构建后操作中指定服务器信息,上传文件。
5. API 部署
如果有发布程序包的API,可以在构建后调用API将程序包部署到服务器。通过“Invoke Webhook”或“Invoke REST API”等插件来调用部署API完成上传。
除此之外,更高级的方法还有:
使用Ansible、SaltStack等编排工具自动化部署程序包。 
使用容器(Docker等)来打包应用和环境,然后在另一个Jenkins流水线中拉取并启动容器。 
使用懒加载的中间件、CDN来部署程序包。服务启动时才会将程序包拉取运行。
所以,综上Jenkins主要通过以下方式将构建的程序包部署到服务器:
- rsync+SSH
- SFTP上传 
- SSH执行命令
- FTP上传
- 调用部署API
- 使用自动化运维工具来部署
- 构建Docker镜像,并在其他流水线中运行
根据自己的实际情况选择最适合的方案,可以实现Jenkins的CI与CD,完成从代码到部署上线的全流程自动化

目前在用的是rsync+ssh 组合构建cicd:
jenkins把程序包推送到服务器的几种方法
rsync+jenkins在同一台部署
/bin/sh /usr/local/deploy/rsync.sh $JOB_NAME $WORKSPACE
/bin/sh /srv/salt/script/tomcat_restart.sh $JOB_NAME

rsync.sh $JOB_NAME $WORKSPACE
bash
#!/bin/bash

# 设置echo的颜色 
COLOR_WHITE="\033[1;37m"  

# 部署目录
dir="/usr/local/deploy/program_new"   

# 获取所有项目名称  
project=$(ls /usr/local/deploy/program_new)   

# 获取当前时间
time=$(date "+%m-%d-%H:%M:%S")  

# 从第一个参数获取项目名称 
p=$(echo "$1" |awk -F-- '{print $2}')  

# 循环项目名称  
for i in "$p"; do

    # 检查项目是否存在 
    echo "${project[@]}" |grep -wq "$1"   
    if [ $? == 0 ];then 

        # 获取项目的IP地址  
        cat $dir/$1 | grep -v "^#" | grep "IP" | awk -F= '{print $2}' |
        
       # 部署到IP   
        while read ip  
           do  
                     # 部署静态资源            
                     if [ "$i" = html_static ];then   
                        rsync -av --password-file=/usr/local/deploy/pwd.conf --exclude .svn $2/*  ruser@$ip::static  
             elif [ "$i" = static ];then   
            rsync -av --password-file=/usr/local/deploy/pwd.conf --exclude .svn $2/*  ruser@$ip::html_static  
             elif [ "$i" = web_static ];then    
            rsync -av --password-file=/usr/local/deploy/pwd.conf --exclude .svn $2/*  ruser@$ip::web_static  
                     # 部署WAR包  
                     elif [ "$i" = id ];then     
                        rsync -av --password-file=/etc/pwd.conf $2/id/target/$i.war ruser@$ip::webapps/tomcat/webapps/  
                     # ...
                     fi     
                     if [ $? -ne 0 ];then     
                        exit 1  
                     fi   
            done  

    else   
            echo "$COLOR_WHITE 用法: $0 {项目名称}"  
    fi
done  

这个脚本将:

  1. 从第一个参数获取项目名称
  2. 检查项目是否存在
  3. 如果存在,获取项目的IP地址
  4. 根据项目名称部署静态资源或WAR包到IP
  5. 如果发生任何错误,退出
  6. 否则,如果项目不存在,打印用法
    该脚本使用rsync通过SSH部署到服务器,密码存储在密码文件中。它可以部署静态内容和Java WAR包。
tomcat_restart.sh $JOB_NAME
#!/bin/bash
echo $1
#  $p 正则出 项目名
p=$(echo "$1" |awk -F-- '{print $2}')
dir="/usr/local/deploy/program_new"

cat $dir/$1 | grep -v "^#" | grep "PORT" | awk -F= '{print $2}' |
	while read port
           do
	     cat $dir/$1 | grep -v "^#" | grep "IP" | awk -F= '{print $2}' |
               while read ip
		  do
	          echo $ip

		  #改了加 grep $p 精确筛选出 saltid 解决了 发布重启时候出了一堆saltid  
		  saltid=$(salt-key |grep -w $ip)
		  #salt $ip cmd.script salt://script/service_restart_temp.sh "$1 $port"
	          salt $saltid cmd.script salt://script/service_restart_temp.sh "$1 $port"
		  sleep 5
               done
           done

这个脚本将:

  1. 获取第一个参数的项目名称
  2. 从部署目录获取项目的端口和IP
  3. 循环IP
  4. 获取精确匹配的salt id,避免重启时返回多余的salt id
  5. 调用saltstack在IP上重启tomcat,并传递项目名称和端口作为参数
  6. 等待5秒
    该脚本使用Saltstack在远程服务器上重启Tomcat,以完成部署后的服务重启。
    通过匹配项目名称来过滤IP和salt id,实现了精确重启相关服务。
#!/bin/bash


p=$(echo "$1" |awk -F-- '{print $2}')
tomcat_path=/data/app/tomcat


##关闭tomcat
#${tomcat_path}/bin/shutdown.sh
#echo "关闭tomcat成功:${tomcat_path}/bin/shutdown.sh"
#ps -ef | grep ${tomcat_path} | awk '{print $2}' | xargs kill -9
netstat -antup |grep $2 |awk '{print $7}' | awk -F/ '{print $1}' | xargs kill -9
echo "关闭tomcat成功"

sleep 5

##删除temp文件夹下所有文件
rm -rf ${tomcat_path}/temp/*
rm -rf ${tomcat_path}/logs/*
echo "删除temp文件夹下所有文件 : rm -rf ${tomcat_path}/temp/*"

##删除work目录下所有缓存
rm -rf ${tomcat_path}/work/*
echo "删除work目录下所有缓存 : rm -rf ${tomcat_path}/work/*"

##删除webapps下所有文件
rm -rf ${tomcat_path}/webapps/$p

if [ "$p" = "archives" ];then
  rm -rf ${tomcat_path}/webapps_1/ROOT
fi

if [ "$p" = "report" ];then
  rm -rf ${tomcat_path}/webapps/ROOT
  rm -rf ${tomcat_path}/webapps/ROOT.war
  mv ${tomcat_path}/webapps/$p.war ${tomcat_path}/webapps/ROOT.war
fi

if [ "$p" = "oct" ];then
  rm -rf ${tomcat_path}/webapps/ROOT
  rm -rf ${tomcat_path}/webapps/ROOT.war
  mv ${tomcat_path}/webapps/$p.war ${tomcat_path}/webapps/ROOT.war
fi


echo "删除原始war包:rm -rf ${tomcat_path}/webapps/$p"

su - deploy -c ${tomcat_path}/bin/startup.sh
echo "启动tomcat : ${tomcat_path}/bin/startup.sh"

这个脚本将:

  1. 从第一个参数获取项目名称
  2. 根据端口号杀掉Tomcat进程
  3. 等待5秒
  4. 删除Tomcat temp和logs目录下的文件
  5. 删除Tomcat work目录下的缓存
  6. 根据项目名称删除webapps目录下的文件
  7. 处理archives, report和oct项目的特殊情况
  8. 启动Tomcat
    该脚本首先正确关闭Tomcat,清除缓存和临时文件,删除部署后的webapps,处理任何特殊情况,然后重新启动Tomcat

使用步骤,通过saltstack来匹配jobname,然后调用脚本,来推送,和执行一下命令,
当然也可以通过推送到程序包之后直接调用服务器脚本来更新,

/usr/sbin/lsof -i:8080 |grep java |awk '{print $2}' |xargs -i kill -9 {}
sleep 5
rm -rf /data/app/tomcat_war/logs/*
rm -rf /data/app/tomcat_war/my_logs/* 
rm -rf /data/app/tomcat_war/webapps/war
rm -rf /data/app/tomcat_war/temp/*
rm -rf /data/app/tomcat_war/work/*
/data/app/tomcat_war/bin/startup.sh

这里是启动脚本带详细中文注释:

bash
BUILD_ID=DONTKILLME
#发布  
echo "--------->开始启动:"$JARFILE"<-----------"  

source /etc/profile  
# 重新加载环境变量

pkill java   
# 杀掉存在的java进程

nohup java -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MaxGCPauseMillis=200 -Dfile.encoding=UTF-8 -Dhudson.util.ProcessTree.disable=true  
-jar /data/app/java.jar --spring.profiles.active=test  
# 后台启动Java应用,并传递必要的参数:
# -XX:+UseG1GC 使用G1垃圾收集器
# -XX:ParallelGCThreads=2  使用2个线程并行执行垃圾回收
# -XX:MaxGCPauseMillis=200 垃圾收集过程中停顿不超过200ms
# -Dfile.encoding=UTF-8   设置默认编码为UTF-8
# -Dhudson.util.ProcessTree.disable=true  禁用进程树跟踪
# --spring.profiles.active=test              使用test配置文件  

> /dev/null 2>&1 &   
# 重定向stdout和stderr到/dev/null,并在后台运行

echo "start begin"  
# 打印启动日志

#nohup java -Xms128m -Xmx128m -jar $JARFILE >/dev/null 2>&1 &echo "start begin"    
# 备选方案,限制java内存并启动jar包

这个脚本的作用是:

  1. 定义BUILD_ID环境变量
  2. 打印发布日志
  3. 重新加载环境变量
  4. 杀掉存在的java进程
  5. 使用nohup在后台启动Java应用,并传递必要的参数
  6. 重定向stdout和stderr到/dev/null,并在后台运行
  7. 打印启动日志
  8. 提供备选方案,限制内存并运行jar包
    该脚本使用nohup后台运行Java应用,并传递垃圾收集、编码、配置文件等必要参数。同时提供备选方案限制内存运行。

jar程序部署脚本文章来源地址https://www.toymoban.com/news/detail-692872.html

source /etc/profile
cd /data/app
rm -rf testjar
unzip testjar-bin.zip
cd testjar
chmod u+x restart.sh
/data/app/testjar/restart.sh

这个脚本将:
1. source /etc/profile  
 - 重新加载环境变量
2. cd /data/app 
 - 切换到/data/app目录
3. rm -rf testjar  
 - 删除testjar目录(如果存在)
4. unzip testjar-bin.zip 
 - 解压testjar-bin.zip压缩包
5. cd testjar 
 - 进入testjar目录
6. chmod u+x restart.sh 
 - 给restart.sh文件添加可执行权限
7. /data/app/testjar/restart.sh   
 - 执行restart.sh脚本
这个脚本的作用是:
1. 准备环境 - 重新加载环境变量,切换目录
2. 删除现有的testjar目录(如果存在)
3. 解压testjar-bin.zip压缩包
4. 进入testjar目录并给restart.sh文件添加可执行权限
5. 执行restart.sh脚本
该脚本一步步进行目录清理、文件解压和授权,最终执行restart.sh脚本。
restart.sh脚本很可能负责启动或重启testjar应用。
整个脚本实现了对testjar应用的部署流程 - 清理现有安装 -> 解压安装包 -> 启动应用。
这里是脚本带详细注释:
bash
#!/bin/bash

BASE_DIR=/data/app/testjar  
# 定义应用基础目录

CNF_DIR=$BASE_DIR/config
# 定义配置文件目录

LOG_DIR=/data/log/testjar   
# 定义日志目录

JAR_DIR=$BASE_DIR/lib
# 定义jar包目录

MAIN_CLASS="com.testjar.testApplication"  
# 定义主类名

if [ ! -x $LOG_DIR ]  
# 如果日志目录不存在
 then  
  `mkdir -p $LOG_DIR`  
# 创建日志目录
fi   

proc_pid=`ps -ef | grep -i $MAIN_CLASS|grep -v "grep"|awk '{print $2}'` 
# 获取应用主类的进程id

if [[ -z $proc_pid ]]  
# 如果进程id为空
then  
   echo "not exists proc"  
# 打印日志,进程不存在 
else  
   echo "stop process " $proc_pid  
   # 打印日志,停止进程
   kill -9 $proc_pid  
   # 杀掉进程 
   sleep 5s  
   # 等待5秒
   echo "kill successful " $proc_pid  
# 打印日志,进程停止成功
fi

#nohup java -Xms2048M -Xmx2048M -Dfile.encoding=UTF-8 -classpath $CNF_DIR -Djava.ext.dirs=$JAR_DIR $MAIN_CLASS --spring.profiles.active=aliyunprd >> $BASE_DIR/shell.log &  
# 备选方案1,重定向日志并后台运行

nohup java -Xms2048M -Xmx2048M -Dfile.encoding=UTF-8 -classpath $CNF_DIR -Djava.ext.dirs=$JAR_DIR $MAIN_CLASS --spring.profiles.active=aliyunprd >/dev/null 2>&1 &  
# 后台运行应用,重定向日志到/dev/null

new_proc_pid=`ps -ef | grep -i $MAIN_CLASS|grep -v "grep"|awk '{print $2}'`   
# 获取新启动应用主类进程id
这个脚本的作用是:
1. 定义应用必要的目录
2. 获取应用主类的进程id
3. 如果进程id为空,打印日志进程不存在
4. 否则,停止进程并打印日志 
5. 后台启动应用,重定向日志到/dev/null
6. 获取新启动应用主类进程id
该脚本首先判断应用是否已启动,如果启动则停止应用。然后使用nohup后台启动应用,并重定向日志输出。
最后获取新启动应用的进程id。
实现了应用的停止与启动。

到了这里,关于Jenkins将构建生成的程序包部署到服务器(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jenkins构建自由风格项目发布jar到服务器

    前面的文章有介绍 docker安装jenkins 和 docker+jenkins发布spring项目;这里就不做过多的介绍,直接说明构建步骤。 1、选择构建一个自由风格的项目  2、 选择丢弃旧的构建  3、配置Git信息 4、构建触发器 和 构建环境可以直接跳过 5、直接来到Build Steps这步骤,先新增一个调用

    2024年02月13日
    浏览(38)
  • Linux服务器Jenkins部署打包Android

    介绍 Jenkins 自动打包 Android 应用,后面介绍打包Flutter应用,然后介绍打包Android原生+Flutter混合应用 准备工作 1.jenkins服务器地址 账户密码 2.项目git地址 访问账号密码 3.ssh 链接服务器账户密码 安装Android环境 Android SDK下载 国内老版本下载地址 官网下载地址 下载到本地使用使

    2024年02月10日
    浏览(52)
  • Linux服务器 容器化部署新版Jenkins

    先安装yml 设置加速镜像(阿里云镜像) 安装docker docke命令 创建Jenkins持久化目录 运行部署容器 jenkins:2.319.3-lts-jdk11 解释 2.319.3 代表版本号 jenkins/jenkins:lts-jdk11 表示最后一个版本 也可以用 jenkins/jenkins:jdk11 执行命令解读 docker run -d 表示将该容器在后台运行 -u root 表示使用root用

    2024年02月02日
    浏览(50)
  • jenkins同一jar包部署到多台服务器

    没有部署过可以跟这个下面的步骤先部署一遍,我这篇主要讲 jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 Publish Over SSH 这里是已经安装过了 设置流程 添加 Send files or execute commands over SSH , 如果觉得突然到这里很懵的

    2024年02月12日
    浏览(68)
  • 使用 Docker 部署 Jenkins 代理(主从)控制服务器

    自动化是 DevOps 的核心。各种自动化工具和技术真正实现了持续集成和持续交付的概念。这些工具多年来发展迅速,但似乎永远存在的一个名字是Jenkins。 我们不会在这篇文章中讨论 CI-CD 的介绍性概念,也不会浪费时间展示 Jenkins 安装步骤。如果您是 Jenkins 的新手,可以查看

    2024年02月10日
    浏览(39)
  • jenkins如何同一jar包部署到多台服务器

    没有部署过可以跟这个下面的步骤先部署一遍,我这篇主要讲 jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 Publish Over SSH 这里是已经安装过了 设置流程 添加 Send files or execute commands over SSH , 如果觉得突然到这里很懵的

    2024年02月10日
    浏览(57)
  • 【Linux】使用Jenkins + svn + springboot自动构建jar包并自动打包在服务器上运行

    👨‍🎓 博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊 交流社区: 运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我们一起进步!😄 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏

    2024年04月26日
    浏览(37)
  • 【Linux】云服务器自动化部署VuePress博客(Jenkins)

    博主此前是将博客部署在 Github Pages (基于 Github Action)和 Vercel 上的,但是这两种部署方式对于国内用户很不友好,访问速度堪忧。因此将博客迁移到自己的云服务器上,并且基于 Jenkins (一款开源持续集成工具)实现本地推送代码后,自动化集成部署 环境 云服务器:Cent

    2024年02月13日
    浏览(50)
  • 云服务器使用jenkins+docker自动化部署SpringBoot项目

    docker 安装jenkins,就这一步都恶心死了 //拉取镜像,踩了很多坑,用其它版本的镜像插件一直安装失败,最后用的是lts版本(基础版) 用其它版本要么是连不上插件的下载地址,要么是插件下载不成功  docker pull jenkins/jenkins:lts  部署 docker run --user root -d -p 10240:8080 -p 10241:50

    2024年02月01日
    浏览(55)
  • linux服务器部署jenkins+python+git部署讲解与git仓库的使用

    1.首先需要安装一下虚拟机:推荐使用 VMware 这个比较好用,如果不知道怎么安装可以根据下面的网站去看教程,很简单 【VMware 详细安装教程,亲测有效】-CSDN博客 2.安装好之后,可以使用 Xshell 去连接你得虚拟机,建议使用 Xshell 操作虚拟机,因为企业里面都是使用远程连接工

    2024年02月20日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包