当前位置:   article > 正文

1-jenkins流水线相关案例

1-jenkins流水线相关案例

案例一:

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

详细说明:

  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流水线中这样写:

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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

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

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

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

案例三:

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

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"
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

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

案例三完整版

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"
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/564150
推荐阅读
相关标签
  

闽ICP备14008679号