Jenkins 流水线配置

 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 -xharbor_addr=$1
harbor_repo=$2
project_name=$3
version=$4
host_port=$5
container_port=$6image_name=${harbor_addr}/${harbor_repo}/${project_name}:${version}echo "镜像名称:${image_name}"# 删除旧容器
container_id=$(docker ps -aq --filter name=${project_name})
if [ -n "${container_id}" ]; thendocker 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}" ]; thendocker 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88286.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器重装后如何“复活”旧硬盘上的 Anaconda 环境?—— 一次完整的排错与恢复记录

目录 摘要 一、 背景&#xff1a;熟悉的陌生人 二、 问题浮现&#xff1a;一次次失败的尝试 问题一&#xff1a;source activate 失效&#xff0c;被写死的旧路径 问题二&#xff1a;官方安装器修复失败&#xff0c;神秘的“进程池损坏” 问题三&#xff1a;核心脚本也“背…

Redis的多并发实际业务场景下的使用分析:布隆过滤器

文章目录前言什么是布隆过滤器项目中引入布隆过滤器与缓存结合的最佳实践场景&#xff1a;高并发用户访问商品详情页&#xff08;防止缓存穿透&#xff09;总结&#xff1a;前言 okok 我们已经学完了 所有的redis中的常用的数据结构 下面就是进阶 我会用一系列的例子 去讲解 如…

【AI】人工智能领域关键术语全解析

一、前言 人工智能&#xff08;AI&#xff09;作为当今最热门的技术领域之一&#xff0c;正在深刻改变着我们的生活和工作方式。然而&#xff0c;对于初学者或非技术背景的人士来说&#xff0c;理解AI领域的专业术语可能是一项挑战。本文旨在全面解析人工智能领域的关键术语&a…

【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed

在Linux系统中&#xff0c;正则表达式是一种强大的文本处理工具&#xff0c;广泛用于文本搜索、替换和批量处理。通过掌握基础正则表达式的语法&#xff0c;结合grep和sed命令&#xff0c;用户可以高效地完成复杂的文本处理任务。无论是数据分析师、软件开发者还是系统管理员&a…

SIMATIC S7-1200的以太网通信能力:协议与资源详细解析

SIMATIC S7-1200的以太网通信能力&#xff1a;协议与资源解析 在工业自动化领域&#xff0c;PLC的通信能力往往直接影响着整个控制系统的灵活性与高效性。西门子SIMATIC S7-1200系列PLC作为一款广泛应用的中小型控制器&#xff0c;其强大的以太网通信功能是其核心优势之一。本文…

什么是高防 IP?从技术原理到实战部署的深度解析

目录 前言 一、高防 IP 的定义与核心价值 二、高防 IP 的技术原理与架构 2.1 流量牵引技术 2.2 流量清洗引擎 2.3 回源机制 三、高防 IP 的核心防护技术详解 3.1 DDoS 攻击防御技术 3.2 高防 IP 的弹性带宽设计 四、实战&#xff1a;基于 Linux 的高防 IP 环境配置 …

NW710NW713美光固态闪存NW719NW720

美光NW系列固态闪存深度解析&#xff1a;技术、性能与市场洞察一、技术架构与核心创新美光NW系列固态闪存&#xff08;包括NW710、NW713、NW719、NW720&#xff09;的技术根基源于其先进的G9 NAND架构。该架构通过5纳米制程工艺和多层3D堆叠技术&#xff0c;在单位面积内实现了…

JVM汇总

1.什么是JVM&#xff1f;Java虚拟机&#xff0c;Java具有自动内存管理等一系列特性&#xff0c;为实现Java跨平台&#xff0c;一次编译处处执行。2.JVM结构图3.类加载器-入口加载class文件&#xff0c;将类信息存放到运行时数据区的方法区内存空间中通过魔数和文件格式来判断是…

2024.09.20 leetcode刷题记录

# 前言 昨天发布了第一遍博客&#xff0c;感觉很好&#xff0c;趁着我现在还是很感兴趣就多发几遍&#xff0c;希望能坚持下去&#xff0c;在这里记录下自己学习成长的经历。 今天是周五&#xff0c;下周一就又要去实习啦&#xff0c;距离上一段实习刚结束一个月&#xff0c;之…

SQLite3 中列(变量)的特殊属性

