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

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.mfbz.cn/a/606047.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于TL431的线性可调恒压恒流电源的Multisim电路仿真设计

1、线性电源的工作原理 在我们日常应用里,直流电是从市电或电网中的交流电获取的。例如15V直流电压源、24V直流电压源等等。交流电变为直流电的过程大概分为一下几步: 首先,交流电通过变压器降低其电压幅值。接着,经过整流电路进…

57.基于SpringBoot + Vue实现的前后端分离-在线教育系统(项目 + 论文PPT)

项目介绍 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了在线教育系统的开发全过程。通过分析在线教育系统管理的不足,创建了一个计算机管理在线教育系统的方案。文章介绍了在线教育系统的系统分析部分&…

深入理解Go语言并发编程

随着计算机硬件的发展,多核处理器已经成为现代计算机的主流配置。在这样的背景下,并发编程成为了一种必备的技能。Go 语言作为一门先进的编程语言,天生支持并发编程,提供了丰富的并发原语和工具,使得并发编程变得更加容…

掌握MySQL常用的命令

前言 MySQL是一个流行的开源关系型数据库管理系统,广泛应用于各种应用场景。熟练掌握MySQL的常用命令,对于数据库管理员和开发人员来说至关重要。本文将介绍MySQL数据库的一些基础术语、SQL语言分类,以及DDL、DML、DQL和DCL等操作&#xff0…

如何快速学习VCU电控开发

本课程基于实际项目案例和岗位需求技能制定教学大纲,以任务驱动方式引导学员,让学员快速掌握VCU开发知识。首先从VCU开发必备知识点和MATLAB/Simulink软件建模工具的使用入手,夯实学员基础。再通过策略设计、模型搭建和测试标定来指导学员完成…

解救应用启动危机:Spring Boot的FailureAnalyzer机制

目录 一、走进FailureAnalyzer 二、在Spring Boot中如何生效 三、为什么可能需要自定义FailureAnalyzer 四、实现自定义基本步骤 (一)完整步骤要求 (二)注册方式说明 通过Spring Boot的spring.factories文件(建…

CS03_BOM数据展开

CS03_BOM数据展开 一、功能介绍 使用事务码CS03进行数据展开 二、程序代码 程序代码: *&---------------------------------------------------------------------* *& Report ZMMR119 *&--------------------------------------------------------…

二层交换机与路由器连通上网实验

华为二层交换机与路由器连通上网实验 二层交换机是一种网络设备,用于在局域网(LAN)中转发数据帧。它工作在OSI模型的第二层,即数据链路层。二层交换机通过学习和维护MAC地址表,实现了数据的快速转发和广播域的隔离。 实…

相亲系统功能介绍

相亲系统是一种旨在帮助单身人士寻找合适伴侣的平台,其主要功能通常包括以下几个方面: 实名认证:为了确保双方的权益保障,用户必须进行实名认证后才能使用该系统。这有助于增加系统的安全性和可信度。偏好选择:用户可…

Android 按键消息流程源码分析

在Android系统中,键盘按键事件是由SystemServer服务来管理的;然后在以消息的形式分发给应用程序处理。产生键盘按键事件则是有Linux kernel的相关驱动来实现。键盘消息有别于其他类型的消息;需要从Linux kernel drivers产生由上层APP来处理。…

数据链路层——以太网协议

一、以太网的MAC帧格式 源地址与目标地址代表的是网卡的硬件地址,MAC 地址,在出厂时已经确定好了。 帧协议类型有三种值,IP0800,ARP 请求及应答0806,RARP 请求/应答8035. MAC地址一般都是唯一的,长度48位&…

Unity Editor 找物体助手

找啊找朋友~ 🍱功能介绍🥙使用方法 🍱功能介绍 💡输入相关字符串,它会帮你找到名称中带有该字符串的所有物体,还会找包含该字符串的Text、TextMeshProUGUI。 🥙使用方法 💡导入插…

240多道!Go开发岗位面试题合集(含答案)

随着今年互联网寒潮环境的影响,找工作的人也将达到顶峰,今天给大家分享一份《Go开发工程师超高频面试真题》,一共有240多道面试真题,希望能够帮助大家在面试中,少走一些弯路、更快拿到offer! 内容展示 GO 基…

集成逻辑分析器( ILA)IP核用法详解

集成逻辑分析器(Integrated Logic Analyzer, ILA)IP核是一个可定制的逻辑分析器,用于监测设计的内部信号。ILA核心包含了现代逻辑分析器的许多高级特性,比如布尔触发方程(boolean trigger equations)和边沿…

gitignore配置不生效记录

第一种可能性: 在你所有的文件都通过了git add . 命令的情况下,使用指令git rm -r --cached .进行缓存清除,完成之后,再次通过git add . 然后通过git status去看提交的文件都有哪些。 第二种可能性 如果上面的不行就是你添加的…

Makefile经验总结

文章目录 0.概述1.常用规则1.1 清空目录的规则1.2 文件搜寻 (用起来比较爽)1.3 伪目标(可用生成多个目标和配置工程删除规则)1.4 静态模式(用起来也很爽)1.5 显示命令(有助于调试makefile&#…

[YOLOv8] 用YOLOv8实现指针式圆形仪表智能读数(一)

最近研究了一个项目,利用python代码实现指针式圆形仪表的自动读数,并将读数结果进行输出,若需要完整数据集和源代码可以私信。 目录 🍓🍓1.yolov8实现圆盘形仪表智能读数 🙋🙋2.仪表目标检测…

Sui主网升级至V1.24.1版本

其他升级要点如下所示: GraphQL #17313 不再存在 Live 或 Historical 的 ObjectKind,它们已经合并为单个 Indexed 类型,表示从索引中获取的任何对象(而不是我们有相关信息但尚未建立索引的对象, 或者已被删除或包装…

什么才是正确的领域驱动实现架构?

作为一种系统建模方法,DDD同样涉及系统的体系架构设计。区别于分布式、事件驱动、消息总线等架构设计方法,DDD中的架构设计关注前面各章所介绍的聚合、实体、值对象、领域事件、应用服务以及资源库之间的交互方式和风格,并在设计思想上有其独…
最新文章