容器化Jenkins远程发布java应用(方式一:pipline+ssh)

news2024/11/28 2:52:29

1.创建pipline工程

2.准备工程Jenkinsfile文件(java目录)

1.文件脚本内容

env.fileName = "planetflix-app.jar"
env.configName = "planetflix_prod"
env.remoteDirectory = "/data/project/java"
env.sourceFile = "/var/jenkins_home/workspace/release_planetxflix_pipline/planetflix-api/target/${env.fileName}"
env.shellName="devops.sh"
env.shellDirectory = "/home/planetflix/shell"

pipeline{
    agent any
    //定义流水线的加工流程
    stages {
		stage('打JAR包') {
            steps {
               sh label:'',script: 'mvn clean package -Dmaven.test.skip=true'
            }
        }
		stage('推送部署文件到远程服务器') {
			steps {
				sh """
					cp -f ${env.sourceFile} ./
				   """
				sshPublisher(publishers: [sshPublisherDesc(configName: "${env.configName}", transfers: [sshTransfer(cleanRemote: false, excludes: '', 
												execCommand: 'echo "...成功推送planetflix-app.jar..."', 
												execTimeout: 120000, flatten: false, 
												makeEmptyDirs: false, noDefaultExcludes: false, 
												patternSeparator: '[, ]+', 
												remoteDirectory: "${env.remoteDirectory}", 
												remoteDirectorySDF: false, removePrefix: '', 
												sourceFiles: "${env.fileName}")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
				echo '推送成功'
            }
		}
		
		stage('运行部署') {
			steps { 
			   sshPublisher(publishers: [sshPublisherDesc(configName: "${env.configName}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand:
			   "sh ${env.shellDirectory}/${env.shellName}", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo "部署完成"
			}
		}
	}
}

2.devops.sh文件

#!/bin/bash

#服务名称
SERVER_NAME=planetflix-app
#端口信息
PORT=10021
# 镜像tag
IMAGE_TAG=1.0.0-SNAPSHOT

#dockerFile存放路径
DOCKER_PATH=/home/planetflix/shell
#容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $SERVER_NAME}')
#镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
 
# 构建docker镜像
function build(){
  if [ -n "$IID" ]; then
    echo "存在$SERVER_NAME镜像,IID=$IID"
  else
    echo "不存在$SERVER_NAME镜像,开始构建镜像"
      cd $DOCKER_PATH
    echo "------ 开始构建镜像:${SERVER_NAME} ------"
	  docker build -t $SERVER_NAME:$IMAGE_TAG -f Dockerfile . --no-cache
  fi
}
build
# 运行docker容器
if [[ -n $(docker ps -q -f "name=^${SERVER_NAME}$") ]];then
  echo "------ 容器正在运行:${SERVER_NAME} ------"
  echo "------ 停止容器:$SERVER_NAME ------"
  docker stop $SERVER_NAME
  echo "------ 删除容器:$SERVER_NAME ------"
  docker rm $SERVER_NAME
else
  echo "------ 容器未在运行:${SERVER_NAME} ------"
  echo "------ 删除容器:$SERVER_NAME ------"
  docker rm $SERVER_NAME
fi

echo "------ docker run创建$SERVER_NAME容器 ------"
docker-compose -f /home/planetflix/compose/app.yml --compatibility up -d
echo "------ $SERVER_NAME容器创建完成 ------"

3.app.yml(docker-compose)

version: '3'
#统一管理服务
services:
#数据库服务
  app:
    container_name: planetflix-app
    image: planetflix-app:1.0.0-SNAPSHOT
    ports:
      - 10021:10021
    restart: always
    networks:
      - mid_network
    volumes:
      - /data/project/java/logs:/data/project/java/logs
      - /data/project/java/planetflix-app.jar:/data/project/java/planetflix-app.jar
networks:
  mid_network:

4.Java服务Dockerfile

# 使用 OpenJDK 17 的 slim 版本作为基础镜像
FROM openjdk:17-jdk-slim

MAINTAINER yangyanwei "yanwei_0818@163.com"

# 设置镜像的时区,避免出现8小时的误差
ENV TZ=America/New_York

# 合并 RUN 命令,清理不需要的缓存
RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        tzdata \
    ; \
    cp /usr/share/zoneinfo/$TZ /etc/localtime; \
    echo "$TZ" > /etc/timezone; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*

# 容器暴露的端口号和 Spring Boot 的 yml 文件暴露的端口号要一致
EXPOSE 10021

ENV JAVA_OPTS  "-Xms512m -Xmx512m --add-opens java.base/java.lang=ALL-UNNAMED"

ENV SPRING_PROFILES_ACTIVE test

# 设置工作目录
WORKDIR /data/project/java

# 复制项目 JAR 文件
COPY target/planetflix-app.jar /data/project/java/planetflix-app.jar

# 使用 ENTRYPOINT 代替 CMD
CMD ["/bin/sh", "-c", "java $JAVA_OPTS -Dname=planetflix-app -Dfile.encoding=UTF-8 -jar /data/project/java/planetflix-app.jar  --spring.profiles.active=$SPRING_PROFILES_ACTIVE"]

3.配置工程git访问,填写Jenkinsfile文件路径

4.配置远程服务器ssh访问

系统管理>系统配置>

可以通过生成ssh公钥密钥,远程连接ecs密码连接保存

5.构建工程成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1668590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度云防护如何开启CC攻击防护

百度云防护的最重要的功能是可以CC攻击防护,针对CC攻击,百度云防护有被动的CC攻击拦截规则,也有主动自定义访问策略拦截。 今天百度云来教大家如何开启百度云防护的CC攻击防御功能。 1.进入防护模板功能-创建模板 2.开启CC攻击防御功能&…

Windows单机部署RocketMQ5.X并与SpringBoot集成

RocketMQ 5.X下载 《RocketMQ 5.X下载》 下载后,解压缩 修改初始内存 修改runserver.cmd(Linux则为runserver.sh) 将下面的-Xms2g -Xmx2g -Xmn1g调小 if %JAVA_MAJOR_VERSION% lss 17 (set "JAVA_OPT%JAVA_OPT% -server -Xms2g -X…

Apache反代理Tomcat项目,分离应用服务器和WEB服务器

项目的原理是使用单独的机器做应用服务器,再用单独的机器做WEB服务器,从网络需要访问我们的应用的话,就会先经过我们的WEB服务器,再到达应用程序,这样子的好处是我们可以保护应用程序的机器位置,同时还可以…

长安汽车:基于云器 Lakehouse 的车联网大数据平台建设

近年来随着智能汽车行业的迅速发展,数据也在呈爆炸式增长。长安大数据平台承接了长安在生产上大部分流量应用及日常生产业务应用。本文将分享长安汽车在车联网场景下大数据平台建设面临的一些挑战和具体落地的实践。 主要内容如下: 1. 背景介绍 2. 长…

渲染农场多少钱一个小时?

​很多第一次准备使用渲染农场的小伙伴不知道渲染农场多少钱一个小时,今天就给大家介绍一下渲染农场多少钱一小时。 现在渲染农场基本都有CPU渲染和GPU渲染,各渲染农场的服务器配置不同,收费也各不相同,不过都是按渲染时长收费&…

C语言学习(八)typedef 虚拟内存 malloc/free

目录 一、typedef 类型重定义(一)使用(二)define和typedef的区别1. 编译处理的阶段不同2. 功能不同 二、虚拟内存(一)虚拟内存分布(二)内存分布1. 静态分配2. 动态分配 三、malloc/f…

如何使用canvas在图片上进行标注,以下代码不起作用,着实被坑到了(文末附完整代码)

今天发现一个有意思的问题&#xff1a; 如何使用canvas在图片上进行如下的标注&#xff0c;以下代码不起作用,如何修改 原始代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&quo…

理解进程的基本概念

1. 什么是进程 进程&#xff0c;即执行中的程序 进程 程序执行 在计算机中&#xff0c;每一个运行的exe程序&#xff0c;就是一个进程 2.为什么会有进程 早期&#xff0c;操作系统只有一个程序&#xff0c;这样效率是很低的。为了提高CPU的利用率&#xff0c;人们将多个程…

时间复杂度的简单讲解

小伙伴们大家好&#xff0c;我们又见面了&#xff0c;这次我们直接进入正题 时间复杂度的概念 时间复杂度的定义&#xff1a;在计算机科学中&#xff0c; 算法的时间复杂度是一个函数 &#xff0c;它定量描述了该算法的运行时间。一 个算法执行所耗费的时间&#xff0c;从理论…

Hadoop-未授权访问-内置配合命令执行RCE

一、Hadoop常见端口及配置文件 Hadoop中有多种端口&#xff0c;这些端口用于不同的服务和通信。以下是Hadoop中常见的端口以及它们的用途&#xff1a; NameNode Web界面端口 (默认: 9870)NameNode 对客户端服务端口 (默认: 8020)Secondary NameNode Web界面端口 (默认: 9868)…

每日OJ题_贪心算法四⑤_力扣354. 俄罗斯套娃信封问题

目录 力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划&#xff08;超时&#xff09; 解析代码2_重写排序贪心二分 力扣354. 俄罗斯套娃信封问题 354. 俄罗斯套娃信封问题 难度 困难 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0…

物联网杀虫灯—新型的环保杀虫设备

型号推荐&#xff1a;云境天合TH-FD2S】物联网杀虫灯是一种新型环保杀虫设备&#xff0c;其中风吸式太阳能杀虫灯作为其一种特殊类型&#xff0c;展现了独特的工作原理和优势。 风吸式太阳能杀虫灯以太阳能电池板为电源&#xff0c;白天储存电源&#xff0c;晚上为杀虫灯提供电…

资产公物仓管理系统|实现国有资产智能化管理

1、项目背景 资产公物仓管理系统&#xff08;智仓库DW-S201&#xff09;是一套成熟系统&#xff0c;依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 项目设计原则 方案对公物仓资…

Java 守护线程 ( Daemon Thread )详解

在Java中&#xff0c;线程分为两类&#xff1a;用户线程(User Thread)和守护线程(Daemon Thread)。守护线程是后台线程&#xff0c;主要服务于用户线程&#xff0c;当所有的用户线程结束时&#xff0c;守护线程也会自动结束&#xff0c;JVM会随之退出。守护线程的一个典型例子是…

docker(四):数据卷

数据卷 卷的设计目的就是数据的持久化&#xff0c;完全独立于容器的生存周期&#xff0c;因此Docker不会在容器删除时删除其挂载的数据卷。 1、docker run docker run -it --privilegedtrue -v /宿主机绝对路径目录:/容器内目录 镜像名2、挂载注意事项 --privilegedtru…

贪吃蛇(c实现)

目录 游戏说明&#xff1a; 第一个是又是封面&#xff0c;第二个为提示信息&#xff0c;第三个是游戏运行界面 游戏效果展示&#xff1a; 游戏代码展示&#xff1a; snack.c test.c snack.h 控制台程序的准备&#xff1a; 控制台程序名字修改&#xff1a; 参考&#xff1a…

【考研数学】汤家凤“免单“数学题被吐槽‘太难’,老汤回应「怎么还有脸笑」,网友:这些题有毒!

我看了汤家凤老师出的几道题&#xff0c;实际上对于考研的同学来说&#xff0c;确实是送分题 第一个是三角函数变换中的万能公式&#xff1b;第二个e^x的泰勒展开公式&#xff1b;第三个是第一类重要极限。只要复习过&#xff0c;那基本上都能正常做出来。 至于汤家凤老师说「…

C#中数组与列表,集合等的联系

C#中&#xff0c;所有数组都自动继承于System.Array这个抽象类&#xff0c;数组都为引用类型&#xff0c; 所有对数组的更新都会导致源数组的元素值的篡改。 而所有集合的根都来自可枚举接口IEnumerable 数组有三种样式&#xff1a; 数组的Rank&#xff08;秩&#xff09;属…

纯血鸿蒙APP实战开发——Grid和List内拖拽交换子组件位置

Grid和List内拖拽交换子组件位置 介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子…

【数据结构】环状链表OJ题

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 一、OJ 环形链表&#xff1a; 快慢指针即可解决问题: 2情况&#xff1a; 快指针走到结尾&#xff08;不是环&#xff09;快指针和尾指针相遇&#xff08;是环的&#xff09; …