You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于现有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 重置流程状态

方案优势

  1. 完全匹配你的技术栈:纯Bash+Make,不需要学习新工具
  2. 可读性极强:所有步骤集中定义在数组里,格式统一,新增/修改步骤只需要修改数组即可
  3. 覆盖所有需求:
    • 每步都有交互确认,支持退出和跳转
    • 断点续跑功能完美解决中途退出的问题
    • 原生支持机器执行和人员提示的交替步骤

内容的提问来源于stack exchange,提问作者Kzqai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:32:44