Bitbucket流水线在Windows自托管运行器上无法为分支打标签
报错原因
报错核心是Git推送标签时无法自动获取认证凭据,触发了交互式用户名/密码输入流程,但Bitbucket流水线的自托管运行器以后台服务模式运行时没有挂载交互终端(tty),无法响应输入请求直接中断。具体触发逻辑:
- 手动重置Git origin地址时直接使用了未携带认证信息的原始地址
$Env:BITBUCKET_GIT_HTTP_ORIGIN,Git访问远端时找不到可用凭据,默认会启动交互式提示要求输入用户名密码 - Windows环境下Git for Windows会尝试调用bash组件渲染认证输入提示,因为没有可用tty设备先抛出
/dev/tty: No such device or address错误,后续认证流程直接失败 - 原脚本存在逻辑问题:仅执行了
git push --dry-run,实际推送标签的命令前加了echo,根本没有真实执行推送操作
修复步骤
按以下顺序调整配置即可正常完成标签推送:
- 提前配置Git为非交互模式,禁止弹出任何认证提示,从根源避免tty相关报错。在所有Git操作前添加以下PowerShell命令:
git config --global core.askPass "" git config --global credential.helper wincred - 重设origin地址时,把Bitbucket流水线自动生成的临时克隆令牌内嵌到远端地址中,跳过认证交互流程。Bitbucket自托管运行器会自动注入
BITBUCKET_CLONE_TOKEN环境变量,该令牌拥有当前仓库的读写权限,替换原来的remote设置命令:$authOrigin = $Env:BITBUCKET_GIT_HTTP_ORIGIN -replace "^https://", "https://x-token-auth:$Env:BITBUCKET_CLONE_TOKEN@" git remote set-url origin $authOrigin - 修正推送逻辑,去掉实际push命令前的
echo,真实执行标签推送:# 移除原来的dry-run和echo行,替换为实际推送命令 git push origin "${REPO_TAG}" - 提前在Bitbucket仓库设置中确认流水线权限:开启「允许流水线对仓库进行写操作」的开关,避免令牌权限不足导致推送被拒。
修正后的完整流水线步骤参考
- step: name: 'Tag the repo with build label' runs-on: - 'self.hosted' - 'windows' - 'aio' script: - echo "Tagging repo with label" - git config --global core.askPass "" - git config --global credential.helper wincred - if ( $Env:BITBUCKET_BRANCH -match "feature/*" ) { ${BRANCH_PART} = "integration"; } elseif ( $Env:BITBUCKET_BRANCH -match "release/*" ) { ${BRANCH_PART} = "release"; }; - ${RELEASE_CODENAME}="chicago"; - ${REPO_TAG} = "${BRANCH_PART}_${RELEASE_CODENAME}_$Env:BITBUCKET_BUILD_NUMBER"; - git tag -am "Tagging for build $Env:BITBUCKET_BUILD_NUMBER" "${REPO_TAG}"; - $authOrigin = $Env:BITBUCKET_GIT_HTTP_ORIGIN -replace "^https://", "https://x-token-auth:$Env:BITBUCKET_CLONE_TOKEN@" - git remote set-url origin $authOrigin - git push origin "${REPO_TAG}";
注意:如果你的运行器是用域账号/本地用户账号以后台服务模式启动的,提前确认该运行器服务的登录账号有Git配置的读写权限,避免Git配置命令执行失败。
内容的提问来源于stack exchange,提问作者videoguy
相关产品推荐
相关产品推荐

