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() // 清理工作区,释放磁盘空间 } } }