Jenkins 流水线配置

发布于:2025-07-10 ⋅ 阅读:(29) ⋅ 点赞:(0)

 Jenkinsfile dsl文件:

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}"]
            )

        }
	}

}

目标服务器部署脚本:

 

[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


网站公告

今日签到

点亮在社区的每一天
去签到