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

发布于:2024-12-18 ⋅ 阅读:(112) ⋅ 点赞:(0)

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 版本。
在这里插入图片描述


网站公告

今日签到

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