脚本需接收分支参数,先用git ls-remote --heads origin校验远端分支存在,再执行git reset --hard && git clean -fdx清理工作区,最后git checkout -f <branch>切换并按分支名注入环境配置打包。

如何用 shell 脚本一键拉取指定分支并执行编译打包
核心是避免手动 git checkout 和重复输入分支名。脚本必须能接收分支参数、校验是否存在、干净切换,否则后续构建大概率失败。
- 先用
git ls-remote --heads origin检查远端分支是否存在,比本地git branch -r更可靠(尤其新分支刚推送还没 fetch) - 切换前执行
git reset --hard HEAD && git clean -fdx,不加-f会卡住;-x必须带上,否则 .gitignore 里的构建产物残留可能污染结果 - 推荐用
git worktree隔离不同分支构建环境,但需提前创建目录并绑定,适合长期多分支并行场景;临时构建用git checkout -f <branch>更轻量
编译打包时如何区分 dev/staging/prod 分支的配置注入
不能靠硬编码配置文件路径,得让构建命令感知当前分支语义。Maven/Gradle/Makefile 各有惯用法,但统一原则是:分支名即环境标识符。
- Maven 项目用
-P激活 profile:mvn clean package -P$(echo $BRANCH | sed 's|/|-|g'),把feature/login变成feature-login避免斜杠报错 - Gradle 推荐在
gradle.properties中读取环境变量ENV=staging,再通过--system-prop注入:gradle build -Denv=$BRANCH - 前端项目(如 Vue/React)常用
cross-env NODE_ENV=production npm run build,但分支名要映射到 API 域名,建议在.env.[branch]文件中定义,用dotenv加载
测试包自动分发到指定服务器时权限与路径怎么设才不出错
常见失败不是 rsync 命令写错,而是目标目录属主、SELinux 上下文、磁盘空间这三者之一没对齐。
- 分发前务必检查目标路径是否存在且可写:
ssh $USER@$HOST 'test -d /opt/app/releases && test -w /opt/app/releases',失败直接退出 - 用
rsync -avz --delete-after而非scp,--delete-after防止传输中断导致残留旧文件;-z对压缩包无效,但对源码目录有效 - 目标服务器上用
chown -R app:app /opt/app/releases/统一属主,避免 Java 进程因权限拒绝读取 config.yml;若启用了 SELinux,需补restorecon -Rv /opt/app/releases
CI 环境下触发脚本时如何防止并发冲突和误操作
GitLab CI 或 Jenkins 多流水线同时跑同一分支脚本,容易出现构建目录覆盖、rsync 目标路径被删、甚至误发 prod 包。
- 用
git describe --exact-match --tags HEAD 2>/dev/null判断是否为 tag 构建,只有 tag 才允许部署到 prod 服务器 - 在脚本开头加锁:
if mkdir .deploy-lock; then trap "rmdir .deploy-lock" EXIT; else echo "Deploy locked"; exit 1; fi,简单有效 - 敏感操作(如推送到生产服务器)必须显式传参启用:
--allow-prod-deploy,默认关闭;参数解析用getopts,不用位置参数,避免顺序错乱
分支名解析、环境变量透传、目标机权限校验——这三个点漏掉任意一个,脚本就只在你本地跑得通。


















