【问题标题】:Why is my TeamCity internal NuGet feed missing part of its URL?为什么我的 TeamCity 内部 NuGet 提要缺少部分 URL?
【发布时间】:2020-07-19 10:52:38
【问题描述】:

我的 TeamCity 服务器似乎为其内置 NuGet 提要使用了损坏的 URL。

我使用官方 JetBrains 映像在 docker 容器中运行它。我不在反向代理后面。我已经配置了“服务器 URL”设置。

我可以使用完整的 URL(未经身份验证的访客访问)在 Visual Studio 中使用提要,这一切都很好。它从构建工件中添加包,Visual Studio 可以提取它们。

只是应该包含提要 URL 的 TeamCity 属性已损坏,如屏幕截图所示。所以我的构建失败是这样的:

/usr/share/dotnet/sdk/3.1.302/NuGet.targets(128,5):错误:无法加载源 http://teamcity:8111/guestAuth/app/nuget/feed 的服务索引/TigraOss/TigraOSS/v3/index.json.

这些是内部生成的,不是我编辑过的,所以我有点困惑。有想法该怎么解决这个吗? (显然,我已经尝试重新启动服务器)。

更新

认为这可能是因为一切都在 docker 容器中运行。稍后在参数屏幕中(上方屏幕截图的底部)是另一行:

teamcity.serverUrl http://teamcity:8111

我认为这是来自我的docker-compose.yml 文件:

  agent:
    image: jetbrains/teamcity-agent
    container_name: teamcity-agent
    restart: unless-stopped
    privileged: true
    user: "root"
    environment:
      - SERVER_URL=http://teamcity:8111
      - AGENT_NAME=ubuntu-ovh-vps-tigra
      - DOCKER_IN_DOCKER=start
    volumes:
      - agentconfig:/data/teamcity_agent/conf
      - agentwork:/opt/buildagent/work
      - agentsystem:/opt/buildagent/system
      - agent1_volumes:/var/lib/docker

我尝试更改我的docker-compose.yml 文件中的 SERVER_URL 值并重新启动代理容器,但看起来一旦代理配置文件创建后,该值就很粘,我需要进入并手动编辑它。

现在我的代理使用了服务器的完整 FQDN,所以我们看看它是否有效。

【问题讨论】:

  • 如果您查看以前的构建和参数,serverl URL 是否与您在设置中设置的匹配?右边的这些值是由插件生成的吗?
  • 屏幕截图是通过查看构建结果并查看“参数”选项卡拍摄的,因此这些是用于构建的实际结果。再往下一点,有这样一行: > teamcity.serverUrl teamcity:8111 对我来说,这就像一支确凿的证据。我想知道这是否是因为代理在 docker 容器内运行? “teamcity”是服务器 docker 服务的名称。你可能把我放在了那里。

标签: configuration nuget teamcity


【解决方案1】:

我认为这是由我复杂的 docker-in-docker 构建引起的。我正在使用 docker-compose 构建的 docker 容器中运行 TeamCity 服务器和 linux 构建代理。这是我的docker-compose.yml 文件,其中已删除机密:

version: '3'

services:
  db:
    image: mariadb
    container_name: teamcity-db
    restart: unless-stopped
    env_file: .env
    volumes: 
      - mariadb:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password

  teamcity:
    depends_on: 
      - db
    image: jetbrains/teamcity-server
    container_name: teamcity
    restart: unless-stopped
    environment:
      - TEAMCITY_SERVER_MEM_OPTS="-Xmx750m"
    volumes: 
      - datadir:/data/teamcity_server/datadir
      - logs:/opt/teamcity/logs
    ports:
      - "8111:8111"

  agent:
    image: jetbrains/teamcity-agent
    container_name: teamcity-agent
    restart: unless-stopped
    privileged: true
    user: "root"
    environment:
      SERVER_URL: http://fully.qualified.name:8111
      AGENT_NAME: my-agent-name
      DOCKER_IN_DOCKER: start
    volumes:
      - agentconfig:/data/teamcity_agent/conf
      - agentwork:/opt/buildagent/work
      - agentsystem:/opt/buildagent/system
      - agent1_volumes:/var/lib/docker

volumes:
  mariadb:
  datadir:
  logs:
  agentconfig:
  agentwork:
  agentsystem:
  agent1_volumes:

networks:
  default:

当我第一次创建所有内容时,我将 SERVER_URL 变量设置为“http://teamcity:8111”。这是因为 Docker 将主机名映射到服务名,该服务名也是“teamcity”,因此主机可以在 docker 组合中解析。

在另一个容器中执行构建步骤时会出现问题。 我正在构建 .NET Core 并且机器上没有安装 .NET SDK, 所以我必须使用 .NET Core SDK 容器运行构建。

代理传入 NuGet 提要的 URL,该 URL 指向 docker 服务名称,而构建容器无法“看到”该主机名。我不知道为什么不。我尝试将--network teamcity_default 作为命令行参数传递给 docker run,但它说网络不存在。

我找到了两种让事情发挥作用的方法。

  1. 编辑构建步骤以使用 nuget 提要的 FQDN,并且不要使用 teamcity 内置参数 %teamcity.nuget.feed.guestAuth.feed-id.v3%。我不太喜欢这个解决方案,因为它让我在未来陷入困境。
  2. 找到存储 teamcity 代理配置的 docker 卷。就我而言,它是/var/lib/docker/volumes/teamcity_agentconfig/_data。编辑buildAgent.properties 文件并设置serverUrl=http\://fully.qualified.name\:8111。然后docker-compose restart agent。然后,您可以在容器化构建中安全地使用 %teamcity.nuget.feed.guestAuth.feed-id.v3%

我尚未对此进行测试,但我认为您可以通过在 docker-compose.yml 文件中使用完全限定的服务器名称来避免所有这些。但是,您必须从一开始就这样做,因为在您运行 docker-compose up 的那一刻,代理配置文件系统会被创建并成为永久的。

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多