Windows自托管流水线Runner中BITBUCKET_BUILD_NUMBER取值为空
问题根因
Fork仓库提交触发分支流水线时,BITBUCKET_BUILD_NUMBER返回空字符串是Bitbucket的默认安全机制导致的:所有来自Fork仓库的流水线运行在受限安全上下文,默认不会注入全量内置变量、密钥,避免外部贡献者通过提交恶意PR窃取流水线敏感信息。
解决方法
方案1:放开Fork流水线的变量访问权限
如果所有向你仓库提交PR的Fork贡献者都是可信的,可以直接修改仓库配置放开权限:
- 进入目标仓库的「Repository settings > Pipelines > Settings」页面
- 找到
Fork pull request workflows配置段 - 选中
Allow access to all variables and secrets选项 - 保存配置后重新触发流水线,即可正常读取
BITBUCKET_BUILD_NUMBER变量
风险提示:放开该权限后,Fork PR中的任意执行脚本都可以访问你配置的所有流水线密钥、内置变量,请确认信任所有贡献者后再操作。
方案2:脚本增加兜底逻辑生成构建编号(更安全)
如果不想放开全局变量权限,可以在执行脚本中增加兜底判断:当BITBUCKET_BUILD_NUMBER为空时,用一定会注入的基础变量组合生成唯一构建编号,适配你当前Windows自托管runner的配置示例如下:
image: atlassian/default-image:3 pipelines: branches: feature/*: - step: name: 'Build and Test' runs-on: - 'self.hosted' - 'windows' - 'aio' script: # PowerShell适配:优先用内置构建号,为空则用PRID+提交短哈希生成唯一编号 - $env:BUILD_NUMBER = if ($env:BITBUCKET_BUILD_NUMBER) { $env:BITBUCKET_BUILD_NUMBER } else { "fork-$($env:BITBUCKET_PR_ID)-$($env:BITBUCKET_COMMIT.Substring(0,7))" } - echo "Build and test" - ant -buildfile ReportGen/build.xml jar - echo "Deploying artifacts to /denver/integration/${env:BUILD_NUMBER}/" - jf rt u out/dist/* "test-generic-local/denver/integration/${env:BUILD_NUMBER}/"
说明:
BITBUCKET_COMMIT(当前提交哈希)、BITBUCKET_PR_ID(PR编号)属于基础上下文变量,即使是受限的Fork流水线也会默认注入,组合生成的编号可以保证全局唯一,满足制品路径区分需求。
方案3:单独拆分PR流水线规则
可以把Fork PR触发的流水线和本仓库分支推送触发的流水线拆分配置,单独为pull-requests事件配置流水线规则,仅对PR流水线做变量兜底或者权限配置,不影响本仓库内分支推送的原有流水线逻辑。
内容的提问来源于stack exchange,提问作者videoguy
相关产品推荐
相关产品推荐

