基于现有Jenkins CI/CD,如何自动化本地发布准备流程?
最优实现发布准备流程自动化的方案
嘿,结合你已掌握的技术栈(Bash、Make、JavaScript等),我推荐用Bash脚本来搞定这个需求——完全符合你「优先用现有工具」的要求,还能完美覆盖所有核心功能,可读性也拉满。下面是具体的实现思路和代码示例:
核心需求的实现逻辑
1. 分步执行+暂停确认
用Bash的read命令添加交互式确认,每一步执行前都让你确认后再继续,避免误操作。
2. 断点续跑+任意步骤退出
通过一个状态文件(比如.release_step)记录当前执行到的步骤序号,每次启动脚本时先读取这个文件,就能从上次中断的位置继续;用户也可以随时输入q退出,或者直接输入步骤号跳转到指定环节。
3. 机器执行+人员提示交替
在脚本里定义两种步骤类型:CMD(机器自动执行命令)和PROMPT(给人员的提示信息),混合编排就能实现交替执行的效果。
具体Bash脚本实现
这个脚本注释清晰,所有步骤都集中定义在数组里,维护起来非常方便:
#!/bin/bash # 状态文件:记录当前执行到的步骤序号 STATE_FILE=".release_step" # 初始化当前步骤:如果状态文件存在就读取,否则从第1步开始 if [ -f "$STATE_FILE" ]; then CURRENT_STEP=$(cat "$STATE_FILE") else CURRENT_STEP=1 fi # 定义所有发布准备步骤 # 格式:"[步骤类型]|[步骤描述]|[执行内容/提示文本]" # 步骤类型:PROMPT(人员提示)、CMD(机器执行命令) STEPS=( "PROMPT|请确认已完成需求文档更新,准备启动发布流程||" "CMD|拉取master分支最新代码|git pull origin master" "PROMPT|请检查代码变更是否符合预期,确认后继续||" "CMD|安装依赖并执行单元测试|npm install && npm run test" "PROMPT|请查看测试报告,确认所有用例执行通过||" "CMD|自动升级package.json的patch版本号|npm version patch" "PROMPT|请确认package.json版本号正确,且CHANGELOG已更新||" ) # 执行单个步骤的函数 execute_step() { local step_num=$1 # 从数组中取出当前步骤的信息 local step_info=${STEPS[$((step_num-1))]} IFS='|' read -r step_type desc content <<< "$step_info" echo -e "\n=== 步骤 $step_num: $desc ===" # 根据步骤类型显示不同的提示 if [ "$step_type" = "PROMPT" ]; then echo "$content" read -p "输入'y'继续,'q'退出,或输入步骤号跳转: " user_input else echo "即将执行命令: $content" read -p "输入'y'执行命令,'q'退出,或输入步骤号跳转: " user_input fi # 处理用户输入 case $user_input in y|Y) # 如果是机器执行步骤,执行命令并检查结果 if [ "$step_type" = "CMD" ]; then echo "开始执行..." eval "$content" if [ $? -ne 0 ]; then echo "步骤 $step_num 执行失败,请修复后重新运行脚本" echo "$step_num" > "$STATE_FILE" exit 1 fi fi # 更新状态文件为下一个步骤 echo "$((step_num+1))" > "$STATE_FILE" return 0 ;; q|Q) echo "已退出,当前执行到步骤 $step_num" echo "$step_num" > "$STATE_FILE" exit 0 ;; [0-9]*) # 校验跳转的步骤号是否有效 if [ "$user_input" -ge 1 ] && [ "$user_input" -le "${#STEPS[@]}" ]; then echo "跳转到步骤 $user_input" echo "$user_input" > "$STATE_FILE" return 1 # 返回1表示需要重新加载步骤 else echo "无效的步骤号,范围是1到${#STEPS[@]}" return 1 fi ;; *) echo "输入无效,请输入'y'/'q'或有效步骤号" return 1 ;; esac } # 主循环:从当前步骤开始执行,直到所有步骤完成 while true; do # 如果当前步骤超过总步骤数,说明所有流程完成 if [ "$CURRENT_STEP" -gt "${#STEPS[@]}" ]; then echo -e "\n🎉 所有发布准备步骤已完成!" rm -f "$STATE_FILE" # 完成后删除状态文件 exit 0 fi # 执行当前步骤 execute_step "$CURRENT_STEP" # 如果执行成功,更新当前步骤;否则重新读取状态文件(比如用户跳转了步骤) if [ $? -eq 0 ]; then CURRENT_STEP=$((CURRENT_STEP+1)) else CURRENT_STEP=$(cat "$STATE_FILE") fi done
配合Makefile优化使用体验
如果你习惯用Make管理任务,可以写一个简单的Makefile来简化命令:
.PHONY: release-prep continue release-clean # 启动/继续发布准备流程 release-prep: @./release_prep.sh continue: release-prep # 清理状态文件(重置流程) release-clean: @rm -f .release_step
这样你可以用:
make release-prep启动流程make continue继续上次中断的流程make release-clean重置流程状态
方案优势
- 完全匹配你的技术栈:纯Bash+Make,不需要学习新工具
- 可读性极强:所有步骤集中定义在数组里,格式统一,新增/修改步骤只需要修改数组即可
- 覆盖所有需求:
- 每步都有交互确认,支持退出和跳转
- 断点续跑功能完美解决中途退出的问题
- 原生支持机器执行和人员提示的交替步骤
内容的提问来源于stack exchange,提问作者Kzqai
相关产品推荐
相关产品推荐

