1-jenkins流水线相关案例

案例一:

这个脚本包括从Git仓库拉取代码、进行Maven构建,并将构建好的jar包复制到指定服务器。

groovy 复制代码
pipeline {
    agent any
    stages {
        stage('Prepare') {
            steps {
                script {
                    // 判断是否存在目录,没有则克隆,有则拉取
                    if (!fileExists('supervise-cloud')) {
                        echo "Cloning repository"
                        sh 'git clone ssh://git@192.168.0.99:9981/zhjg/zhengke/supervise-cloud.git'
                    } else {
                        echo "Pulling latest changes"
                        sh '''
                            cd supervise-cloud
                            git pull
                        '''
                    }
                }
            }
        }
        stage('Build') {
            steps {
                echo "Maven build start"
                sh '''
                    export MAVEN_HOME=/root/apache-maven-3.9.2
                    export JAVA_HOME=/usr/local/java/jdk-1.8.0
                    export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH
                    cd supervise-cloud
                    mvn clean compile package -Dmaven.test.skip=true
                '''
            }
        }
        stage('Deploy') {
            steps {
                echo "Deploying artifacts"
                sh '''
                    scp supervise-cloud/supervise-auth/target/supervise-auth.jar root@192.168.0.106:/root
                    scp supervise-cloud/supervise-other-module/target/*.jar root@192.168.0.106:/root
                '''
            }
        }
    }
}

详细说明:

  1. Prepare 阶段 :这个阶段会检查本地是否已经存在项目目录。如果不存在,则执行 git clone 克隆仓库;如果存在,则执行 git pull 拉取最新代码。
  2. Build 阶段:设置环境变量并进入项目目录,使用 Maven 进行构建。这里跳过了测试并且指定了项目和pom文件位置。
  3. Deploy 阶段 :使用 scp 命令将构建好的 jar 包复制到远程服务器上。这里需要确保 Jenkins 服务器有权限访问目标服务器,并且ssh密钥已正确设置。

案例二:

需要在Jenkins流水线中停止supervise-gateway.jar应用,可以通过设置一个专门的停止阶段来实现。这个阶段将会使用kill命令或其他方式来停止正在运行的Java进程。

Jenkinsfile 示例

假设应用是通过一个Java命令启动的,并且知道这个应用相关的一些信息(如使用的jar文件名),你可以在Jenkins流水线中这样写:

groovy 复制代码
pipeline {
    agent any

    stages {
        stage('Stop Application') {
            steps {
                script {
                    // 查找正在运行的Java应用的PID
                    sh '''
                    PID=$(ps aux | grep '[s]upervise-gateway.jar' | awk '{print $2}')
                    if [ -z "$PID" ]; then
                      echo "No application running."
                    else
                      echo "Stopping application with PID: $PID"
                      kill $PID
                      # 确认进程是否已经停止
                      while kill -0 $PID 2> /dev/null; do 
                        echo "Waiting for application to stop..."
                        sleep 1
                      done
                      echo "Application stopped."
                    fi
                    '''
                }
            }
        }
    }
}

这个流水线脚本做了以下几件事:

  1. 查找Java进程 :使用psgrep命令查找包含supervise-gateway.jar的Java进程。这里使用[s]upervise-gateway.jar的搜索模式是为了避免匹配grep命令自己的进程。

  2. 停止进程 :使用kill命令发送终止信号到找到的进程ID。如果找到多个进程,这个脚本将会停止第一个找到的进程。

  3. 确认停止:脚本会检查进程是否停止,如果没有停止,它会每秒检查一次直到进程停止。

案例三:

要将 Jenkins 的工作目录名称设置为一个变量,你可以在 Jenkinsfile 的开始部分定义一个环境变量,并在整个流程中使用这个变量。这样,你可以在不同的情况下更容易地修改工作目录的名称。下面是如何修改你的 Jenkinsfile 来实现这一点:

