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

相关推荐
程序猿小三21 分钟前
Linux下基于关键词文件搜索
linux·运维·服务器
虚拟指尖1 小时前
Ubuntu编译安装COLMAP【实测编译成功】
linux·运维·ubuntu
椎4952 小时前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
刘某的Cloud2 小时前
parted磁盘管理
linux·运维·系统·parted
liliangcsdn2 小时前
如何基于ElasticsearchRetriever构建RAG系统
大数据·elasticsearch·langchain
极验2 小时前
iPhone17实体卡槽消失?eSIM 普及下的安全挑战与应对
大数据·运维·安全
爱倒腾的老唐2 小时前
24、Linux 路由管理
linux·运维·网络
yannan201903132 小时前
Docker容器
运维·docker·容器
_清浅2 小时前
计算机网络【第六章-应用层】
运维·服务器·计算机网络
正在努力的小河3 小时前
Linux 自带的 LED 灯驱动实验
linux·运维·服务器