EC2作为Azure DevOps构建机时NerdBank GitVersioning报错排查
AWS EC2作为Azure DevOps构建机:NerdBank GitVersioning Docker容器报错解决
问题详情
将AWS EC2实例配置为Azure DevOps构建代理,流水线中使用NerdBank GitVersioning Docker容器获取版本号,流水线步骤如下:
steps: - checkout: self fetchDepth: 0 - script: | docker pull andrewlock/nerdbank-gitversioning:latest displayName: 'Pull Docker Image' - script: | VERSION=$(docker run --rm -v $(pwd):$(pwd) -w $(pwd) andrewlock/nerdbank-gitversioning:latest get-version | grep -oP '(^Version:)\K.*' | xargs) echo "Version found: $VERSION" echo "##vso[task.setvariable variable=VERSION]$VERSION" # Sets VERSION as a variable for later steps displayName: 'Get version from Docker'
在EC2实例上运行流水线时出现错误:
Unhandled Exception: LibGit2Sharp.LibGit2SharpException: unsupported repository version 1. Only versions up to 0 are supported. at LibGit2Sharp.Core.Ensure.HandleError(Int32 result) at LibGit2Sharp.Core.Proxy.git_repository_open(String path) at LibGit2Sharp.Repository..ctor(String path, RepositoryOptions options, RepositoryRequiredParameter requiredParameter) at Nerdbank.GitVersioning.GitExtensions.OpenGitRepo(String pathUnderGitRepo) at Nerdbank.GitVersioning.Tool.Program.OnGetVersionCommand(String projectPath, String format, String versionOrRef) in D:\a\1\s\src\nbgv\Program.cs:line 236 at Nerdbank.GitVersioning.Tool.Program.Main(String[] args) in D:\a\1\s\src\nbgv\Program.cs:line 110 Version not found! Failing the pipeline.
已尝试的操作:
- 在cloud-init启动脚本中设置Git全局配置
core.repositoryFormatVersion为0,本地仓库配置显示版本为0 - 手动克隆仓库并执行Docker命令可正常运行
- 本地笔记本作为构建代理时流水线运行正常
附完整cloud-init脚本:
#!/bin/bash export VSTS_AGENT_INPUT_URL=${url} export VSTS_AGENT_INPUT_AUTH=pat export VSTS_AGENT_INPUT_TOKEN=${token} export VSTS_AGENT_INPUT_POOL=${pool} echo "export VSTS_AGENT_INPUT_URL=${url}" >> /home/ubuntu/.bashrc echo "export VSTS_AGENT_INPUT_AUTH=pat" >> /home/ubuntu/.bashrc echo "export VSTS_AGENT_INPUT_TOKEN=${token}" >> /home/ubuntu/.bashrc echo "export VSTS_AGENT_INPUT_POOL=${pool}" >> /home/ubuntu/.bashrc cd /home/ubuntu usermod -aG docker ubuntu wget https://vstsagentpackage.azureedge.net/agent/4.248.0/vsts-agent-linux-x64-4.248.0.tar.gz mkdir myagent && cd myagent tar zxvf ../vsts-agent-linux-x64-4.248.0.tar.gz ./bin/installdependencies.sh chown -R ubuntu:ubuntu . su ubuntu -c './config.sh --unattended' echo "HOME=/home/ubuntu" >> .env ./svc.sh install mkdir -p _work chown -R ubuntu:ubuntu _work su ubuntu -c './run.sh' cleanup_agent() { echo "Stopping and unregistering the build agent..." su ubuntu -c './config.sh remove --unattended --token ${token}' ./svc.sh stop ./svc.sh uninstall } trap cleanup_agent SIGTERM SIGINT while true; sleep 60 done
原因分析
- 代理服务未加载用户配置:Azure DevOps构建代理以系统服务方式运行,不会加载ubuntu用户的
.bashrc配置,导致你在cloud-init中设置的全局Git配置未生效。流水线的checkout任务使用Git默认行为创建了版本1的仓库,而旧版本的LibGit2Sharp(Docker容器内)不支持该版本。 - 手动克隆与流水线checkout环境差异:手动克隆时在交互式shell中执行,加载了
.bashrc的Git配置,创建的是版本0的仓库,因此Docker命令能正常运行;但流水线的checkout步骤运行在代理服务的无交互环境中,未应用该配置。
解决方案
方法1:设置系统级Git全局配置
修改cloud-init脚本,在安装代理前直接设置系统级和ubuntu用户的Git全局配置,确保代理服务能读取到:
# 在cloud-init脚本中,usermod -aG docker ubuntu之后添加以下内容 git config --global core.repositoryFormatVersion 0 su ubuntu -c 'git config --global core.repositoryFormatVersion 0'
方法2:在流水线checkout步骤强制指定仓库版本
修改流水线的checkout步骤,添加Git配置参数,确保checkout时创建版本0的仓库:
steps: - checkout: self fetchDepth: 0 checkoutOptions: gitConfig: - name: core.repositoryFormatVersion value: '0' - script: | docker pull andrewlock/nerdbank-gitversioning:latest displayName: 'Pull Docker Image' # 后续步骤不变
方法3:更新NerdBank GitVersioning镜像
使用官方最新版NerdBank GitVersioning镜像,其内置的LibGit2Sharp已支持仓库版本1:
steps: - checkout: self fetchDepth: 0 - script: | docker pull nerdbank/gitversioning:latest displayName: 'Pull Docker Image' - script: | VERSION=$(docker run --rm -v $(pwd):$(pwd) -w $(pwd) nerdbank/gitversioning:latest get-version | grep -oP '(^Version:)\K.*' | xargs) echo "Version found: $VERSION" echo "##vso[task.setvariable variable=VERSION]$VERSION" displayName: 'Get version from Docker'
内容的提问来源于stack exchange,提问作者Tom McLean
相关产品推荐
相关产品推荐

