我们正在使用带有角色、模板、中央存储库等的 ansible 设置来进行部署。 并正在致力于创建一个新的部署管道,其中需要针对每个环境修复 1 个相关存储库的源分支。 即 master_D 代表 DEV,master_T 代表 TST env,等等
用户通过 UI 触发部署管道时选择一个环境。
环境被翻译为分支名称:
variables:
- name: Branch
${{ if eq(parameters['Environment'], 'DEV') }}:
value: master_D
分支名称在存储库定义中使用:
resources:
repositories:
- repository: SourceCode
type: git
name: Repos/SourceCode
ref: $(Branch)
在通用构建模板中,检出存储库以进行进一步处理:
stages:
- stage: 'Build_ansible_playbook'
displayName: 'Build ansible playbook'
jobs:
- job: 'Build_ansible_playbook'
pool: 'Azure Pipelines'
steps:
- checkout: SourceCode
fetchDepth: 1
clean: true
displayName: Checkout SourceCode inventories
这个效果很好。差不多了。
我面临的问题是,在用户界面中有一个“资源”菜单,用户可以在其中为每个涉及的存储库选择一个版本。所以基本上,用户(我们有大约 200 个用户)能够为存储库“SourceCode”选择不同的分支,这将简单地覆盖管道的分支设置。
我正在努力阻止这种情况发生。思路:
修改“签出”步骤以专门签出预定义分支,或者
捕获已签出分支的分支名称(并在继续执行剧本之前验证它)
我对这两件事的运气都是零。 checkout 似乎没有任何分支命名选项,并且不支持开箱即用地捕获实际签出的存储库的分支名称。任何帮助将不胜感激!
经过长时间的搜索和无数次无结果的尝试将运行时变量传递给模板,我终于找到了一个可行的解决方案
部署管道中定义的其他变量以捕获实际使用的分支:
- name: RefActual
value: $[ resources.repositories.SourceCode.ref ]
- name: BranchActual
value: $[replace(variables.RefActual, 'refs/heads/', '')]
将提到的通用构建模板保留原样。并接受这样一个事实:如果用户覆盖分支设置,将会生成不正确的构建。
Branch 和 BranchActual 被传递到部署阶段剧本(在我们的例子中,通过参数集,因为它首先通过通用部署模板路由),并且添加了一个 bash 任务来执行检查:
- bash: |
echo "Expected Branch: ${{ parameters.ParamSet.Branch }}"
echo "Actual Branch: ${{ parameters.ParamSet.BranchActual }}"
if [ ${{ parameters.ParamSet.Branch }} = ${{ parameters.ParamSet.BranchActual }} ]; then
echo "Branch verified"
else
echo "Branch mismatch detected"
exit 1
fi