Jenkins-CICD-python/Java包升级与回退

news/2024/7/12 0:28:51 标签: ci/cd, jenkins, 运维, gitlab

Jenkins- CICD流水线 python/Java代码升级与回退

1、执行思路

1.1、代码升级

jenkins上点击 upgrade代码版本号 --${tag}
jenkins 推送 代码 执行脚本 到目标服务器/opt目录下
执行命令 sh run.sh 代码名称 版本号 upgrade
版本号 来自jenkins的 构建参数中的 标签参数,标签值从gitee处获取

run.sh 升级代码执行逻辑
1、在目标服务器上 新代码名称+标签 cp 到 bak目录下
2、停服,新代码 mv 到执行目录下,启动

1.2、代码回退

jenkins上点 rollbak 代码版本号

run.sh 回退代码执行逻辑
停服,cp bak/代码-版本号 到执行目录,启动

2、gitee代码如下

run.sh 执行脚本
test_flask.py python代码

在这里插入图片描述

2.1、执行脚本run.sh代码如下

#!/bin/bash

# cd `dirname $0`
APP_NAME=$1
APP_file=/opt/test/${APP_NAME}
tag=$2

#使用说明,用来提示输入参数
usage() {
    echo "Usage: ./run.sh [start|stop|status|restart|upgrade]"
    exit 1
}

#检查程序是否在运行
is_exist(){
	# pid=`jps -l|grep $APP_NAME|grep -v grep|awk '{print $1}'` >> 此次获取java进程pid <<
  pid=`curl localhost:10080/pid 2>/dev/null`
  #如果不存在返回1,存在返回0     
	if [ -z "${pid}" ]; then
    echo "pid不存在"
		return 1
	else
		return 0
	fi
}

#启动方法
start(){
  echo "${APP_file} is starting ..."
	is_exist
	if [ $? -eq 0 ]; then
		echo "${APP_file} is already running. pid=${pid}"
	else
		# nohup java -Xmx100m -Xms100m -jar ${APP_file} --server.port=8181 >/dev/null 2>&1 & >> 此处启动java jar包 <<
    nohup python3 test/test_flask.py &
		echo "START..."
		sleep 5
		is_exist
		if [ $? -eq 0 ]; then
			echo "${APP_file} is running success. pid=${pid}"
		fi
	fi
}

#停止方法
stop(){
  echo "${APP_file} is stopping ..."
  is_exist
  if [ $? -eq "0" ]; then
    kill -15 $pid
    echo "..."
    sleep 2
    is_exist
    if [ $? -eq 0 ]; then
      echo "${APP_file} still in the running. pid=${pid}"
    else
      echo "${APP_file} has stopped running."
    fi
  else
    echo "${APP_file} is not running"
  fi  
}

#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_file} is running. Pid is ${pid}"
  else
    echo "${APP_file} is NOT running."
  fi
}

#重启
restart(){
  echo "${APP_file} is restarting ..."
  stop
  #sleep 5
  start
}

#程序升级
#upgrade(){
#  ./run.sh stop
#  cd ..
#  mv $APP_NAME $backup
#  cp $rjxf ./
#  ./bin/run.sh start
#}

upgrade(){
  cd /opt/
  cp ./${APP_NAME} ./bak/${APP_NAME}-${tag}
  ./run.sh ${APP_NAME} ${tag} stop
  mv ${APP_NAME}  test/${APP_NAME}
  ./run.sh ${APP_NAME} ${tag} start;exit
}

rollback(){
  cd /opt/
  ./run.sh ${APP_NAME} ${tag} stop
  cp ./bak/${APP_NAME}-${tag} test/${APP_NAME}
  ./run.sh ${APP_NAME} ${tag} start
  echo "slepp 5s ..."
  sleep 5
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$3" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  "upgrade")
    upgrade
    ;;
  "rollback")
    rollback
    ;;
  *)
    usage
    ;;
esac

2.1、python代码如下

from flask import Flask
import time,os

app = Flask(__name__)

@app.route("/")
def status():
    msg = time.strftime("%Y-%m-%d %H:%M:%S")+"\tMyPid: "+str(os.getpid())+"\tv2.1.0"+"\n"
    return msg

@app.route("/pid")
def pid():
    msg = str(os.getpid()) + "\n"
    return msg

if __name__ == '__main__':
    app.run(port=10080,host="0.0.0.0")

