赞
踩
这个脚本包括从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 ''' } } } }
git clone
克隆仓库;如果存在,则执行 git pull
拉取最新代码。scp
命令将构建好的 jar
包复制到远程服务器上。这里需要确保 Jenkins 服务器有权限访问目标服务器,并且ssh密钥已正确设置。需要在Jenkins流水线中停止supervise-gateway.jar应用,可以通过设置一个专门的停止阶段来实现。这个阶段将会使用kill
命令或其他方式来停止正在运行的Java进程。
假设应用是通过一个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 ''' } } } } }
这个流水线脚本做了以下几件事:
查找Java进程:使用ps
和grep
命令查找包含supervise-gateway.jar
的Java进程。这里使用[s]upervise-gateway.jar
的搜索模式是为了避免匹配grep
命令自己的进程。
停止进程:使用kill
命令发送终止信号到找到的进程ID。如果找到多个进程,这个脚本将会停止第一个找到的进程。
确认停止:脚本会检查进程是否停止,如果没有停止,它会每秒检查一次直到进程停止。
要将 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
的值,以适应不同的部署或环境需求。
案例三完整版
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)。下面是对各个部分的简单解释:
agent any: 这指示 Jenkins 可以在任何可用的节点上运行这个 pipeline。
environment: 定义环境变量,这里定义的是 WORKSPACE_DIR
,即 Jenkins 工作目录名称。
supervise-cloud
目录是否存在。
git clone
命令从远程 Git 仓库克隆代码。dev
分支并拉取最新代码,以保持代码更新。mvn clean compile package
命令来清理、编译和打包应用,同时跳过单元测试。ssh
连接到远程服务器,检查并停止正在运行的 supervise-gateway.jar
应用。scp
命令复制到远程服务器。这个 Jenkins Pipeline 脚本为开发提供了一个自动化的构建、部署流程,帮助团队实现快速迭代和部署,确保代码的快速交付和部署到生产环境中。通过自动化这些步骤,可以减少人为错误,提高效率和可靠性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。