Jenkins部署Java(maven)项目&Vue前端项目部署流水线pipeline模版-可直接使用Jenkinsfile

文章详细描述了如何使用Jenkins编写的自动化流水线脚本,包括前端Vue项目的构建、部署到远程服务器以及后端Java项目的打包、部署,并涉及SSH连接和Git版本控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流水线已经编写完毕,修改流水线中参数,即可使用
tips:注意Jenkins中是否给机器配置了路径前缀,本文均没有配置, 使用绝对路径

前端VUE部署模版

#!groovy
pipeline{
    agent any
        environment {
    //        环境标识 无其他用处,作为标识
            ENV_NAME = "dev"
			
    //        服务器标识  Jenkins设置中服务器标识
            SERVER_CONFIG_NAME = "DevComputer"
			
    //        远程项目地址  Vue项目远程地址
            SERVER_REMOTE_PROJECT_NAME = "/usr/project/vueProject/"
			
    //   	GIT远程分支名称 
            GIT_BRANCH_NAME = "dev"
			
	//      GIT 远程仓库地址  
			GIT_SERVER_ADDRESS="http://vueProject.git"
			
	//      package.json的相对位置,若在根目录,则为 ./, 若在根目录下ui目录下,则值为ui
			BUILD_ADDRESS="./"
			
	//      具体打包命令 也可用npm install && npm build:dev
	        BUILD_COMMAND="yarn&&yarn build:dev"	
			
	//		打包完后dist最终存放位置,如果为根目录,则值为"dist/**", 如果为ui目录下,则值为"ui/dist/**"
			OUTPUT_ADDRESS="dist/**"
			
	// 		是否需要去除dist目录前缀,想要最终目录只有一层dist目录, 如果在根目录下,则值为"/",如果dist在ui目录下,则值为"ui/"
			REMOVE_PREFIX="/"
			

        }
    stages{
        stage('build'){
            steps{
            echo '---------------------------------拉取代码开始---------------------------------------'
git branch: "${env.GIT_BRANCH_NAME}", credentialsId: '输入Jenkins中配置的git账号ID', url: "${env.GIT_SERVER_ADDRESS}"
            echo '---------------------------------拉取代码结束---------------------------------------'


            echo '---------------------------------代码构建开始---------------------------------------'
sh """
cd ${env.BUILD_ADDRESS}
${env.BUILD_COMMAND}
"""
            echo '---------------------------------代码构建结束---------------------------------------'

            }
        }

        stage('deploy'){
            steps{
            echo '---------------------------------代码部署开始---------------------------------------'
sshPublisher(publishers: [sshPublisherDesc(configName: "${env.SERVER_CONFIG_NAME}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 1200000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "${env.SERVER_REMOTE_PROJECT_NAME}", remoteDirectorySDF: false, removePrefix: "${env.REMOVE_PREFIX}", sourceFiles: "${env.OUTPUT_ADDRESS}")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
            echo '---------------------------------代码部署结束---------------------------------------'
            }
        }
    }
    post{
        always{
            echo 'over'
        }
        cleanup{
            echo '----------即将清理工作空间```````'
            cleanWs()
            echo '----------清理工作空间完成```````'
        }
    }
}

后端Java部署模版

pipeline {
    agent any
    environment {
	//        环境标识
			ENV_NAME = "dev"
	//       Jenkins中 服务器标识
			SERVER_CONFIG_NAME = "DevComputer"
	//        远程Java项目地址
			SERVER_REMOTE_PROJECT_NAME = "/usr/jar/new-project"
	//        GIT远程分支名称
			GIT_BRANCH_NAME = "dev"
				
	//      GIT 远程仓库地址
			GIT_SERVER_ADDRESS="http://javaProject.git"

			
	//      pom.xml的相对位置,若在根目录,则为 ./, 若在根目录下xxx目录下,则值为xxx
			BUILD_ADDRESS="./"
			
	//      具体打包命令 多进程并发跳过测试  快速打包
	        BUILD_COMMAND="mvn clean package -D maven.test.skip=true -P test -T 1C"	
			
	//		jar最终存放位置,根据需要填"
			OUTPUT_ADDRESS="target/*.jar"

	
			
	// 	    源代码中sh目录位置
			SHELL_ADDRESS="script/bin/deploy.sh"
	//      shell参数,如果有则填入,无则空
			SHELL_CUSTOM_COMMAND=""
			
    }
    stages {
        stage('build') {
            steps {
            echo '---------------------------------拉取代码开始---------------------------------------'
            git branch: "${env.GIT_BRANCH_NAME}", credentialsId: 'Jenkins git账号ID', url: "${env.GIT_SERVER_ADDRESS}"
            echo '---------------------------------拉取代码结束---------------------------------------'

            echo '---------------------------------代码打包开始---------------------------------------'
            sh """
			cd ${env.BUILD_ADDRESS}
			${env.BUILD_COMMAND} """
            echo '---------------------------------拉取打包结束---------------------------------------'
            }
       }

        stage('deploy') {
            steps {
            echo '---------------------------------代码发布启动开始---------------------------------------'
    sshPublisher(publishers: [sshPublisherDesc(configName: "${env.SERVER_CONFIG_NAME}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """cd ${env.SERVER_REMOTE_PROJECT_NAME}	
""", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "${env.SERVER_REMOTE_PROJECT_NAME}", remoteDirectorySDF: false, removePrefix: '', sourceFiles:"${env.OUTPUT_ADDRESS}")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])


            echo '---------------------------------代码发布并启动结束---------------------------------------'
            sshPublisher(publishers: [sshPublisherDesc(configName: "${env.SERVER_CONFIG_NAME}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """cd ${env.SERVER_REMOTE_PROJECT_NAME}
BUILD_ID=dontKillMe

sh ${env.SERVER_REMOTE_PROJECT_NAME}/${env.SHELL_ADDRESS} ${env.SHELL_CUSTOM_COMMAND}
""", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "${env.SERVER_REMOTE_PROJECT_NAME}", remoteDirectorySDF: false, removePrefix: '', sourceFiles: "${env.SHELL_ADDRESS}")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
   
            }
        }

    }
    post{
        always{
            echo 'over'
        }
        cleanup{
            echo '----------即将清理工作空间```````'
            cleanWs()
            echo '----------清理工作空间完成```````'
        }
    }
}

后端Jar包重启脚本

#!/bin/bash

# 系统时间
DATE=$(date +'%Y-%m-%d-%H:%M:%S')
#启动时间
START_TIME=$(date +%s)
#当前shell目录
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"


export JAVA_HOME PATH CLASSPAT


# 输入要启动jar包的绝对路径,如果要重启多个,则写多个
ARRAY_JAR_FILE=(
  "/usr/jar/Javaname-cloud.jar"
)
# 停止某个jar包,
# 参数为 jar名称
function stopJar() {
  local JAR_FILE=$1

  # 使用 pgrep 更精确地匹配获取 PID
  PID=$(pgrep -f "$JAR_FILE.jar")

  if [ -z "$PID" ]; then
    echo "$DATE - 未找到 $JAR_FILE.jar 的进程"
    return 0
  fi

  # 最大尝试次数
  MAX_TRIES=30
  TRIES=0

  while ((TRIES < MAX_TRIES)); do
    kill -9 "$PID"
    # 显示进度或在检查之前暂停一段时间
    sleep 1

    if ps -p "$PID" > /dev/null; then
      ((TRIES++))
      echo "$DATE - 尝试 $TRIES: 进程 $PID ($JAR_FILE) 仍在运行,正在尝试再次终止..."
    else
      echo "$DATE - 进程 $PID ($JAR_FILE) 已成功终止。"
      return 0
    fi
  done

  echo "$DATE - 已达到最大尝试次数 ($MAX_TRIES)。进程 $PID ($JAR_FILE) 仍在运行。错误!!!"
  return 0
}


# 启动Jar包的脚本
# 入参为  jar目录, jar包名称


function startJar() {
  local JAR_PATH=$1
  local JAR_FILE=$2
  cd $1
  # 启动 jar 包
  nohup java -Xms256m -Xmx1024m -jar "$JAR_FILE.jar" >start.log 2>&1 &
  PID=$!

  echo "正在启动 $JAR_FILE.jar ..."
  sleep 1
  echo "进程号为 $PID"
  sleep 1
  echo "$JAR_FILE.jar 启动成功!"
}


# 依次停止全部
for JAR in ${ARRAY_JAR_FILE[@]}; do
  JAR_DIR=$(dirname $JAR)
  JAR_MAIN_NAME=$(basename $JAR .jar)
  echo "即将停止$JAR_MAIN_NAME程序包"
  stopJar $JAR_MAIN_NAME
  echo "程序包$JAR_MAIN_NAME进程结束"
done



# 依次启动全部
for JAR in ${ARRAY_JAR_FILE[@]}; do
  JAR_DIR=$(dirname $JAR)
  JAR_MAIN_NAME=$(basename $JAR .jar)
  echo "即将重新启动$JAR_MAIN_NAME程序包"
  startJar $JAR_DIR $JAR_MAIN_NAME

done


END_TIME=$(date +%s)
EXECUTING_TIME=$(expr $END_TIME - $START_TIME)

echo "本次重启总共用时为$EXECUTING_TIME秒"
### Gitee CI/CD Pipeline for Vue Project Deployment #### 配置 `.gitlab-ci.yml` 文件实现自动化部署 对于在Gitee上的Vue项目,配置CI/CD流水线的关键在于编写`.gitlab-ci.yml`文件。此文件定义了不同阶段的任务,包括构建、测试以及最终的部署操作[^1]。 ```yaml image: node:lts stages: - build - deploy cache: paths: - node_modules/ build_vue_project: stage: build script: - npm install - npm run build artifacts: paths: - dist/ deploy_to_production: stage: deploy only: - master script: - echo "Deploying to production..." - 'curl -H "Authorization: Bearer $TOKEN" -F file=@dist/index.html https://your-server.com/upload' ``` 上述脚本展示了如何通过NPM安装依赖并打包Vue应用,在成功完成后会触发部署动作。这里假设有一个API端点用于上传编译后的HTML文件作为示例[^4]。 #### 使用 Jenkins-Pipeline 自动化部署至 Kubernetes (K8S) 另一种方法是借助Jenkins管道工具配合Docker镜像完成更复杂的场景——比如将应用程序容器化并通过Kubernetes集群管理服务实例。为此需准备一个适合前端应用的基础NGINX Dockerfile: ```dockerfile FROM nginx RUN rm -rf /usr/share/nginx/html/* COPY ./dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` 接着可以在Jenkins中创建一个多分支Pipeline工程,并指定其读取位于仓库根目录下的`Jenkinsfile`来进行持续集成工作流控制[^5]。 #### 构建多层架构优化性能 考虑到生产环境中的效率问题,可以采用分层方式制作Docker镜像以减少体积和加速传输速度。下面是一个针对Java项目的例子,虽然适用于不同的编程语言和技术栈,但概念相同:先在一个临时环境中编译源码生成可执行包;再切换到精简版运行时映像里加载该二进制文件[^3]。 ```dockerfile # Build Stage FROM maven AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests # Final Stage FROM openjdk:alpine WORKDIR /app COPY --from=builder /app/target/*.jar app.jar ENTRYPOINT ["java","-jar","/app/app.jar"] ``` 尽管这段代码片段主要面向后端开发人员,但对于任何类型的Web应用来说都是有价值的实践指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

renzhiguo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值