You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原因分析

  1. 代理服务未加载用户配置:Azure DevOps构建代理以系统服务方式运行,不会加载ubuntu用户的.bashrc配置,导致你在cloud-init中设置的全局Git配置未生效。流水线的checkout任务使用Git默认行为创建了版本1的仓库,而旧版本的LibGit2Sharp(Docker容器内)不支持该版本。
  2. 手动克隆与流水线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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:02:09