一. 全局工具配置(系统管理-> 全局工具配置)
二. 创建流水线(脚本在第四步)
三. 添加凭据
四. 备份以及启动的一些脚本
- backup.sh
#!/bin/bash
# 要备份的文件路径
source_file="/opt/myproject/dockerdemo/builded/service-two/target/output/dockerdemo.jar"
# 备份文件的目标文件夹
backup_dir="/opt/myproject/dockerdemo/builded/backup"
# 获取当前时间,格式为年月日时分秒
current_time=$(date +"%Y%m%d%H%M%S")
# 检查目标文件夹是否存在,如果不存在则创建
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
fi
# 创建备份文件的路径
backup_filename=$(basename "$source_file" | sed "s/\./_${current_time}\./")
backup_path="$backup_dir/$backup_filename"
# 复制源文件到备份路径
cp "$source_file" "$backup_path"
echo "备份已完成:$source_file -> $backup_path"
- startall.sh
nohup java -Xms1024m -Xmx2048m -jar ./service-two/target/output/dockerdemo.jar 1>dockerdemo-start.out 2>&1 &
- stopall.sh
# 要停止的Java Jar程序的关键词
jar_keyword="dockerdemo.jar"
# 查找匹配的进程ID
pid=$(pgrep -f "$jar_keyword")
if [ -z "$pid" ]; then
echo "未找到运行中的Java Jar程序: $jar_keyword"
else
echo "正在尝试正常停止进程 $pid"
kill "$pid"
sleep 10 # 等待10秒,给程序一些时间处理终止信号
if pgrep -P "$pid" >/dev/null; then
echo "正常终止失败,尝试强制停止进程 $pid"
kill -9 "$pid"
echo "已强制停止进程 $pid"
else
echo "已成功正常终止进程 $pid"
fi
fi
五. 流水线脚本
//用于轻量化部署的jenkins 流水线
def createDateTime() {
// 定义一个版本号作为当次构建的版本,输出结果 20191210175842_69
return new Date().format('yyyyMMddHHmmss')
}
pipeline {
agent any
environment {
JOB_DESCRIPTION = "demo-DEV环境"
BOT_KEY="0"
_dateTime = createDateTime()
}
options { // 执行选项
buildDiscarder(logRotator(numToKeepStr: '1')) // 保存历史构建记录的数量
disableConcurrentBuilds() // 不允许并发构建
timeout(time: 1, unit: 'HOURS') // 构建超时时间最多1个小时
}
parameters {
string name: 'deployOption',description: '部署方式 全量=full,增量(贼快)=mini',defaultValue: 'full', trim: true
gitParameter name: 'BRANCH_TAG',
branchFilter: 'origin/(.*)',
quickFilterEnabled: false,
selectedValue: 'DEFAULT',
sortMode: 'NONE',
tagFilter: '*',
type: 'PT_BRANCH_TAG',
defaultValue: 'dev',
useRepository: 'https://gitee.com/你的gitee项目/dockerdemo.git'
}
tools {
maven 'maven3.9.2' // 使用maven
git 'git2.39.2'
}
stages {
stage('Pre-Build') { // 预构建阶段
steps {
checkout([$class: 'GitSCM', gitTool: 'git2.39.2',branches: [[name: "${params.BRANCH_TAG}"]], extensions: [], userRemoteConfigs: [[credentialsId: 'df6538f0-74c1-4da4-8a89-60bf62ac3068', url: 'https://gitee.com/你的gitee项目/dockerdemo.git']]])
}
}
stage('Build') {
steps {
sh "mvn clean package -Dmaven.test.skip=true -P ${params.deployOption} "
}
post {
// 构建成功后,发送jar包到对应服务器,并重启服务
success {
script {
switch("${params.deployOption}"){
case "full" :
//先上传文件,后执行命令,命令和源文件,两者必须有一个有值
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'mymac',
transfers: [
//备份旧文件,清空传输目录
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'cd /opt/myproject/dockerdemo/builded && ./backup.sh',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: 'myproject/dockerdemo/builded',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: ''
),
//传输jar,cfg,sh文件
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'echo \'Send file ...\'',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: 'myproject/dockerdemo/builded',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '**/target/output/*.*,**/target/output/**'
),
//传输resources下的mapper xml
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'echo \'Send file ...\'',
execTimeout: 600000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: 'myproject/dockerdemo/builded',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '**/target/output/resources/mapper/*.xml'
),
//传输resources下其他文件
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'echo \'Send file ...\'',
execTimeout: 600000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: 'myproject/dockerdemo/builded',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '**/target/output/resources/**/**'
),
//停止服务,删除旧文件,拷贝新文件,启动服务
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'cd /opt/myproject/dockerdemo/builded && ./stopall.sh && cd /opt/myproject/dockerdemo/builded && ./startall.sh ',
execTimeout: 600000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: 'myproject/dockerdemo/builded',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: ''
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false
)
]
)
break;
default:
sshPublisher(
// 发送到远程机器
publishers: [
sshPublisherDesc(
configName: 'mymac',
transfers: [
//备份旧文件,清空传输目录
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'cd /opt/myproject/dockerdemo/builded && ./backup.sh',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: 'myproject/dockerdemo/builded',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: ''
),
//传输新文件
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'echo \'Send file ...\'',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: 'myproject/dockerdemo/builded',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '**/target/*.zip'
),
// 停止服务,删除旧文件,拷贝新文件,启动服务
// 解压缩时远程调用经常会被里面的信息干扰,认为脚本执行失败,要在前面加上sh 执行
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'cd /home/projects/izone_back_dev/cmd && \
./stopall.sh && ./clean.sh && sh ./install.sh && cd /home/projects/izone_back_dev/cmd && ./startall.sh ',
execTimeout: 600000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: 'myproject/dockerdemo/builded',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '**/target/output/resources/mapper/*.xml'
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false
)
]
)
}
}
}
}
}
}
}