Devops,自动构建maven代码推送到harbor镜像仓库并远程部署

2026-10-3 47 10/3

书接上回,

这次进行一些修改,实现

构建maven代码为镜像——>推送到harbor本地仓库——>部署机器拉取镜像并构建服务

 

配置准备(不会可以问ai辅助):

1.Jenkins容器配置宿主机的docker.sock,如果是run启动的需要重新删掉启动(记住先保存配置文件),建议用docker-compose启动jenkins,这里给一个简单的文件,有其它需求可以添加修改

version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - /data/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /etc/docker/daemon.json:/etc/docker/daemon.json

 

 

2.jenkins容器安装mvn,apt即可安装

 

3.首先创建一个自己的harbor仓库,并配置docker认证

这个可以自己看https://www.bilibili.com/video/BV16u4y1H7TV

创建一个脚本文件,我这里为deploy.sh,用于检测,构建镜像,放在/usr/bin目录下,当然其它地方也可以,只要方便执行(记得给权限)

horbor_addr=$1
horbor_repo=$2
project=$3
version=$4
port=$5

imageName=$horbor_addr/$horbor_repo/$project:$version

echo $imageName

containerId=`docker ps -a | grep ${project} | awk "{print $1}"`

echo $containerId 

if [ "$containerId" != "" ] ; then
   docker stop $containerId
   docker rm $containerId
fi

image_tag=`docker images | grep ${project} | awk "{print $2}"`

echo $image_tag

if [[ "$tag" =~ "$version" ]] ; then
   docker rmi -f $imageName
fi

docker login -u admin -p Harbor12345 $horbor_addr

docker pull $imageName

docker run -d -p $port:$port --name $project $imageName

echo "SUCCUSS"

 

4.  配置好后,回到maven代码文件目录,修改Jenkins文件,我这里使用ssh模拟远程不同机器操作,实际我是同一台机器

这是我的文件,记住按照你的方式修改

// =============================================================================
// 本地构建并推送 Harbor,再通过 SSH 调用远端全局部署脚本。
//
// 一次性前置条件:
//   Jenkins 执行环境需要 Maven、Docker CLI 和 Docker daemon 访问权限。
//   Harbor 使用 HTTP 时,Jenkins 使用的 Docker daemon 需将 Harbor 配置为
//   insecure registry(例如 192.168.128.41:80),然后重启 Docker。
//   HARBOR_PROJECT 指定的项目需已在 Harbor 中创建。
//   Jenkins 需配置 ID 为 k8s-master-ssh 的 SSH 私钥凭据,允许 root 无密码登录目标机。
// =============================================================================

def harborBuildPush() {
    sh '''
        set -eu
        curl -fsS -o /dev/null "http://${HARBOR_REGISTRY}/api/v2.0/ping"

        echo "-------- 开始输出 docker info --------"
        docker info 2>&1 | tee /tmp/dockerinfo.log || true
        echo "-------- 结束输出 docker info --------"

        grep -Fq "${HARBOR_REGISTRY}" /tmp/dockerinfo.log || {
            echo "Docker daemon 未将 ${HARBOR_REGISTRY} 配置为 insecure registry"
            exit 1
        }

        printf '%s' "$HARBOR_SECRET" |
            docker login "$HARBOR_REGISTRY" --username "$HARBOR_ACCOUNT" --password-stdin
        docker build --tag "$FULL_IMAGE" .
        docker push "$FULL_IMAGE"
        docker logout "$HARBOR_REGISTRY"
    '''
}

