94 lines
3.5 KiB
Groovy
94 lines
3.5 KiB
Groovy
pipeline {
|
|
agent any
|
|
|
|
stages {
|
|
// ========== 阶段1:拉取代码 ==========
|
|
stage('1. 拉取代码') {
|
|
steps {
|
|
checkout scm
|
|
}
|
|
}
|
|
|
|
// ========== 阶段2:扫描可用服务 ==========
|
|
stage('2. 扫描可用服务') {
|
|
steps {
|
|
script {
|
|
// 扫描包含 docker-compose.yaml 的一级子目录
|
|
def dirs = sh(
|
|
script: 'find . -maxdepth 2 -name "docker-compose.yaml" -printf "%h\n" | sed "s|^\\./||" | sort -u',
|
|
returnStdout: true
|
|
).trim()
|
|
|
|
// 转换为 Groovy 列表
|
|
def serviceList = dirs.split('\n') as List
|
|
|
|
// 存入环境变量供后续使用
|
|
env.SERVICE_CHOICES = serviceList.join(',')
|
|
|
|
echo "✅ 发现服务: ${serviceList}"
|
|
}
|
|
}
|
|
}
|
|
|
|
// ========== 阶段3:弹出下拉菜单(人工选择) ==========
|
|
stage('3. 选择服务') {
|
|
steps {
|
|
script {
|
|
// 将逗号分隔的字符串转回列表
|
|
def choices = env.SERVICE_CHOICES.split(',') as List
|
|
|
|
// 如果列表为空,直接报错退出
|
|
if (choices.isEmpty() || choices[0] == '') {
|
|
error('❌ 未找到任何包含 docker-compose.yaml 的服务目录!')
|
|
}
|
|
|
|
// 弹出下拉菜单
|
|
def selected = input(
|
|
message: '请选择要部署的服务目录:',
|
|
parameters: [
|
|
choice(
|
|
name: 'SERVICE_DIR',
|
|
choices: choices,
|
|
description: '选择对应的 docker-compose 目录'
|
|
)
|
|
]
|
|
)
|
|
|
|
env.SELECTED_SERVICE = selected
|
|
echo "✅ 用户选择了: ${env.SELECTED_SERVICE}"
|
|
}
|
|
}
|
|
}
|
|
|
|
// ========== 阶段4:部署容器 ==========
|
|
stage('4. 部署容器') {
|
|
steps {
|
|
script {
|
|
// 进入选中的子目录执行 docker-compose
|
|
dir("${env.SELECTED_SERVICE}") {
|
|
echo "🚀 开始部署服务: ${env.SELECTED_SERVICE}"
|
|
|
|
// 如果存在则停止并删除旧容器(忽略失败)
|
|
sh 'docker-compose down || true'
|
|
|
|
// 拉取最新镜像(如果依赖外部镜像)并使用最新 yaml 创建/启动
|
|
sh 'docker-compose up -d --build'
|
|
|
|
// 打印运行状态
|
|
sh 'docker-compose ps'
|
|
|
|
echo "✅ 部署完成!"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// ========== 清理工作区(可选) ==========
|
|
post {
|
|
always {
|
|
echo '🏁 构建流程结束'
|
|
cleanWs() // 清理工作区,释放磁盘空间
|
|
}
|
|
}
|
|
} |