Centos7上Jenkins+Docker+Git+SpringBoot自动化部署

文章目录

    • 1.宿主机安装maven
    • 2.安装jenkins
    • 3.配置Jenkins
    • 4.Jenkins脚本
    • 自动安装JDK(可选)

1.宿主机安装maven

wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz
mv apache-maven-3.9.9-bin.tar.gz /usr/local
tar -xzf apache-maven-3.9.9-bin.tar.gz

下载地址:https://maven.apache.org/download.cgi

配置环境变量vi /etc/profile

# 在文件末尾添加如下信息
export MAVEN_HOME=/usr/local/apache-maven-3.9.9
export PATH=${PATH}:${MAVEN_HOME}/bin

重启环境变量

# 重启环境变量,使之生效
source /etc/profile

执行以下命令检查 Maven 是否安装成功

mvn -v

配置 Maven本地仓库

# 新建本地仓库目录
cd /usr/local/apache-maven-3.9.9
mkdir repository
# 编辑 settings.xml 文件
vi /usr/local/apache-maven-3.9.9/conf/settings.xml
# 找到 <localRepository> 标签,取消注释并设置路径:
<localRepository>/usr/local/apache-maven-3.9.9/repository</localRepository>

2.安装jenkins

创建目录

# 创建Jenkins目录文件夹
mkdir -p /var/jenkins_home
# 设置权限
chmod 777 -R /var/jenkins_home

运行命令

docker run -d \
  -p 8080:8080 -p 50000:50000 \
  -v /var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(which docker):/usr/bin/docker \
  -v /usr/local/apache-maven-3.9.9:/usr/local/apache-maven-3.9.9 \
  -v /usr/local/apache-maven-3.9.9/repository:/usr/local/apache-maven-3.9.9/repository \
  -v /etc/localtime:/etc/localtime \
  -u root \
  --name jenkins \
  jenkins/jenkins:2.440.1-jdk17

解释:

  • -p 8080:8080: 映射 Jenkins 的 Web 服务端口到宿主机。
  • -p 50000:50000: 映射 Jenkins 的代理连接端口。
  • -v /var/jenkins_home:/var/jenkins_home: 映射 Jenkins 的工作目录,持久化数据。
  • -v /var/run/docker.sock:/var/run/docker.sock: 映射宿主机的 Docker 套接字,允许容器内使用 Docker。
  • -v $(which docker):/usr/bin/docker
    • 将宿主机上的 Docker CLI(二进制文件路径,通过 $(which docker) 动态获取)挂载到容器内的 /usr/bin/docker
    • 容器内的 Jenkins 可以直接调用宿主机的 Docker CLI。
  • 挂载 Maven和本地仓库
  • -v /etc/localtime:/etc/localtime: 将宿主机的本地时间挂载到容器内,确保容器内的时间与宿主机一致。
  • -u root:
    • 指定容器内以 root 用户运行。
    • Jenkins 默认以 jenkins 用户运行,但在某些情况下(如访问宿主机的 Docker),需要更高权限。

进入容器并验证Docker命令

docker exec -it jenkins bash
docker ps

3.配置Jenkins

获取初始密码

docker logs jenkins

复制日志中的密码,然后访问 Jenkins Web 界面:

  • 地址:http://localhost:8080

配置 Jenkins

  • 登录 Jenkins。

  • 按照提示安装推荐插件。

  • Maven配置

  • JDK配置

    http://localhost:8080/manage/configureTools/

1.顶部的Maven,我们选择文件系统中的setting文件

2.Maven节点,点击新增Maven,起一个名字,然后指定maven路径,去掉自动安装的选项,然后应用>保存

4.Jenkins脚本

新建任务 ->选择流水线