在 SQLite3 中&#xff0c;列的特殊属性通常通过约束&#xff08;Constraints&#xff09;和数据类型修饰符来定义。这些属性可以在创建表时指定&#xff0c;用于限制数据的完整性或定义特殊行为。以下是 SQLite3 支持的主要特殊属性及其说明&#xff1a; 1. 主键约束&#xff…

Datawhale AI 夏令营:用户洞察挑战赛 Notebook(2)

针对文本聚类优化 优化TF-IDF特征工程# 调整ngram_range&#xff1a;设置为(1, 2)&#xff0c;捕捉单字和双字词&#xff08;如“不错”“不满意”&#xff09;。 # 限制特征数量&#xff1a;通过max_features5000保留高信息密度特征&#xff0c;降低维度。 # 过滤低频/高频词&…

【博主亲测可用】PS2025最新版:Adobe Photoshop 2025 v26.8.1 激活版(附安装教程)

软件简介 Adobe Photoshop 2025是Adobe公司开发的一款图像处理软件。作为行业标准的数字图像编辑工具&#xff0c;其核心定位是创意设计、后期摄影、3D建模和AI驱动创作&#xff0c;适用于专业设计师、摄影师、插画家和多媒体创作者。界面设计简单直观&#xff0c;易于操作&…

unity A星寻路

算法 fCost gCost hCost gCost 是当前节点到移动起始点的消耗&#xff0c;hCost是当前节点到终点的消耗 网格为变成为1的矩形&#xff0c;左右相邻的两个网格直接的gCost为1&#xff0c;斜对角相邻的两个网格的gCost为1.4 hCost 当前网格到终点网格的 水平距离 垂直距离 比如…

十一 Javascript的按值传递

你将知道&#xff1a;“传递” 值是什么意思什么是按值传递传递物品JavaScript 中没有传递引用&#xff01;介绍当需要在 JavaScript 中分配或简单地将一个值传递给其他标识符时&#xff0c;我们就会看到通常所说的 按值传递 。严格来说&#xff0c;JavaScript 中传递值的方式只…

SpringBoot ThreadLocal 全局动态变量设置

需求说明&#xff1a; 现有一个游戏后台管理系统&#xff0c;该系统可管理多个大区的数据&#xff0c;但是需要使用大区id实现数据隔离&#xff0c;并且提供了大区选择功能&#xff0c;先择大区后展示对应的数据。需要实现一下几点&#xff1a; 1.前端请求时&#xff0c;area_i…

如何解决pip安装报错ModuleNotFoundError: No module named ‘logging’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘logging’问题 摘要&#xff1a; 在使用 PyCharm 2025 控制台通过 pip install 安装第三方库时&#xff0c;常会遇到诸如 ModuleNotFoundError: No module name…

打破技术债困境:从“保持现状”到成为变革的推动者

相信许多在科技行业的同行都面临过类似的挑战&#xff1a;明知系统存在“技术债”&#xff0c;却因为沟通成本、团队压力和短期KPI等原因&#xff0c;难以推动改进&#xff0c;最终陷入“想做却不敢做”的矛盾心态。这不仅影响个人心情&#xff0c;更重要的是&#xff0c;它像一…

Spring Boot 整合 RabbitMQ

Spring Boot 整合 RabbitMQ 一、概述&#xff1a;RabbitMQ 是什么&#xff1f; 你可以把 RabbitMQ 想象成一个「快递中转站」。 比如你在网上买了一本书&#xff0c;卖家&#xff08;生产者&#xff09;把包裹&#xff08;消息&#xff09;交给快递站&#xff08;RabbitMQ&…

Unity Demo-3DFarm详解-其一

我们来拆解一个种田游戏&#xff0c;这个游戏种类内部的功能还是比较模板化的&#xff0c;我们来一点点说。我们大体上分为这么几个部分&#xff1a;农场运营玩法角色与玩家互动物品与背包存档和进度管理用户界面系统农场运营可以大体上分为&#xff1a;种植系统&#xff1a;支…

esp8266驱动下载

问题描述&#xff1a;esp8266插上电脑&#xff0c;设备管理器无法识别&#xff0c;显示为USB serial&#xff08;黄色感叹号&#xff09; 首先确认你的esp8266是不是 CH340 系列的 USB 转串口芯片 CH340驱动下载地址