GitLab now supports nuget public and private feed repository.
I've got a public project (e.g: https://gitlab.com/sunnyatticsoftware/sasw-test-support)
I create an access token for my user with api and write_repository (e.g: AAABBBCCCDDD)
I create a group variable in my CI/CD: SASW_API_ACCESS_TOKEN: AAABBBCCCDDD. All normal.
Then I create the multi stage CI/CD script to build, pack and publish.
When attempting to publish the nuGet package with the following:
dotnet nuget push **/*.nupkg --source https://gitlab.com/api/v4/projects/17141695/packages/nuget/index.json --api-key AAABBBCCCDDD --skip-duplicate
I get the …
我在Visual Studio Online的Git中创建了一个虚拟的Hello World ASP.NET 5(MVC 6)项目.我按照本文档中描述的步骤构建并部署到我的Azure网站中.
我花了好几次尝试,因为构建失败了,例如"无法恢复NuGet包"或不存在的www文件夹(我必须提交源代码控制以使其工作),但我得到了它的工作,应用程序启动并运行.
我需要帮助的问题是持续集成配置.在Visual Studio中,只要在我的主分支中签入,我就选择了CI触发器来构建/部署.这会正确触发尝试,但它会因此错误而一直失败.
Error Code: ERROR_FILE_IN_USE
More Information: Web Deploy cannot modify the file 'AspNet.Loader.dll' on the destination because it is locked by an external process. In order to allow the publish operation to succeed, you may need to either restart your application to release the lock, or use the AppOffline rule handler for .Net applications on your next publish attempt.
如何解决这个问题呢?
谢谢.
PS:另外我不知道为什么在部署的Azure网站中我看不到日志.当我使用GitHub挂钩时,它用于显示所有失败/成功的部署.
通常在Azure应用程序>部署中的Azure中
continuous-integration azure tfsbuild azure-devops asp.net-core
希望有人尝试过与MVC 6和Swagger中的版本化API类似的东西,以显示有关不同版本的文档.
我在这个ASP.NET 5存储库中使用MVC 6中推荐的API版本.我所做的唯一改变是GetVersion方法从请求的自定义http头读取api版本:
//in VersionRangeValidator.cs
public static string GetVersion(HttpRequest request)
{
//return request.Query["version"];
if (!string.IsNullOrWhiteSpace(request.Headers[Constants.CommonRoutingDefinitions.ApiVersionSegmentName]))
{
return request.Headers[Constants.CommonRoutingDefinitions.ApiVersionSegmentName];
}
return Constants.CommonRoutingDefinitions.CurrentApiVersion;
}
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的控制器:
[Route("api/[controller]")]
[Produces(Constants.MediaTypeNames.ApplicationJson)]
public class TagsController : Controller
{
private readonly ITagService _tagService;
public TagsController(ITagService tagService)
{
_tagService = tagService;
}
/// <summary>
/// Version 1 by default
/// </summary>
/// <returns>All the tags</returns>
[HttpGet]
[Produces(typeof(IEnumerable<Tag>))]
public IEnumerable<Tag> GetTags()
{
IEnumerable<Tag> tags = _tagService.GetTags();
return tags;
}
/// <summary>
/// Version 2
/// </summary> …Run Code Online (Sandbox Code Playgroud) swagger swagger-ui asp.net-core-mvc api-versioning asp.net-core
我正在使用 GitLab,我需要创建一个.gitlab-ci.yml脚本来为生成 nuGet 包的项目运行持续集成管道。
我在寻找可靠的文档来回答这个问题时遇到了严重的问题:
我应该使用dotnet pack还是nuget pack?
nuget.exe 不能作为命令使用,除非我的 CI 脚本下载它(我正在使用 GitLab,所以我必须添加一些东西.gitlab-ci.yml才能这样做)。我的理解是dotnet隐式使用nuget,所以不需要直接使用nuget。
dotnet pack 命令的问题是我无法引用 nuspec 文件,它只是被忽略了。
我试过
dotnet pack 'MyProject.Nuget/MyProject.Nuget.csproj' /p:NuspecFile='MyProject.Nuget/MyProject.NuGet.nuspec' /p:PackageVersion=$VERSION --output nupkgs
Run Code Online (Sandbox Code Playgroud)
任何有关最新版本(dotnet --version2.1.401)正确方法的可靠文档都将不胜感激,因为我无法创建包含多个 dll 的有效 nuGet 包。
更新:替代方案是:
nuget pack ./*NuGet/*.nuspec -Version $VERSION -OutputDirectory pepe -Prop Configuration=Release -NoDefaultExcludes -Verbosity detailed
Run Code Online (Sandbox Code Playgroud) 我想使用 www.eventstore.org 编写一些集成测试来测试我是否能够序列化一些域事件并将它们附加到流中,并检索它们并反序列化它们等。
我一直在试图找出人们通常是如何做到这一点的,我阅读了一些 Greg Young 关于不同方法的回答(有点过时):
第二个选项似乎很理想,因为我可以简单地运行一个干净的事件存储,运行我的测试并在最后停止服务器,以便所有数据都消失了。
我已经看到可以使用参数运行事件存储服务器,--mem-db而不是在磁盘中保留任何内容。
问题是:如果运行集成测试的操作系统很可能没有安装事件存储二进制文件,因此在内存中没有真正的事件存储服务器可以运行,那么如何在运行集成测试时使用内存中事件存储?我不希望我的测试仅仅因为没有在执行测试的机器上安装和启动并运行事件存储而失败。
我知道市场上的一些数据库有一些 nuGet 包,其中包含生产中使用的相同数据库引擎,但作为内存数据库,因此机器上不需要“真实”服务器来运行测试。所有二进制文件都位于项目可用的 DLL 中。
我试图找到一些关于这样的东西是否可用于事件存储的答案。我读了一些关于某些嵌入式客户端 API 的评论,但我发现的文档不是很清楚。其他评论提到了一个叫做 MiniNode 的东西,但同样,线程假设太多,还没有找到关于它的内容或我如何用于我的测试的清晰描述。
总之,任何人都可以提供一个集成测试示例(如果可能,xUnit),其中IEventStoreConnection使用的是内存中事件存储,而根本没有安装事件存储?
更新 1:我尝试添加 nuGet 依赖项EventStore.Client.Embedded来使用它,以防万一它是我需要的。但它不支持 DotNetCore(标准 2.0),所以我不知道。然后我读了这个ClientAPI.NetCore 问题,有人建议采用不同的测试方法,即使用 Chocolatey 抓取EventStore代码,然后从代码中执行EventStore.ClusterNode(我会用--mem-db标志来做)。我不确定我是否喜欢这样,至少不会超过将 Docker 用于相同目的。我仍然想知道是否有替代方案?
更新 2由于我使用的是 gitlab,因此我通过启动一个事件存储服务(容器)来运行与事件存储的集成测试,该服务将在持续集成步骤结束后立即终止。
integration-tests:
image: my-images-repo/my-gitlab-runner-dotnet-core:latest
stage: integration-tests
services:
# add event store service
- eventstore/eventstore:release-4.1.1-hotfix1
variables:
# event store service params testing with standard ports
EVENTSTORE_INT_TCP_PORT: "1113"
EVENTSTORE_EXT_TCP_PORT: "1113" …Run Code Online (Sandbox Code Playgroud) 我正在使用 GitLab 为我的 dotnet 核心应用程序和 netstandard 2.0 包配置语义版本控制。
在阅读了相当多的意见后,其中一些意见相互矛盾,这对我来说很清楚。语义版本应该类似于
M.m.P.B-abc123where
M 是主要版本 m 是次要版本 P 是补丁版本 B 是构建版本(可选)-abc123是后缀(可选)以防我使用预发行版。它必须以字母开头因此,以下软件包版本将是有效的:
1.0.01.0.1.201903011231.0.1.20190301123-beta1.0.1-rc1我的版本控制有以下 gitlab 脚本
#Stages
stages:
- ci
- pack
#Global variables
variables:
GITLAB_RUNNER_DOTNET_CORE: mcr.microsoft.com/dotnet/core/sdk:2.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
script:
- dotnet restore --no-cache --force
- dotnet build --configuration Release
- dotnet vstest *Tests/bin/Release/**/*Tests.dll
pack-beta-nuget:
stage: pack
script:
- export VERSION_SUFFIX=beta$CI_PIPELINE_ID
- dotnet pack *.sln …Run Code Online (Sandbox Code Playgroud) 默认的 dotnet core 3 web api 模板假定控制器与 Startup.cs
如何让它知道不同程序集中的控制器?
我个人喜欢让我的解决方案更有层次,并且只取决于它需要依赖的东西
MyApp.Host --> MyApp.WebApi --> MyApp.Application --> MyApp.Domain
Run Code Online (Sandbox Code Playgroud)
因此,MyApp.Host我不希望对 MVC 框架有任何直接依赖(尽管我知道在 Dotnet Core 3 中这已经是隐式的)。控制器在MyApp.WebApi
我正在实现一个库,供事件的发布者和消费者通过 Azure 服务总线进行通信,我认为 MassTransit 可能是一个不错的选择。
我能够用它发布多个事件,并且如果我让 MassTransit 创建它需要的任何主题,并通过在消费者上仅指定我指定队列名称的 3 种事件类型的接收器端点,则可以让多个消费者毫无问题地接收它们。
消费者示例:
var busControl =
Bus.Factory.CreateUsingAzureServiceBus(
cfg =>
{
CreateAzureServiceBusHost(cfg, serviceBusUri, serviceBusKeyName, serviceBusKey);
cfg.ReceiveEndpoint(queueName, endpoint =>
{
foreach (var eventDtoType in eventsTypes)
{
var adapterType = typeof(EventHandlerAdapter<>).MakeGenericType(eventDtoType);
var resolvedType = sp.GetService(adapterType);
endpoint.Consumer(adapterType, type => resolvedType);
}
});
});
Run Code Online (Sandbox Code Playgroud)
请注意,我将 an 指定为使用者,EventHandlerAdapterType<TEvent>因为我有一个适配器来从 MassTransit 中抽象事件处理程序。但这与这个问题无关。
发布者配置如下:
var busControl =
Bus.Factory.CreateUsingAzureServiceBus(
cfg =>
{
CreateAzureServiceBusHost(cfg, serviceBusUri, serviceBusKeyName, serviceBusKey);
});
Run Code Online (Sandbox Code Playgroud)
问题是我需要使用这个与创建自己主题的系统集成的库,并且它具有安全性(只有某些应用程序可以发布到它,只有某些应用程序可以读取已发布到该主题的消息)
因此,我需要为想要发布特定主题事件的发布者以及想要阅读特定主题的消费者创建一个令牌 sas。不过,令牌的创建超出了这个问题的范围。
我的解决方案尝试:我在Azure服务总线中准备以下场景: - 创建主题topic-attempt-one(启用分区,但不确定是否相关) …
masstransit azureservicebus azure-servicebus-queues azure-servicebus-topics azure-servicebus-subscriptions
这是一个有点普遍的问题,因为它不仅适用于我的场景(使用 Azure 服务总线),而且适用于发布/订阅事件的上下文中的任何事件总线。
问题是:是否更倾向于拥有一个不能在生产者之间共享主题的架构/拓扑? 换句话说:每个事件生产者一个主题 VS 多个生产者共享一个主题?
我有一个明确的偏好:一个主题应该只由一个制作人拥有和访问,如果其他制作人。但我似乎是团队中唯一一个持这种观点的人,而其他人似乎“为简单起见”在不同事件制作者之间共享同一主题似乎没有任何问题,而且我无法在技术可行性方面真正争论。 .
我希望从更技术的角度找到有价值的答案和良好实践,因为我的推理是从更多业务/组织的角度出发,因为我来自 DDD 背景,而其他人则没有。
如您所见,从 DDD 的角度来看,需要在同一主题中发布的多个生产者会引发设计气味。我并不是说它不能完成,我试图从技术角度找出是否也应该避免它。
任何有这方面实践经验的人?
PS:有一个关于 Kafka 的类似问题,但我认为这与 Kafka 对发布者 - 订阅者使用不同的技术方法完全相同
更新 1:我不知道 NServiceBus,但我已经在 MassTransit 上工作了一些,当利用 MassTransit 的拓扑创建(这是唯一的方法 afaik)时,它不仅为每个生产者而且每个消息类型创建了不同的主题。
architecture event-bus message-bus azureservicebus azure-servicebus-topics
我运行的是 Ubuntu 18.04
\n\n$ uname -r\n5.3.0-46-generic\nRun Code Online (Sandbox Code Playgroud)\n\n我已经安装了docker
\n\n$ docker --version\nDocker version 19.03.8, build afacb8b7f0\nRun Code Online (Sandbox Code Playgroud)\n\n我有一个简单的 docker 映像,它公开端口 80。生成它的 Dockerfile 是
\n\nFROM mcr.microsoft.com/dotnet/core/aspnet:3.1\nCOPY publish .\nEXPOSE 80\nENTRYPOINT ["dotnet", "SampleWebApp.dll"]\nRun Code Online (Sandbox Code Playgroud)\n\n当我为此图像运行容器时,我可以看到以下内容:
\n\n$ docker run myimage:latest -p 8080:80\ninfo: Microsoft.Hosting.Lifetime[0]\n Now listening on: http://[::]:80\ninfo: Microsoft.Hosting.Lifetime[0]\n Application started. Press Ctrl+C to shut down.\ninfo: Microsoft.Hosting.Lifetime[0]\n Hosting environment: Production\ninfo: Microsoft.Hosting.Lifetime[0]\n Content root path: /\nRun Code Online (Sandbox Code Playgroud)\n\n如果我看到容器正在运行:
\n\n$ docker ps\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n6f5bea7b329d registry.gitlab.com/whatever/myimage:latest "dotnet SampleWebApp\xe2\x80\xa6" 4 …Run Code Online (Sandbox Code Playgroud) asp.net-core ×3
.net-core ×2
dotnet-cli ×2
gitlab ×2
gitlab-ci ×2
architecture ×1
asp.net-mvc ×1
azure ×1
azure-devops ×1
azure-servicebus-subscriptions ×1
c# ×1
csproj ×1
docker ×1
event-bus ×1
eventstoredb ×1
in-memory ×1
linux ×1
masstransit ×1
message-bus ×1
nuget ×1
swagger ×1
swagger-ui ×1
tfsbuild ×1
ubuntu-18.04 ×1