pipeline {
    agent any

    options {
        timestamps()
        timeout(time: 30, unit: 'MINUTES')
        disableConcurrentBuilds()
        buildDiscarder(logRotator(numToKeepStr: '20'))
    }

    environment {
        IMAGE_NAME = 'spring-boot-jenkins-devops'
        IMAGE_TAG  = 'v1.0.0'
        APP_PORT   = '8090'

        HOST       = '192.168.128.41'
        USER       = 'root'
        WORK_DIR   = '/home/sanopll/MLops/jenkins-file/work-jenkins'

        HARBOR_REGISTRY = '192.168.128.41:80'
        HARBOR_PROJECT  = 'devops'
        HARBOR_USER     = 'admin'
        HARBOR_PASSWORD = 'Harbor12345'
        HARBOR_CRED_ID  = ''

        HARBOR_IMAGE = "${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}"
        FULL_IMAGE   = "${HARBOR_IMAGE}:${IMAGE_TAG}"

        SSH_OPTS   = '-o StrictHostKeyChecking=no -o ConnectTimeout=10'
        SSH_TARGET = "${USER}@${HOST}"
    }

    stages {
        stage('检出代码') {
            steps {
                checkout scm
                sh 'git rev-parse --short HEAD'
                sh 'echo "当前 GIT_BRANCH=${GIT_BRANCH}"'
                sh 'git status -s'
            }
        }

        stage('本地构建并测试') {
            steps {
                sh 'mvn -B clean package'
            }
            post {
                always {
                    junit testResults: 'target/surefire-reports/*.xml', allowEmptyResults: true
                }
            }
        }

        stage('本地构建并推送 Harbor') {
            steps {
                script {
                    def credId = env.HARBOR_CRED_ID ? env.HARBOR_CRED_ID.trim() : ''
                    if (credId) {
                        withCredentials([usernamePassword(credentialsId: credId,
                                                          usernameVariable: 'HARBOR_ACCOUNT',
                                                          passwordVariable: 'HARBOR_SECRET')]) {
                            harborBuildPush()
                        }
                    } else {
                        echo '未配置 Jenkins Harbor 凭据,使用 Jenkinsfile 中的账号密码;建议改用 Jenkins 凭据。'
                        withEnv(["HARBOR_ACCOUNT=${env.HARBOR_USER}",
                                 "HARBOR_SECRET=${env.HARBOR_PASSWORD}"]) {
                            harborBuildPush()
                        }
                    }
                }
            }
        }

        stage('调用远端部署脚本') {
            steps {
                sshagent(credentials: ['k8s-master-ssh']) {
                    sh """
                        ssh ${SSH_OPTS} ${SSH_TARGET} 'cd ${WORK_DIR} && /usr/bin/deploy.sh ${HARBOR_REGISTRY} ${HARBOR_PROJECT} ${IMAGE_NAME} ${IMAGE_TAG} ${APP_PORT}'
                    """
                    sh """
                        ssh ${SSH_OPTS} ${SSH_TARGET} 'for i in \$(seq 1 30); do curl -fsS http://localhost:${APP_PORT}/actuator/health >/dev/null && exit 0; sleep 2; done; docker logs --tail 100 ${IMAGE_NAME}; exit 1'
                    """
                }
                sh "curl -fsS --connect-timeout 10 http://${HOST}:${APP_PORT}/api/hello"
            }
        }
    }

    post {
        success {
            echo "流水线成功"
            echo "镜像:${FULL_IMAGE}"
            echo "Harbor:http://${HARBOR_REGISTRY}/harbor/projects/${HARBOR_PROJECT}/repositories/${IMAGE_NAME}"
            echo "应用:http://${HOST}:${APP_PORT}"
        }
        failure {
            echo "流水线失败:请查看控制台日志 —— ${env.BUILD_URL}"
        }
        cleanup {
            cleanWs()
        }
    }
}

修改后,保存,推送

5.在Jenkins处进行构建,若失败看日志

成功会出现

Devops,自动构建maven代码推送到harbor镜像仓库并远程部署

Devops,自动构建maven代码推送到harbor镜像仓库并远程部署

 

可以去https://github.com/sanopll/jenkins-maven

拉取代码用

- THE END -

sanoplluser

10月03日14:42

最后修改:2026年10月3日
0

共有 0 条评论