2.3、pipeline流水线,Jenkinsfile配置如下

pipeline {
    agent any

    stages {
        stage('代码部署') {
            when {
                expression { params.ACTION == 'upgrade'}
            }
            steps {
                script {
                    echo "从git上拉取代码"
                    checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'c2b40745-be98-4627-93af-5cc975b0e355', url: 'https://gitee.com/****/test.git']])
                    
                    echo '新代码+tag标签 推送到目标服务器备份目录下'
                    sshPublisher(publishers: [sshPublisherDesc(configName: 'aly-arm', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'test_flask.py,run.sh')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

                    sshPublisher(publishers: [sshPublisherDesc(configName: 'aly-arm', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """cd /opt;chmod +x run.sh;sh run.sh test_flask.py ${tag} ${ACTION};exit""", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '',usePty: true)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                }
            }
        }

        stage('代码回退') {
            when {
                expression { params.ACTION == 'rollback'}
            }
            steps {
                script {
                    sshPublisher(publishers: [sshPublisherDesc(configName: 'aly-arm', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "cd /opt;sh run.sh test_flask.py ${tag} ${ACTION};exit", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '',usePty: true)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                }
            }
        }
    }
}

3、Jenkins配置

3.1、添加2个构建化参数

1、选项参数,用于选择upgrade升级或者rollback回退
2、git参数,用于从gitee上拉取对于标签的值

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

3.2、添加流水线配置

在这里插入图片描述

3.3、执行

在这里插入图片描述


http://www.niftyadmin.cn/n/4939527.html

相关文章

100道python练习题(六)

以下是第61到70题的代码示例&#xff1a; 编写一个程序&#xff0c;判断一个字符串是否是回文串&#xff08;正向和反向拼写都相同&#xff09;。 def is_palindrome(string):return string string[::-1]string input("请输入一个字符串&#xff1a;")if is_pali…

AudioCodes桌面电话和Zoom ZTP曝出严重漏洞,用户面临窃听风险

近日&#xff0c;AudioCodes桌面电话和Zoom的Zero Touch Provisioning (ZTP)被曝存在多个安全漏洞&#xff0c;恶意攻击者可能利用这些漏洞进行远程攻击。 SySS安全研究员Moritz Abrell在周五&#xff08;8月11日&#xff09;发表的一份分析报告中提到&#xff1a;外部攻击者可…

bat批处理启动jar包

echo off title “gwjy_sc(86)” java -jar -Xms512m -Xmx1024m -XX:MaxNewSize512m -XX:MaxPermSize512m gwjy_sc.jar --spring.config.localapplication.yml exit

kubernetes二进制部署2之 CNI 网络组件部署

CNI 网络组件部署 一&#xff1a;K8S提供三大接口1容器运行时接口CRI2云原生网络接口CNI3云原生存储接口CSI 部署 flannelK8S 中 Pod 网络通信&#xff1a;Overlay Network&#xff1a;VXLAN&#xff1a;Flannel:Flannel udp 模式的工作原理&#xff1a;ETCD 之 Flannel 提供说…

【C++】面试题

1、都说c是面向对象的语言&#xff0c;面向对象的三个特性能 [展开] 介绍一下吗&#xff1f; 封装&#xff1a;封装是一种集中管理的思想&#xff0c;把内部的数据和实现方法组合在一起&#xff0c;并且不对外暴漏内部的数据和实现方法&#xff0c;只对外提供几个接口来完成函数…

CSS中的position属性有哪些值,并分别描述它们的作用。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ static⭐ relative⭐ absolute⭐ fixed⭐ sticky⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那…

Java-java中的类,main函数和文件名的关系

java中的类&#xff0c;main函数和文件名的关系 类与文件名的关系 一个java文件中可以定义多个类&#xff0c;但是最多只有一个类被public修饰&#xff0c;并且这个类的类名与文件名必须相同&#xff0c;若这个文件中没有public的类&#xff0c;则文件名随便是一个类的名字即可…

JavaScript进阶 第一天

作用域函数进阶解构赋值 一.作用域 局部作用域全局作用域作用域链JS垃圾回收机制闭包变量提升 1.1 作用域 ① 概念&#xff1a;规定了变量能够被访问的“范围”&#xff0c;离开了这个"范围"&#xff0c;变量不能被访问 ② 分类 局部作用域 &#xff08;1&…