使用Jenkins部署前端Vue项目和后端Java服务

Jenkins安装相关插件,供后续使用(Dashboard - Manage Jenkins - Plugins)

Maven Integration plugin  icon-default.png?t=N7T8https://plugins.jenkins.io/maven-plugin

CloudBees Docker Build and Publish pluginicon-default.png?t=N7T8https://plugins.jenkins.io/docker-build-publishNodeJS Pluginicon-default.png?t=N7T8https://plugins.jenkins.io/nodejs

配置内置的工具及其版本 (Dashboard - Manage Jenkins - Tools)​​​​​

比如 Maven JDK Git NodeJS Docker等

添加凭据,如SSH Private Key 用于拉取远程代码(Dashboard - Manage Jenkins - Credentials)​​​​​

一、基础版本

(1)Java项目

# Build

# Root POM
pom.xml

# Goals and options
clean package -U -Dmaven.test.skip=true

Post Steps - Execute shell 

#!/bin/bash
source /etc/profile

AppHome=/app/api/
AppName=api.jar
LogPath=logs/sys-info.log

echo "应用程序 $AppName 执行停止"

PID=""
query(){
	PID=`ps -ef | grep java | grep $AppName | grep -v grep | awk '{print $2}'`
}

query
if [ x"$PID" != x"" ]; then
	kill -TERM $PID
	
	while [ x"$PID" != x"" ]
	do
		echo "应用程序 $AppName (pid:$PID) 正在停止"
		sleep 1
		query
	done
	echo "应用程序 $AppName 停止成功"
else
	echo "应用程序 $AppName 已经停止"
fi


sleep 1


echo "应用程序 $AppName [test] 执行启动"

if [ ! -d $AppHome ]; then
	echo "创建目录 $AppHome"
	mkdir $AppHome
fi

if [ ! -d ${AppHome}logs ]; then
	echo "创建目录 ${AppHome}logs"
    mkdir ${AppHome}logs
    
    echo "创建文件 $AppHome$LogPath"
    touch $AppHome$LogPath
fi

mv $WORKSPACE/target/*.jar $AppHome$AppName

echo "正在启动"
if [ -f $AppHome$AppName ]; then 
	BUILD_ID=KeepAlive
	nohup java -jar $AppHome$AppName --spring.profiles.active=prod --server.port=$port > /dev/null 2>&1 &

	sleep 5
    tail -50 $AppHome$LogPath
    
    sleep 5
    tail -50 $AppHome$LogPath
    
    sleep 5
    tail -50 $AppHome$LogPath
else
	echo "应用程序 $AppName 启动失败:文件不存在"
fi

(2)Vue项目

Post Steps - Execute shell  

#!/bin/bash
source /etc/profile

AppHome=/app/ui/

echo "开始重新打包"
npm install

echo "清理工作区缓存"
rm -rf $WORKSPACE/dist/*

echo "开始打包:prod"
npm run build:prod

echo "删除上次复制的文件"
rm -rf $AppHome

if [ ! -d $AppHome ]; then
	echo "创建目录 $AppHome"
	mkdir $AppHome
fi

echo "开始重新复制"
cp -rf $WORKSPACE/dist/* $AppHome 

echo "部署成功"

 二、使用Docker + Pipline

Dockerfile参考上文。

(1)Java项目

流水线 Pipeline script

pipeline {
    agent any
    
    environment {
        // 在 Jenkins 全局工具配置中定义的插件安装的名称
        MAVEN_HOME = tool 'maven3.8.7'
        PATH="${MAVEN_HOME}/bin:${env.PATH}"
        GIT_SSH_COMMAND = 'ssh -i /var/lib/jenkins/.ssh/id_rsa'
    }
    
    stages {
        stage('MAVEN Versions') {
            steps {
                echo 'MAVEN version:'
                sh 'mvn -v'
            }
        }

        stage('Clone Repository') {
            steps {
                script {
                    // 使用指定的私钥克隆仓库并切换到分支
                    checkout([$class: 'GitSCM', branches: [[name: 'pc']], userRemoteConfigs: [[credentialsId: 'f2564736-xxxx-xx-xx', url: 'git@xxxxxx.git']]])
                }
            }
        }
        
        stage('Build War') {
            steps {
                sh 'mvn clean package -U -Dmaven.test.skip=true'
            }
        }

        stage('Docker Build and Deploy') {
            steps {
                script {
                    def imageName = 'api'
                    def ctName = 'api-ct'
                    
                    // Stop and remove the previous container
                    sh "docker stop ${ctName} || true"
                    sh "docker rm ${ctName} || true"
                    sh "docker rmi ${imageName} || true"

                    // Build Docker image
                    sh "docker build -f Dockerfile -t ${imageName} ."

                    // Start a new container
                    sh "docker run --restart always -d -p 9008:9008 -e ACTIVE_PROFILE='pc' -e SERVICE_PORT='9008' --name $ctName --ulimit nofile=1024 --network host $imageName"
                }
            }
        }    
    }

    post {
        success {
            echo 'Deployment successful!'
        }
        failure {
            echo 'Deployment failed!'
        }
    }
}

(2)Vue项目

流水线 Pipeline script

pipeline {
    agent any
    
    environment {
        // 在 Jenkins 全局工具配置中定义的 Node.js 安装的名称
        NODEJS_HOME = tool 'node16.3.0'
        PATH="${NODEJS_HOME}/bin:${env.PATH}"
        GIT_SSH_COMMAND = 'ssh -i /var/lib/jenkins/.ssh/id_rsa'
    }
    
    stages {
        stage('Set npm Registry') {
            steps {
                script {
                    sh 'npm config set registry https://registry.npmmirror.com'
                    sh 'npm config get registry'
                }
            }
        }
        stage('Node and NPM Versions') {
            steps {
                echo 'Node version:'
                sh 'node -v'
                
                echo 'NPM version:'
                sh 'npm -v'
            }
        }

        stage('Clone Repository') {
            steps {
                script {
                    // 使用指定的私钥克隆仓库并切换到 pc 分支
                    checkout([$class: 'GitSCM', branches: [[name: 'pc']], userRemoteConfigs: [[credentialsId: 'f2564736-xx-x-xx-xxx', url: 'git@xxxxx.git']]])
                }
            }
        }
        
        stage('Install Dependencies') {
            steps {
                sh 'npm install --verbose --legacy-peer-deps'
            }
        }

        stage('Build') {
            steps {
                sh 'npm run build:hylt-pc'
            }
        }

        stage('Docker Build and Deploy') {
            steps {
                script {
                    def imageName = 'ui'
                    def ctName = 'ui-ct'
                    
                    // Stop and remove the previous container
                    sh "docker stop ${ctName} || true"
                    sh "docker rm ${ctName} || true"
                    sh "docker rmi ${imageName} || true"

                    // Build Docker image
                    sh "docker build -f Dockerfile -t ${imageName} ."

                    // Start a new container
                    sh "docker run --restart always -d -p 1908:1908 --name ${ctName} --network host ${imageName}"
                }
            }
        }    
    }

    post {
        success {
            echo 'Deployment successful!'
        }
        failure {
            echo 'Deployment failed!'
        }
    }
}

注意此处使用的jenkins内置的nodejs和npm,Vue项目在部署过程中使用到了项目根目录下的Dockerfile和nginx.conf两个文件

 

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值