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

1.创建pipline工程

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

1.文件脚本内容

bash 复制代码
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文件

bash 复制代码
#!/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)

bash 复制代码
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

bash 复制代码
# 使用 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.构建工程成功

相关推荐
Adorable老犀牛4 分钟前
nginx_exporter:Prometheus 监控 Nginx 基础指标
运维·nginx·prometheus
山里幽默的程序员5 分钟前
DevOps 必备:盘点2026 年最强RESTful API 接口测试方案
运维·restful·devops·api开发·api开发工具
happymaker06267 分钟前
Linux常见命令总结
linux·运维·服务器
加农炮手Jinx9 分钟前
Flutter for OpenHarmony:pub_updater 命令行工具自动更新专家(DevOps 运维必备) 深度解析与鸿蒙适配指南
android·运维·网络·flutter·华为·harmonyos·devops
不念霉运10 分钟前
Gitee领跑2025中国DevOps市场:本土力量崛起
运维
无心水10 分钟前
【Hermes:团队、企业、生态与边界】47、Hermes 在 CI/CD 中的完整 DevOps 流水线:从 PR 审查到自动部署,让 Agent 接管你的发布流程
运维·人工智能·devops·openclaw·养龙虾·hermes·honcho
开源量化GO22 分钟前
期货 K 线算信号 tick 级止损:天勤双序列 wait_update 触发规则
linux·运维·服务器·python
m0_7381207224 分钟前
HVV应急溯源基础——Linux 系统安全加固配置指南(一)
linux·运维·服务器·安全·网络安全·系统安全
武子康28 分钟前
调查研究-167 Docker Compose 详解:从单容器到多服务编排的工程化入口
运维·docker·云原生·容器·kubernetes·k8s·docker-compose
旅僧1 小时前
Ubantu docker环境配置(前置)
运维·docker·容器