pipeline {
    agent any
    environment {
        // 环境变量,可以方便管理
        imageBaseName = "laker-test"
        timestamp = new Date().format("yyyyMMddHHmmss")
        // laker-test:20241210092411
        imageName = "${imageBaseName}:${timestamp}"
        healthCheckUrl = "http://10.2.2.2:8089/actuator/health"
        dbUser = 'root'
        dbPassword = '123456'
        dbUrl = 'jdbc:mysql://10.2.2.2:3306/easy-admin?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true'
    }
    tools {
        // 指定在 Jenkins 上配置的 Maven 工具名
        maven 'Maven-3.9.9' // Maven 配置名称,根据你在 Jenkins 配置中定义的工具名来调整
    }
    stages {
        stage('Checkout') {
            steps {
                // 从Gitee仓库获取代码   git 'https://gitee.com/lakernote/easy-admin.git'  
                git branch: 'springboot3', url: 'https://gitee.com/lakernote/easy-admin.git'
              
            }
        }
        
       stage('Build') {
           steps {
                // 输出环境变量供调试使用
                sh 'echo $MAVEN_HOME'
                sh 'echo $PATH'
                sh "java -version"
      			// 使用 Maven 构建项目
                sh 'mvn clean package -DskipTests' // 跳过测试,加速构建
            }        
        }
        
         stage('Build Docker Image') {
            steps {
                // 构建 Docker 镜像
                script {
                    sh "docker build -t ${imageName} ."
                }
            }
        }

        stage('Run Docker Container') {
            steps {
                script {
                    // 停止并删除可能已存在的容器,避免冲突
                    sh '''
                    if [ "$(docker ps -aq -f name=laker-test)" ]; then
                        docker stop laker-test || true
                        docker rm laker-test || true
                    fi
                    '''
                    
                    // 启动新的容器
                     sh """
                        docker run -d --name laker-test \
                        -e SPRING_DATASOURCE_USERNAME='${dbUser}' \
                        -e SPRING_DATASOURCE_PASSWORD='${dbPassword}' \
                        -e SPRING_DATASOURCE_URL='${dbUrl}' \
                        -p 8089:8080 ${imageName}
                    """
                }
            }
        }
    
        stage('Health Check') {
            steps {
                script {
                    def maxRetries = 5
                    def waitTime = 4 // seconds
        
                    echo "Health Check URL: ${healthCheckUrl}"
        
                    for (int i = 0; i < maxRetries; i++) {
                        try {
                            echo "Health Check Attempt ${i + 1}: Checking ${healthCheckUrl}..."
                            def status = sh(
                                script: "curl -s -o /dev/null -w '%{http_code}' ${healthCheckUrl}",
                                returnStdout: true
                            ).trim()
        
                            echo "HTTP Status Code: ${status}"
        
                            if (status == '200') {
                                echo "Health check passed!"
                                break
                            } else {
                                echo "Health check failed with status ${status}. Retrying in ${waitTime} seconds... (${i + 1}/${maxRetries})"
                            }
                        } catch (Exception e) {
                            echo "Error during health check: ${e.getMessage()}"
                        }
        
                        if (i < maxRetries - 1) {
                            sleep(waitTime)
                        } else {
                            error "Health check failed after ${maxRetries} retries."
                        }
                    }
                }
            }
        }

    }
    post {
        always {
            // 清理工作
            echo 'Pipeline 执行完成,开始清理工作...'
            //sh 'docker image prune -f'
            //sh 'docker system prune -a -f'
              // 获取镜像列表并保留最近的 3 个镜像
                sh """
                docker images --filter=reference="${imageBaseName}:*" --format "{{.ID}}" | tail -n +4 | xargs -r docker rmi -f
                """
            echo '清理工作完成!'
        }
        failure {
            echo 'Pipeline 执行失败,请检查日志。'
        }
    }
}

自动安装JDK(可选)

1.安装jdk自动安装插件
在这里插入图片描述
2.添加相应版本的jdk
在这里插入图片描述
3.在pipeline中如何使用