groovy 复制代码
pipeline {
    agent any
    environment {
        WORKSPACE_DIR = 'test' // 可以根据需要更改这个变量的值
    }
    stages {
        stage('Prepare') {
            steps {
                script {
                    // 检查目录是否存在,如果不存在则克隆,如果存在则从dev分支拉取最新代码
                    if (!fileExists('supervise-cloud')) {
                        echo "Cloning repository"
                        sh 'git clone -b dev ssh://git@192.168.0.99:9981/zhjg/zhengke/supervise-cloud.git'
                    } else {
                        echo "Pulling latest changes"
                        sh '''
                            cd supervise-cloud
                            git checkout dev
                            git pull
                        '''
                    }
                }
            }
        }
        stage('Build') {
            steps {
                echo "Maven build start"
                sh '''
                    export MAVEN_HOME=/root/apache-maven-3.9.2
                    export JAVA_HOME=/usr/local/java/jdk-1.8.0
                    export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH
                    cd supervise-cloud
                    mvn clean compile package -Dmaven.test.skip=true
                '''
            }
        }
        stage('Deploy') {
            steps {
                script {
                    // 使用ssh连接到远程服务器,进行部署操作
                    sh '''
                        ssh -o StrictHostKeyChecking=no zhjgapp@192.168.0.108 << remotessh
                        if pgrep -f supervise-auth.jar; then
                            pkill -f supervise-auth.jar
                            echo "Application stopped"
                        else
                            echo "No running application found"
                        fi
                        if [ -f /home/zhjgapp/supervise-cloud/auth/supervise-auth.jar ]; then
                            mv /home/zhjgapp/supervise-cloud/auth/supervise-auth.jar /home/zhjgapp/supervise-cloud/back/supervise-auth-`date +%Y%m%d`.jar
                            echo "Old application backed up as supervise-auth-`date +%Y%m%d`.jar"
                        fi
                        exit
                        remotessh
                    '''
                    // 将新的jar文件scp到目标服务器
                    sh '''
                        scp -o StrictHostKeyChecking=no ${WORKSPACE_DIR}/supervise-cloud/supervise-auth/target/supervise-auth.jar zhjgapp@192.168.0.108:/home/zhjgapp/supervise-cloud/auth/
                    '''
                    // 重新登录到远程服务器启动新的应用
                    sh '''
                        ssh -o StrictHostKeyChecking=no zhjgapp@192.168.0.108 << remotessh
                        cd /home/zhjgapp/supervise-cloud/auth/
                        nohup java -Dfile.encoding=utf-8 -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -jar supervise-auth.jar > /dev/null 2>&1 &
                        echo "Application started"
                        exit
                        remotessh
                    '''
                }
            }
        }
    }
    post {
        always {
            echo "Pipeline execution complete"
        }
    }
}

这里,WORKSPACE_DIR 变量定义在 environment 块内,并在 scp 命令中使用 ${WORKSPACE_DIR} 来代替原先直接使用的目录名。你可以根据需要轻松更改 WORKSPACE_DIR 的值,以适应不同的部署或环境需求。

案例三完整版

groovy 复制代码
pipeline {
    agent any
    environment {
        WORKSPACE_DIR = 'test-zhjg-supervise-gateway' //jenkins工作目录名称
    }
    stages {
        stage('Prepare') {
            steps {
                script {
                    // 检查目录是否存在,如果不存在则克隆,如果存在则从dev分支拉取最新代码
                    if (!fileExists('supervise-cloud')) {
                        echo "Cloning repository"
                        sh 'git clone -b dev ssh://git@192.168.0.99:9981/zhjg/zhengke/supervise-cloud.git'
                    } else {
                        echo "Pulling latest changes"
                        sh '''
                            cd supervise-cloud
                            git checkout dev
                            git pull
                        '''
                    }
                }
            }
        }
        stage('Build') {
            steps {
                echo "Maven build start"
                sh '''
                    export MAVEN_HOME=/root/apache-maven-3.9.2
                    export JAVA_HOME=/usr/local/java/jdk-1.8.0
                    export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH
                    cd supervise-cloud
                    mvn clean compile package -Dmaven.test.skip=true
                '''
            }
        }
        stage('Deploy') {
            steps {
                script {
                    // 使用ssh连接到远程服务器,停止现有服务&备份jar包
                    sh '''
                        ssh -o StrictHostKeyChecking=no zhjgapp@192.168.0.108 << remotessh
                        if pgrep -f supervise-gateway.jar; then
                            pkill -f supervise-gateway.jar
                            echo "Application stopped"
                        else
                            echo "No running application found"
                        fi
                        if [ -f /home/zhjgapp/supervise-cloud/gateway/supervise-gateway.jar ]; then
                            mv /home/zhjgapp/supervise-cloud/gateway/supervise-gateway.jar /home/zhjgapp/supervise-cloud/back/supervise-gateway-`date +%Y%m%d-%H%M%S`.jar
                            echo "Old application backed up as supervise-gateway-`date +%Y%m%d-%H%M%S`.jar"
                        fi
                        # 删除超过30天的备份文件
                        find /home/zhjgapp/supervise-cloud/back/ -mtime +30 -type f -name '*.jar' -exec rm {} \\;
                        echo "Removed backups older than 30 days"
                        exit
                        remotessh
                    '''
                    
                    // 将新的jar文件scp到目标服务器
                    sh '''
                        scp -o StrictHostKeyChecking=no /root/.jenkins/workspace/${WORKSPACE_DIR}/supervise-cloud/supervise-gateway/target/supervise-gateway.jar zhjgapp@192.168.0.108:/home/zhjgapp/supervise-cloud/gateway/
                    '''
                    
                    // 重新登录到远程服务器启动新的应用
                    sh '''
                        ssh -o StrictHostKeyChecking=no zhjgapp@192.168.0.108 << remotessh
                        cd /home/zhjgapp/supervise-cloud/gateway/
                        nohup java -Dspring.profiles.active=test -Dfile.encoding=utf-8 -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -jar supervise-gateway.jar > /dev/null 2>&1 &
                        echo "Application started"
                        exit
                        remotessh
                    '''
                }
            }
        }
    }
    post {
        always {
            echo "Pipeline execution complete"
        }
    }
}

