前言
最近项目需要进行CICD部署项目,
编写脚本启动Jenkins
Linux 编写sh脚本,直接启动脚本,去查看服务器是否正在运行Jenkins.war,如果没有启动jenkins.war就启动,如果启动了就kill 掉重新启动jenkins.war,然后并提供怎么启动这个脚本的命令。
#!/bin/bash
# 检查Jenkins是否运行
if ! pgrep -f jenkins.war > /dev/null; then
# 没有运行,启动Jenkins
nohup java -jar /path/to/jenkins.war > /dev/null 2>&1 &
echo "Jenkins started"
else
# 正在运行,kill掉Jenkins进程
pkill -f jenkins.war
# 等待Jenkins停止
while pgrep -f jenkins.war > /dev/null; do sleep 1; done
# 重新启动Jenkins
nohup java -jar /path/to/jenkins.war > /dev/null 2>&1 &
echo "Jenkins restarted"
fi
要运行这个脚本,使其可执行后直接执行:
chmod +x jenkins.sh
./jenkins.sh
或者不需要使可执行,用bash解释器执行:
bash jenkins.sh
对脚本进行优化,指定Jenkins的安装目录并记录日志:
#!/bin/bash
# Jenkins安装目录
JENKINS_HOME=/usr/local/jenkins
# Jenkins日志文件
LOG_FILE=$JENKINS_HOME/jenkins.log
# 检查Jenkins是否运行
if ! pgrep -f jenkins.war > /dev/null; then
# 启动Jenkins,日志输出到指定文件
nohup java -jar $JENKINS_HOME/jenkins.war > $LOG_FILE 2>&1 &
echo "Jenkins started" >> $LOG_FILE
else
# kill旧进程
pkill -f jenkins.war
# 等待进程结束
while pgrep -f jenkins.war > /dev/null; do sleep 1; done
# 重新启动,日志写入指定文件
nohup java -jar $JENKINS_HOME/jenkins.war > $LOG_FILE 2>&1 &
echo "Jenkins restarted" >> $LOG_FILE
fi
node {
stage('Checkout') {
git url: 'http://192.167.143.265:4567/fffg-vgfdfgdf/after_dddd.git'
}
stage('Build') {
// 这里编译打包生成jar包
}
stage('Deploy') {
sshPublisher(
continueOnError: false,
failOnError: true,
publishers: [
sshPublisherDesc(
configName: 'ssh_server',
transfers: [
sshTransfer(
sourceFiles: 'target/*.jar',
removePrefix: 'target/',
remoteDirectory: '/app/jar'
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
)
]
)
// 检查远程服务器是否已存在jar包
def remoteFileExists = sh(
script: "ssh ubuntu@134.4545.3454.44545 test -f /app/jar/app.jar",
returnStatus: true
)
if (remoteFileExists == 0) {
// 文件存在,进行重启
sh "ssh ubuntu@134.4545.3454.44545 systemctl restart app.service"
} else {
// 文件不存在,首次部署
sh "ssh ubuntu@134.4545.3454.44545 systemctl start app.service"
}
}
}
Maven构建Spring Boot项目并部署的完整Jenkinsfile Pipeline脚本示例:
pipeline {
agent any
tools {
maven 'Maven 3.6.1'
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Deliver') {
steps {
script {
def server = '192.168.1.100'
def appName = 'myapp'
// 检查旧版本是否运行
sh "ssh $server ps -ef | grep ${appName} | grep -v grep"
def isRunning = env.EXIT_CODE == 0
if (isRunning) {
echo "$appName is running on $server, stopping it..."
// 停止旧版本
sh "ssh $server pkill -f ${appName}"
}
// 上传并备份新版本
sh "scp target/${appName}-*.jar $server:/opt/apps"
sh "ssh $server mv /opt/apps/${appName}.jar /opt/apps/${appName}-\$(date +%Y%m%d).jar"
// 启动新版本
try {
sh "ssh $server nohup java -jar /opt/apps/${appName}-*.jar > /opt/apps/${appName}.log 2>&1 &"
echo "Started new version successfully."
} catch (exc) {
// 新版本启动失败,回滚
echo "Failed to start new version, rolling back..."
sh "ssh $server mv /opt/apps/${appName}-*.jar /opt/apps/${appName}-failed-\$(date +%Y%m%d).jar"
sh "ssh $server mv /opt/apps/${appName}-\$(date +%Y%m%d).jar ${appName}.jar"
sh "ssh $server nohup java -jar /opt/apps/${appName}.jar > /opt/apps/${appName}.log 2>&1 &"
throw exc
}
}
}
}
}
}
配置详细的Jenkins,并进行CICD