书接上回,
这次进行一些修改,实现
构建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处进行构建,若失败看日志
成功会出现


可以去https://github.com/sanopll/jenkins-maven
拉取代码用
- THE END -
最后修改:2026年10月3日
共有 0 条评论