这段代码是一个 Jenkins Pipeline 脚本,它定义了一个自动化流程,主要用于从源代码管理(如 Git)获取代码,构建项目,部署到服务器,并执行相关的清理工作。这种流程通常用于持续集成和持续部署(CI/CD)。下面是对各个部分的简单解释:

Pipeline 结构

  1. agent any: 这指示 Jenkins 可以在任何可用的节点上运行这个 pipeline。

  2. environment : 定义环境变量,这里定义的是 WORKSPACE_DIR,即 Jenkins 工作目录名称。

Stages 解释

Prepare 阶段
  • 检查目录 : 判断 supervise-cloud 目录是否存在。
    • 如果不存在,执行 git clone 命令从远程 Git 仓库克隆代码。
    • 如果存在,切换到 dev 分支并拉取最新代码,以保持代码更新。
Build 阶段
  • 构建 : 使用 Maven 来构建项目,这包括编译代码和打包。
    • 设置 Maven 和 Java 的环境变量。
    • 执行 mvn clean compile package 命令来清理、编译和打包应用,同时跳过单元测试。
Deploy 阶段
  • 部署 :
    • 停止服务 : 使用 ssh 连接到远程服务器,检查并停止正在运行的 supervise-gateway.jar 应用。
    • 备份旧应用: 如果找到旧的 jar 文件,将其移动到备份目录,并以当前日期和时间为后缀重命名。
    • 清理旧备份: 删除30天前的备份文件以节省空间。
    • 部署新应用 : 将新构建的 jar 文件通过 scp 命令复制到远程服务器。
    • 启动新服务: 在远程服务器上启动新的 jar 文件。

Post Actions

  • always: 无论 pipeline 执行成功或失败,都会执行的步骤,这里是打印"Pipeline execution complete"。

总结

这个 Jenkins Pipeline 脚本为开发提供了一个自动化的构建、部署流程,帮助团队实现快速迭代和部署,确保代码的快速交付和部署到生产环境中。通过自动化这些步骤,可以减少人为错误,提高效率和可靠性。

相关推荐
Elastic 中国社区官方博客40 分钟前
使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变
大数据·人工智能·elasticsearch·microsoft·搜索引擎·ai·azure
sun0077004 小时前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
吃肉不能购6 小时前
Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪
运维·yolo·自动化
学Linux的语莫6 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
qq_312920116 小时前
docker 部署 kvm 图形化管理工具 WebVirtMgr
运维·docker·容器
学Linux的语莫6 小时前
搭建服务器VPN,Linux客户端连接WireGuard,Windows客户端连接WireGuard
linux·运维·服务器
黑牛先生7 小时前
【Linux】进程-PCB
linux·运维·服务器
Karoku0667 小时前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
安迁岚8 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql