1-jenkins流水线相关案例

发布于:2024-05-10 ⋅ 阅读:(17) ⋅ 点赞:(0)

第一个案例

这个脚本包括从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. 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. 查找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"
        }
    }
}

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


网站公告

今日签到

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