无法使用我的免费帐户连接到Gitlab CI中的容器

时间:2019-09-26 16:40:30

标签: gitlab gitlab-ci get-event-store

我有一个gitlab的免费帐户。 我也有一个公司帐户(不确定哪个计划)。

我有完全相同的项目,EventStore上的包装器。

在CI管道中,我想启动一个带有事件存储的容器,以便可以对其进行一些集成测试。

这是我的.gitlab-ci.yml,用于还原,编译,运行测试并发布nuget程序包

#Stages
stages:
  - ci
  - pack

#Global variables
variables:
  GITLAB_RUNNER_DOTNET_CORE: mcr.microsoft.com/dotnet/core/sdk:2.2
  EVENT_STORE: eventstore/eventstore:release-5.0.2
  NUGET_REPOSITORY: $NEXUS_NUGET_REPOSITORY
  NUGET_API_KEY: $NEXUS_API_KEY
  NUGET_FOLDER_NAME: nupkgs

#Docker image
image: $GITLAB_RUNNER_DOTNET_CORE

#Jobs
ci:
  stage: ci
  services:
    - $EVENT_STORE
  variables:
    # event store service params testing with standard ports
    EVENTSTORE_INT_TCP_PORT: "1113"
    EVENTSTORE_EXT_TCP_PORT: "1113"
    EVENTSTORE_INT_HTTP_PORT: "2113"
    EVENTSTORE_EXT_HTTP_PORT: "2113"
    EVENTSTORE_EXT_HTTP_PREFIXES: "http://*:2113/"   
  script:
    - dotnet restore --no-cache --force
    - dotnet build --configuration Release
    - dotnet vstest test/*Tests/bin/Release/**/*Tests.dll

pack-beta-nuget:
  stage: pack
  script:
    - export VERSION_SUFFIX=beta$CI_PIPELINE_ID
    - dotnet pack *.sln --configuration Release --output $NUGET_FOLDER_NAME --version-suffix $VERSION_SUFFIX --include-source --include-symbols -p:SymbolPackageFormat=snupkg
    - dotnet nuget push **/*.nupkg --api-key $NUGET_API_KEY --source $NUGET_REPOSITORY
  except:
    - master

pack-nuget:
  stage: pack
  script:
    - dotnet restore
    - dotnet pack *.sln --configuration Release --output $NUGET_FOLDER_NAME
    - dotnet nuget push **/*.nupkg --api-key $NUGET_API_KEY --source $NUGET_REPOSITORY
  only:
    - master

如您所见,我启动了事件存储容器。

在集成测试中,我尝试使用以下连接字符串连接到CI中的容器: "ConnectTo=tcp://admin:changeit@127.0.0.1:1113; HeartBeatTimeout=500;";

使用我的工作帐户,它可以正常工作,在端口1113上有一个侦听127.0.0.1的容器,我可以使用上述连接字符串连接到它。

使用我的免费个人帐户,它无法连接。

为什么?

我怀疑这与gitlab CI运行程序上都可以使用docker的方式有关,但是为什么有所不同?

更重要的是,如何在我的免费帐户的个人CI管道上配置事件存储,以便在本地主机由于某种原因不是有效的主机Uri时可以连接到它?< / p>

1 个答案:

答案 0 :(得分:2)

嗯,您没有提供任何详细信息,但似乎您正在使用Docker执行器。在这种情况下,服务 localhost上不可用,而只能作为服务别名访问。

这是工作CI文件的摘录:

test:
  stage: test
  script:
    - dotnet test
  variables:
    ASPNETCORE_ENVIRONMENT: Testing
    EVENTSTORE_EXT_HTTP_PORT: 2113
    EVENTSTORE_EXT_TCP_PORT: 1113
    EVENTSTORE_RUN_PROJECTIONS: all
    EVENTSTORE_START_STANDARD_PROJECTIONS: "true"
    EventStore__ConnectionString: ConnectTo=tcp://admin:changeit@eventstore:1113
  services:
    - name: eventstore/eventstore:latest
      alias: eventstore
  only:
    refs:
      - branches
      - tags

要使其正常工作,您的appsettings.Testing.json文件需要指向ConnectTo=tcp://admin:changeit@eventstore:1113

如果要继续使用指向localhost的配置的appsettings文件,则可以使用CI文件中的env变量覆盖该设置。只记得添加环境变量作为配置源。上面的代码段具有这样的覆盖,与我们的设置结构相匹配:

{
  "EventStore": {
    "ConnectionString": "ConnectTo=whatever"
  }
}

如果您决定使用Kubernetes执行器,则将需要恢复使用localhost,因为Kubernetes执行器为每个构建都创建了一个包含多个容器(包括所有服务容器)的容器。有一个开放的问题来支持Kubernetes跑步者的服务别名,我想很快就会达到12.9或13。话虽这么说,使用服务别名是一种使它们全部正常工作的安全方法,并且可以用于将来。

P.S。只是注意到您的设置适用于一个帐户,而不适用于另一个帐户。我的猜测是,您将使用不同的执行程序(Docker无法运行而Kubernetes可以运行)或不同的GitLab版本(如果已解决服务别名问题)。