我有一个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>
答案 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版本(如果已解决服务别名问题)。