Jenkins 流水线配置

Jenkinsfile dsl文件:

Groovy 复制代码
pipeline {

	// 指定任务在哪个集群节点执行
	agent any

	// 声明全局变量
	environment {
		key='value'
		APPLICATION_NAME='springboot-demo'   // 项目名称
        HOST_PORT='7777'                     // 宿主机暴露服务端口
        CONTAINER_PORT='8080'                // 容器内部服务端口
        TOKEN='squ_9aa459d05021a8db7f95e9f0ea9ac9b00d8bdbfb'
        HARBOR_REPO='repo'

		HARBOR_ADDR='192.168.208.120:80'
		SONAR_ADDR='192.168.208.151:9000'

        JAVA_HOME='/usr/local/share/jdk-1.8.0'
        MAVEN_HOME='/usr/local/share/maven-3.9.6'
	}

	// 流水执行工序,每道工序又有多个小步骤
	stages {
		stage('git拉取代码'){
			steps{
			    echo '=====================>  Git pulling code '
			    checkout scmGit(branches: [[name: '${branch_tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'de069ab5-cfa3-490f-9add-a1f79f641cc5', url: 'http://192.168.208.141/root/gitlab-project.git']])

			}

		}

		// ====================== 192.168.208.151 服务器上运行 ========================
		stage('maven编译打包'){
			steps{
			    echo '=====================>  Maven building code'
			    sh '''
                export PATH=${JAVA_HOME}/bin:${MAVEN_HOME}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

                # 当前目录是/var/lib/jenkins/workspace/<jenkins任务名称>  (pipeline)
                cd ${APPLICATION_NAME}/
                mvn clean package -Dmaven.test.skip=true

                '''
			}

		}

		// ====================== 192.168.208.151 服务器上运行 ========================
		stage('sonar代码质检'){
			steps{
			    echo '=====================>  Sonar starting scan'
                sh '''
                   /usr/local/share/sonar-scanner-cli-7.1.0/bin/sonar-scanner \\
                  -Dsonar.projectName=pipeline \\
                  -Dsonar.projectKey=pipeline \\
                  -Dsonar.sources=/var/lib/jenkins/workspace/pipeline/${APPLICATION_NAME}/target \\
                  -Dsonar.host.url=http://${SONAR_ADDR} \\
                  -Dsonar.login=${TOKEN}
                '''
			}

		}

		// ====================== 192.168.208.151 服务器上运行 ========================
		stage('docker构建镜像'){
			steps{
			    echo '=====================>  Docker building image'
			    sh '''
                    # 镜像名称
                    applicationName="${APPLICATION_NAME}"

                    # 进入目录docker找到 Dockerfile文件
                    cd ${APPLICATION_NAME}/docker/

                    # 将jar包挪到docker目录下
                    mv ../target/*.jar ./

                    # 构建docker镜像
                    docker build -t ${APPLICATION_NAME}:${branch_tag} .

                    # 删除本地的悬空的镜像
                    docker image prune -f

                '''
			}

		}

		stage('harbor制品入库'){
			steps{
			    echo '=====================>  Docker push artifact to harbor'
			    sh '''
                    # 登录Harbor镜像仓库
                    docker login -u admin -p 123456 ${HARBOR_ADDR}

                    # 对构建好镜像进行打标签
                    docker tag ${APPLICATION_NAME}:${branch_tag} ${HARBOR_ADDR}/repo/${APPLICATION_NAME}:${branch_tag}

                    # 删除本地的悬空的镜像
                    docker image prune -f

                    # 推送Harbor镜像仓库
                    docker push ${HARBOR_ADDR}/repo/${APPLICATION_NAME}:${branch_tag}

                    # Harbor有自己的定时清理任务,清理无tag任务

			    '''
			}

		}

		stage('SSH-publisher通知部署'){
			steps{
			    echo '=====================>  SSH-publisher starting deploy'
			    echo "HARBOR_ADDR = ${HARBOR_ADDR}"
                echo "HARBOR_REPO = ${HARBOR_REPO}"
                echo "APPLICATION_NAME = ${APPLICATION_NAME}"
                echo "branch_tag = ${branch_tag}"
                echo "HOST_PORT = ${HOST_PORT}"
                echo "CONTAINER_PORT = ${CONTAINER_PORT}"

                // 注意! 这里的 execCommand 后面要使用""" 而不是 '''
                sshPublisher(publishers: [sshPublisherDesc(configName: 'app-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """
                /usr/bin/deploy.sh ${HARBOR_ADDR} ${HARBOR_REPO} ${APPLICATION_NAME} ${branch_tag} ${HOST_PORT} ${CONTAINER_PORT}""", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
			}
		}


	}

    // 调用钉钉的 webhook 接口将部署信息发布到工作群
	post {
        success {
            dingtalk(
                robot: 'Jenkins-dd',
                type: 'MARKDOWN',
                title: "success: ${APPLICATION_NAME}",
                text: ["- 构建成功: ${APPLICATION_NAME} \n- 版本: ${branch_tag} \n- 持续时间: ${currentBuild.durationString}"]
            )

        }

        failure {
            dingtalk(
                robot: 'Jenkins-dd',
                type: 'MARKDOWN',
                title: "success: ${APPLICATION_NAME}",
                text: ["- 构建失败: ${APPLICATION_NAME} \n- 版本: ${branch_tag} \n- 持续时间: ${currentBuild.durationString}"]
            )

        }
	}

}

目标服务器部署脚本:

bash 复制代码
[root@localhost ~]# cat deploy.sh
#!/bin/bash

# ===============================================================================
# Author: ldj
# Date: 2025-07-08 15:37:11
# Description: 首先删除旧的容器和镜像,然后登录到 Harbor 并拉取最新的镜像进行部署
# ===============================================================================

# 显示每条命令执行情况,便于调试
set -x

harbor_addr=$1
harbor_repo=$2
project_name=$3
version=$4
host_port=$5
container_port=$6

image_name=${harbor_addr}/${harbor_repo}/${project_name}:${version}

echo "镜像名称:${image_name}"

# 删除旧容器
container_id=$(docker ps -aq --filter name=${project_name})
if [ -n "${container_id}" ]; then
    docker stop ${container_id}
    docker rm ${container_id}
    echo "已停止并删除容器: ${container_id}"
fi

# 删除本地旧镜像
old_version=$(docker images | grep ${project_name} | awk '{print $2}')

if [ "${old_version}" == "${version}" ]; then
    docker rmi -f ${old_images}
    echo "已删除本地旧镜像"
fi

# 登录Harbor
docker login -u admin -p 123456 ${harbor_addr} || { echo '登录Harbor失败'; exit 1; }

# 拉取新镜像
echo "开始拉取新镜像"
docker pull ${image_name} || { echo "拉取新镜像失败"; exit 1; }

# 运行新容器
docker run -d -p ${host_port}:${container_port} --name ${project_name} ${image_name}

echo ${project_name} '成功运行!'

# 删除悬空镜像
docker image prune -f
相关推荐
乘云数字DATABUFF4 小时前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--2 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森2 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜3 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB4 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode5 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220706 天前
如何搭建本地yum源(上)
运维
大树889 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠9 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质9 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务