案例一:
这个脚本包括从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
'''
}
}
}
}
详细说明:
- Prepare 阶段 :这个阶段会检查本地是否已经存在项目目录。如果不存在,则执行
git clone
克隆仓库;如果存在,则执行git pull
拉取最新代码。 - Build 阶段:设置环境变量并进入项目目录,使用 Maven 进行构建。这里跳过了测试并且指定了项目和pom文件位置。
- 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
'''
}
}
}
}
}
这个流水线脚本做了以下几件事:
-
查找Java进程 :使用
ps
和grep
命令查找包含supervise-gateway.jar
的Java进程。这里使用[s]upervise-gateway.jar
的搜索模式是为了避免匹配grep
命令自己的进程。 -
停止进程 :使用
kill
命令发送终止信号到找到的进程ID。如果找到多个进程,这个脚本将会停止第一个找到的进程。 -
确认停止:脚本会检查进程是否停止,如果没有停止,它会每秒检查一次直到进程停止。
案例三:
要将 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 结构
-
agent any: 这指示 Jenkins 可以在任何可用的节点上运行这个 pipeline。
-
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 脚本为开发提供了一个自动化的构建、部署流程,帮助团队实现快速迭代和部署,确保代码的快速交付和部署到生产环境中。通过自动化这些步骤,可以减少人为错误,提高效率和可靠性。