pipeline {
    agent any
    environment {
        // 环境变量,可以方便管理
        imageName = "laker-test:latest"
    }
    tools {
        // 指定在 Jenkins 上配置的 Maven 工具名
        maven 'Maven-3.9.9' // Maven 配置名称,根据你在 Jenkins 配置中定义的工具名来调整
         // 使用自动安装的 jdk8是你在 Jenkins 全局工具中配置的名称
        jdk 'jdk8' 
    }

4.jdk下载时机

当 Pipeline 首次运行时,如果 Jenkins 尚未安装 JDK 8,它会自动下载并安装到 Jenkins 节点中。安装过程可能需要几分钟,具体取决于网络状况和 JDK 版本。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端-自定义Ant Design 表格(可编辑表格)

选取的的是&#xff1a;表格 Table - Ant Design 其实ant design本身就有增加和删除单列数据的封装好的表格&#xff0c;但是个人觉得那个功能繁多&#xff0c;自己实现封装也便于之后理解和二次使用。 初步效果&#xff08;舍去切换样式的功能&#xff09;&#xff1a; 突破的…

如何打造个人知识体系?

第一&#xff0c;每个人的基本情况不同。比如我有一个类别跟「设计」相关&#xff0c;这是自己的个人爱好&#xff0c;但不一定适合其他人。再比如我还有一个类别跟「广告文案」相关&#xff0c;因为里面很多表达可以借用到演讲或写作中&#xff0c;这也不适合所有人。 第二&am…

Java版-图论-最短路-Floyd算法

实现描述 网络延迟时间示例 根据上面提示&#xff0c;可以计算出&#xff0c;最大有100个点&#xff0c;最大耗时为100*wi,即最大的耗时为10000&#xff0c;任何耗时计算出来超过这个值可以理解为不可达了&#xff1b;从而得出实现代码里面的&#xff1a; int maxTime 10005…

【EthIf-04】 EthIf_CtrlIdx控制器索引

1 EthernetInterface功能spec 上层的模块访问以太网接口模块「EthernetInterface」&#xff0c;以太网接口模块通过以太网驱动程序层与多个以太网控制器交互的。 1.1 以太网控制器资源的索引 通过以太网接口模块中的以太网控制器资源的索引允许用户轻松访问多个以太网控制器…

IDEA报错:无效的源发行版、无效的目标发行版

1. 无效的源发行版 创建项目的时候&#xff0c;会遇见这个报错&#xff0c;原因就是编译的JDK版本与发布版本不一致。 解决方法&#xff1a; 1.1. 找到问题所在地 英文&#xff1a;File -> Project Structure ->Project Settings 中文&#xff1a;文件->项目结构 …

7_Sass Introspection 函数 --[CSS预处理]

Sass 的 Introspection 函数允许开发者检查和操作样式表的内部结构&#xff0c;包括选择器、属性、值等。这些函数提供了对编译过程中 Sass 文件内容的深入访问能力&#xff0c;使得更复杂的逻辑处理成为可能。以下是一些常用的 Sass Introspection 函数及其用法示例&#xff1…

【实现多网卡电脑的网络连接共享】

电脑A配备有两张网卡&#xff0c;分别命名为eth0和eth1&#xff08;对于拥有超过两张网卡的情况&#xff0c;解决方案相似&#xff09;。其中&#xff0c;eth0网卡能够连接到Internet&#xff0c;而eth1网卡则通过网线直接与另一台电脑B相连&#xff08;在实际应用中&#xff0…

怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev

本文引用怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev 在 vscode 设置项中配置 gopls 的 ui.navigation.importShortcut 为 Definition 即可。 "gopls": {"ui.navigation.importShortcut": "Definition" }ui.navigation.i…

试题转excel;word转excel;大风车excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…

如何对小型固定翼无人机进行最优的路径跟随控制?

控制架构 文章继续采用的是 ULTRA-Extra无人机&#xff0c;相关参数如下&#xff1a; 这里用于guidance law的无人机运动学模型为&#xff1a; { x ˙ p V a cos ⁡ γ cos ⁡ χ V w cos ⁡ γ w cos ⁡ χ w y ˙ p V a cos ⁡ γ sin ⁡ χ V w cos ⁡ γ w sin ⁡ χ…

java抽奖系统登录下(四)

6.4 关于登录 最简单的登录&#xff1a; 1、web登录页填写登录信息&#xff0c;前端发送登录信息到后端&#xff1b; 2、后端接受登录信息&#xff0c;并校验。校验成功&#xff0c;返回成功结果。 这种登录会出现一个问题&#xff0c;用户1成功登录之后&#xff0c;获取到后台…

面经zijie

以下是对 C# GC 和 Lua GC 的详细分析&#xff0c;包括它们的原理、特性、优化方式及对比。 C# GC&#xff1a;详细分析 C# 的垃圾回收器 (Garbage Collector, GC) 是一个自动内存管理系统&#xff0c;它在程序运行时负责管理对象的分配和释放&#xff0c;防止内存泄漏。 1. …

利用代理IP爬取Zillow房产数据用于数据分析

引言 最近数据分析的热度在编程社区不断攀升&#xff0c;有很多小伙伴都开始学习或从事数据采集相关的工作。然而&#xff0c;网站数据已经成为网站的核心资产&#xff0c;许多网站都会设置一系列很复杂的防范措施&#xff0c;阻止外部人员随意采集其数据。为了解决这个问题&a…

海康萤石摄像机接入EasyNVR流程:开启RTSP-》萤石视频添加到EasyNVR-》未来支持海康SDK协议添加到EasyNVR

EasyNVR目前支持GB28181、RTSP、ONVIF、RTMP&#xff08;推流&#xff09;这几种协议接入&#xff0c;目前正在增加海康HIKSDK、大华DHSDK等几种SDK的接入&#xff0c;我们今天就介绍一下萤石摄像机怎么通过RTSP接入到EasyNVR。 第一步&#xff1a;萤石摄像机开启 萤石设备默…

Pytest-Bdd-Playwright 系列教程(14):Docstring 参数

Pytest-Bdd-Playwright 系列教程&#xff08;14&#xff09;&#xff1a;Docstring 参数 前言一、什么是docstring?二、基本语法三、主要特点四、实际例子五、注意事项六、使用建议总结 前言 在自动化测试的过程中&#xff0c;我们经常需要处理复杂的测试数据或需要输入多行文…

Quad Remesher使用教程

为什么要拓扑&#xff1f; 我们知道&#xff0c;模型在三维软件中的表现&#xff0c;是由一系列的面通过不同角度组合而成的。3D模型制作层面上的拓扑&#xff0c;按我的理解来说&#xff0c;就是一个模型的面的结构分布——布线。想表现和制作一个三维模型&#xff0c;有无限…

智慧政务数据中台建设及运营解决方案

数据中台&#xff1a;政府数字化转型的引擎 数据中台作为政府数字化转型的核心驱动力&#xff0c;起源于美军的作战体系&#xff0c;强调高效、灵活与强大。它不仅促进了政府决策的科学性&#xff0c;还推动了政府服务的精细化与智能化。 数据中台的应用场景&#xff1a;数字…

Transformer: Attention Is All You Need (2017) 翻译

论文&#xff1a;Attention Is All You Need 下载地址如下: download: Transformer Attention Is All you need Attention Is All You Need 中文 《Attention Is All You Need》是《Transformer》模型的开创性论文&#xff0c;提出了一种全新的基于注意力机制的架构&#xf…

Android 系统应用重名install安装失败分析解决

Android 系统应用重名install安装失败分析解决 文章目录 Android 系统应用重名install安装失败分析解决一、前言1、Android Persistent apps 简单介绍 二、系统 persistent 应用直接安装需求分析解决1、系统应用安装报错返回的信息2、分析解决 三、其他1、persistent系统应用in…

3D一览通在线协同设计,助力汽车钣金件设计与制造数字化升级

汽车行业已迎来智能化的汹涌浪潮&#xff0c;在此背景下&#xff0c;零部件制造商唯有积极应对&#xff0c;以智能制造为核心驱动力&#xff0c;方能跟上行业发展步调&#xff0c;在激烈的市场竞争中抢占先机。作为整车制造不可或缺的核心组件之一&#xff0c;汽车钣金件亦需紧…