Docker构建部署前更新仓库版本遇Git推送问题求助
我在Docker构建部署流程中尝试更新代码仓库的应用版本,相关配置和遇到的问题如下:
Dockerfile代码
RUN node ./bump-version.mjs RUN yarn run build
bump-version.mjs代码
import { promisify } from 'util'; import { exec } from 'child_process'; const execAsync = promisify(exec); async function execute(command) { console.log(`EXECUTING : ${command}`); const { stdout, stderr } = await execAsync(command); if (stdout?.length) console.log(stdout); if (stderr?.length) console.error(stderr); } await execute('git config --global user.email "system@MY_DOMAIN" '); await execute('git config --global user.name "System"'); await execute('git remote set-url origin https://MY_TOKEN@git.MY_DOMAIN/front/room/App.git'); await execute(`yarn version --patch`); await execute(`git push origin master --tags`);
执行错误信息
267Error: Command failed: git push origin master --tags
268error: src refspec master does not match any
269error: failed to push some refs to 'https://git.MY_DOMAIN/front/room/App.git'
备注信息
- master分支确实存在
- 本地开发环境运行正常
- 尝试添加提交操作后出现新错误:
259EXECUTING : git add package.json
260EXECUTING : git commit -m "published version 1.2.3"272 cmd: 'git commit -m "published version 1.2.3"',
273 stdout: 'HEAD detached from ac8cd529\nnothing to commit, working tree clean\n' - 代码托管在私有GitLab服务器,Docker通过CI/CD流水线运行
额外问题
是否可以在GitLab上运行husky的post-commit或post-merge钩子?
一、Git推送失败问题修复
1. 问题根源
CI/CD流水线拉取代码时,默认处于**分离头指针(detached HEAD)**状态,而非在master分支上。这就是执行git push origin master报错、提交时提示HEAD detached的核心原因。
2. 修复后的bump-version.mjs代码
import { promisify } from 'util'; import { exec } from 'child_process'; const execAsync = promisify(exec); async function execute(command) { console.log(`EXECUTING : ${command}`); const { stdout, stderr } = await execAsync(command); if (stdout?.length) console.log(stdout); if (stderr?.length) console.error(stderr); } // 基础Git配置 await execute('git config --global user.email "system@MY_DOMAIN"'); await execute('git config --global user.name "System"'); await execute('git remote set-url origin https://MY_TOKEN@git.MY_DOMAIN/front/room/App.git'); // 切换到master分支并拉取最新代码,解决分离头指针问题 await execute('git checkout master'); await execute('git pull origin master'); // 执行版本更新,禁用yarn自动Git操作,手动控制提交流程 await execute(`yarn version --patch --no-git-tag-version`); // 提交版本变更(根据项目情况添加lock文件) await execute('git add package.json'); // 动态获取新版本号作为提交信息 await execute(`git commit -m "chore: bump version to $(node -p "require('./package.json').version")"`); // 手动打标签并推送 await execute(`git tag v$(node -p "require('./package.json').version")`); await execute('git push origin master --tags');
3. 关键调整说明
git checkout master:从分离头指针状态切换到master分支,确保后续操作基于正确分支git pull origin master:同步远程最新代码,避免版本冲突yarn version --patch --no-git-tag-version:禁止yarn自动提交和打标签,避免与CI环境的Git状态冲突- 手动提交、打标签:确保版本变更被正确追踪并推送到远程仓库
二、GitLab上运行husky钩子的问题
可以在GitLab CI/CD中运行husky的post-commit或post-merge钩子,但需注意以下细节:
- 触发逻辑:husky钩子默认在本地Git操作时触发,CI环境中若通过脚本执行Git命令,需要手动调用钩子脚本
- 初始化要求:确保CI流水线安装依赖时,husky已完成初始化(执行
yarn install通常会自动配置钩子) - 权限配置:CI Runner需要有钩子脚本的执行权限,提前确保
.husky目录下的钩子文件有可执行权限(如chmod +x .husky/post-commit) - 实操建议:CI中执行版本更新这类操作时,直接在脚本中编写对应逻辑比依赖钩子更可控,可避免钩子在CI环境中触发不可预期的问题
内容的提问来源于stack exchange,提问作者Exlord

