@ -1,13 +0,0 @@ | |||
namespace Ordering.BackgroundTasks.Configuration | |||
{ | |||
public class BackgroundTaskSettings | |||
{ | |||
public string ConnectionString { get; set; } | |||
public string EventBusConnection { get; set; } | |||
public int GracePeriodTime { get; set; } | |||
public int CheckUpdateTime { get; set; } | |||
} | |||
} |
@ -1,25 +0,0 @@ | |||
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base | |||
WORKDIR /app | |||
EXPOSE 80 | |||
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build | |||
WORKDIR /src | |||
COPY scripts scripts/ | |||
COPY src/ApiGateways/*/*.csproj /src/csproj-files/ | |||
COPY src/ApiGateways/*/*/*.csproj /src/csproj-files/ | |||
COPY src/BuildingBlocks/*/*/*.csproj /src/csproj-files/ | |||
COPY src/Services/*/*/*.csproj /src/csproj-files/ | |||
COPY src/Web/*/*.csproj /src/csproj-files/ | |||
COPY . . | |||
WORKDIR /src/src/Services/Ordering/Ordering.BackgroundTasks | |||
RUN dotnet publish -c Release -o /app | |||
FROM build AS publish | |||
FROM base AS final | |||
WORKDIR /app | |||
COPY --from=publish /app . | |||
ENTRYPOINT ["dotnet", "Ordering.BackgroundTasks.dll"] |
@ -1,18 +0,0 @@ | |||
FROM microsoft/dotnet:2.2-sdk | |||
ARG BUILD_CONFIGURATION=Debug | |||
ENV ASPNETCORE_ENVIRONMENT=Development | |||
ENV DOTNET_USE_POLLING_FILE_WATCHER=true | |||
EXPOSE 80 | |||
WORKDIR /src | |||
COPY ["src/BuildingBlocks/EventBus/EventBus/EventBus.csproj", "src/BuildingBlocks/EventBus/EventBus/"] | |||
COPY ["src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj", "src/BuildingBlocks/EventBus/EventBusRabbitMQ/"] | |||
COPY ["src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj", "src/BuildingBlocks/EventBus/EventBusServiceBus/"] | |||
COPY ["src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj", "src/Services/Ordering/Ordering.BackgroundTasks/"] | |||
RUN dotnet restore src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj | |||
COPY . . | |||
WORKDIR /src/src/Services/Ordering/Ordering.BackgroundTasks | |||
RUN dotnet build --no-restore -c $BUILD_CONFIGURATION | |||
ENTRYPOINT ["dotnet", "run", "--no-build", "--no-launch-profile", "-c", "$BUILD_CONFIGURATION", "--"] |
@ -1,12 +0,0 @@ | |||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events; | |||
namespace Ordering.BackgroundTasks.IntegrationEvents | |||
{ | |||
public class GracePeriodConfirmedIntegrationEvent : IntegrationEvent | |||
{ | |||
public int OrderId { get; } | |||
public GracePeriodConfirmedIntegrationEvent(int orderId) => | |||
OrderId = orderId; | |||
} | |||
} |
@ -1,42 +0,0 @@ | |||
<Project Sdk="Microsoft.NET.Sdk.Web"> | |||
<PropertyGroup> | |||
<TargetFramework>$(NetCoreTargetVersion)</TargetFramework> | |||
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> | |||
<DockerComposeProjectPath>..\..\..\..\docker-compose.dcproj</DockerComposeProjectPath> | |||
<GenerateErrorForMissingTargetingPacks>false</GenerateErrorForMissingTargetingPacks> | |||
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled> | |||
<LangVersion>$(LangVersion)</LangVersion> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<Compile Remove="wwwroot\**" /> | |||
<Content Remove="wwwroot\**" /> | |||
<EmbeddedResource Remove="wwwroot\**" /> | |||
<None Remove="wwwroot\**" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="$(AspNetCore_HealthChecks_UI_Client)" /> | |||
<PackageReference Include="AspNetCore.HealthChecks.AzureServiceBus" Version="$(AspNetCore_HealthChecks_AzureServiceBus)" /> | |||
<PackageReference Include="AspNetCore.HealthChecks.Rabbitmq" Version="$(AspNetCore_HealthChecks_Rabbitmq)" /> | |||
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="$(Autofac_Extensions_DependencyInjection)" /> | |||
<PackageReference Include="Dapper" Version="$(Dapper)" /> | |||
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.HealthChecks" Version="$(Microsoft_AspNetCore_Diagnostics_HealthChecks)" /> | |||
<PackageReference Include="Microsoft.AspNetCore.HealthChecks" Version="$(Microsoft_AspNetCore_HealthChecks)" /> | |||
<PackageReference Include="AspNetCore.HealthChecks.SqlServer" Version="$(AspNetCore_HealthChecks_SqlServer)" /> | |||
<PackageReference Include="Serilog.AspNetCore" Version="$(Serilog_AspNetCore)" /> | |||
<PackageReference Include="Serilog.Enrichers.Environment" Version="$(Serilog_Enrichers_Environment)" /> | |||
<PackageReference Include="Serilog.Settings.Configuration" Version="$(Serilog_Settings_Configuration)" /> | |||
<PackageReference Include="Serilog.Sinks.Console" Version="$(Serilog_Sinks_Console)" /> | |||
<PackageReference Include="Serilog.Sinks.Seq" Version="$(Serilog_Sinks_Seq)" /> | |||
<PackageReference Include="Serilog.Sinks.Http" Version="$(Serilog_Sinks_Http)" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\..\..\BuildingBlocks\EventBus\EventBusRabbitMQ\EventBusRabbitMQ.csproj" /> | |||
<ProjectReference Include="..\..\..\BuildingBlocks\EventBus\EventBusServiceBus\EventBusServiceBus.csproj" /> | |||
<ProjectReference Include="..\..\..\BuildingBlocks\EventBus\EventBus\EventBus.csproj" /> | |||
</ItemGroup> | |||
</Project> |
@ -1,76 +0,0 @@ | |||
using Microsoft.AspNetCore; | |||
using Microsoft.AspNetCore.Hosting; | |||
using Microsoft.Extensions.Configuration; | |||
using Microsoft.Extensions.Logging; | |||
using Serilog; | |||
using System; | |||
using System.IO; | |||
namespace Ordering.BackgroundTasks | |||
{ | |||
public class Program | |||
{ | |||
public static readonly string Namespace = typeof(Program).Namespace; | |||
public static readonly string AppName = Namespace; | |||
public static int Main(string[] args) | |||
{ | |||
var configuration = GetConfiguration(); | |||
Log.Logger = CreateSerilogLogger(configuration); | |||
try | |||
{ | |||
Log.Information("Configuring web host ({ApplicationContext})...", AppName); | |||
var host = BuildWebHost(configuration, args); | |||
Log.Information("Starting web host ({ApplicationContext})...", AppName); | |||
host.Run(); | |||
return 0; | |||
} | |||
catch (Exception ex) | |||
{ | |||
Log.Fatal(ex, "Program terminated unexpectedly ({ApplicationContext})!", AppName); | |||
return 1; | |||
} | |||
finally | |||
{ | |||
Log.CloseAndFlush(); | |||
} | |||
} | |||
private static IWebHost BuildWebHost(IConfiguration configuration, string[] args) => | |||
WebHost.CreateDefaultBuilder(args) | |||
.CaptureStartupErrors(false) | |||
.UseStartup<Startup>() | |||
.UseConfiguration(configuration) | |||
.UseSerilog() | |||
.Build(); | |||
private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) | |||
{ | |||
var seqServerUrl = configuration["Serilog:SeqServerUrl"]; | |||
var logstashUrl = configuration["Serilog:LogstashgUrl"]; | |||
return new LoggerConfiguration() | |||
.MinimumLevel.Verbose() | |||
.Enrich.WithProperty("ApplicationContext", AppName) | |||
.Enrich.FromLogContext() | |||
.WriteTo.Console() | |||
.WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) | |||
.WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) | |||
.ReadFrom.Configuration(configuration) | |||
.CreateLogger(); | |||
} | |||
private static IConfiguration GetConfiguration() | |||
{ | |||
var builder = new ConfigurationBuilder() | |||
.SetBasePath(Directory.GetCurrentDirectory()) | |||
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) | |||
.AddEnvironmentVariables(); | |||
return builder.Build(); | |||
} | |||
} | |||
} |
@ -1,29 +0,0 @@ | |||
{ | |||
"iisSettings": { | |||
"windowsAuthentication": false, | |||
"anonymousAuthentication": true, | |||
"iisExpress": { | |||
"applicationUrl": "http://localhost:5161/", | |||
"sslPort": 0 | |||
} | |||
}, | |||
"profiles": { | |||
"IIS Express": { | |||
"commandName": "IISExpress", | |||
"launchBrowser": true, | |||
"launchUrl": "api/values", | |||
"environmentVariables": { | |||
"ASPNETCORE_ENVIRONMENT": "Development" | |||
} | |||
}, | |||
"Ordering.BackgroundTasks": { | |||
"commandName": "Project", | |||
"launchBrowser": true, | |||
"launchUrl": "api/values", | |||
"environmentVariables": { | |||
"ASPNETCORE_ENVIRONMENT": "Development" | |||
}, | |||
"applicationUrl": "http://localhost:5162/" | |||
} | |||
} | |||
} |
@ -1,199 +0,0 @@ | |||
using Autofac; | |||
using Autofac.Extensions.DependencyInjection; | |||
using HealthChecks.UI.Client; | |||
using Microsoft.AspNetCore.Builder; | |||
using Microsoft.AspNetCore.Diagnostics.HealthChecks; | |||
using Microsoft.Azure.ServiceBus; | |||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; | |||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; | |||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; | |||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus; | |||
using Microsoft.Extensions.Configuration; | |||
using Microsoft.Extensions.DependencyInjection; | |||
using Microsoft.Extensions.Diagnostics.HealthChecks; | |||
using Microsoft.Extensions.Hosting; | |||
using Microsoft.Extensions.Logging; | |||
using Ordering.BackgroundTasks.Configuration; | |||
using Ordering.BackgroundTasks.Tasks; | |||
using RabbitMQ.Client; | |||
using System; | |||
namespace Ordering.BackgroundTasks | |||
{ | |||
public class Startup | |||
{ | |||
public Startup(IConfiguration configuration) | |||
{ | |||
Configuration = configuration; | |||
} | |||
public IConfiguration Configuration { get; } | |||
// This method gets called by the runtime. Use this method to add services to the container. | |||
public IServiceProvider ConfigureServices(IServiceCollection services) | |||
{ | |||
//add health check for this service | |||
services.AddCustomHealthCheck(Configuration); | |||
//configure settings | |||
services.Configure<BackgroundTaskSettings>(Configuration); | |||
services.AddOptions(); | |||
//configure background task | |||
services.AddSingleton<IHostedService, GracePeriodManagerService>(); | |||
//configure event bus related services | |||
if (Configuration.GetValue<bool>("AzureServiceBusEnabled")) | |||
{ | |||
services.AddSingleton<IServiceBusPersisterConnection>(sp => | |||
{ | |||
var logger = sp.GetRequiredService<ILogger<DefaultServiceBusPersisterConnection>>(); | |||
var serviceBusConnectionString = Configuration["EventBusConnection"]; | |||
var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString); | |||
return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger); | |||
}); | |||
} | |||
else | |||
{ | |||
services.AddSingleton<IRabbitMQPersistentConnection>(sp => | |||
{ | |||
var logger = sp.GetRequiredService<ILogger<DefaultRabbitMQPersistentConnection>>(); | |||
var factory = new ConnectionFactory() | |||
{ | |||
HostName = Configuration["EventBusConnection"], | |||
DispatchConsumersAsync = true | |||
}; | |||
if (!string.IsNullOrEmpty(Configuration["EventBusUserName"])) | |||
{ | |||
factory.UserName = Configuration["EventBusUserName"]; | |||
} | |||
if (!string.IsNullOrEmpty(Configuration["EventBusPassword"])) | |||
{ | |||
factory.Password = Configuration["EventBusPassword"]; | |||
} | |||
var retryCount = 5; | |||
if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"])) | |||
{ | |||
retryCount = int.Parse(Configuration["EventBusRetryCount"]); | |||
} | |||
return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); | |||
}); | |||
} | |||
RegisterEventBus(services); | |||
//create autofac based service provider | |||
var container = new ContainerBuilder(); | |||
container.Populate(services); | |||
return new AutofacServiceProvider(container.Build()); | |||
} | |||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. | |||
public void Configure(IApplicationBuilder app) | |||
{ | |||
app.UseRouting(); | |||
app.UseEndpoints(endpoints => | |||
{ | |||
endpoints.MapHealthChecks("/hc", new HealthCheckOptions() | |||
{ | |||
Predicate = _ => true, | |||
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse | |||
}); | |||
endpoints.MapHealthChecks("/liveness", new HealthCheckOptions | |||
{ | |||
Predicate = r => r.Name.Contains("self") | |||
}); | |||
}); | |||
} | |||
private void RegisterEventBus(IServiceCollection services) | |||
{ | |||
var subscriptionClientName = Configuration["SubscriptionClientName"]; | |||
if (Configuration.GetValue<bool>("AzureServiceBusEnabled")) | |||
{ | |||
services.AddSingleton<IEventBus, EventBusServiceBus>(sp => | |||
{ | |||
var serviceBusPersisterConnection = sp.GetRequiredService<IServiceBusPersisterConnection>(); | |||
var iLifetimeScope = sp.GetRequiredService<ILifetimeScope>(); | |||
var logger = sp.GetRequiredService<ILogger<EventBusServiceBus>>(); | |||
var eventBusSubcriptionsManager = sp.GetRequiredService<IEventBusSubscriptionsManager>(); | |||
return new EventBusServiceBus(serviceBusPersisterConnection, logger, | |||
eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope); | |||
}); | |||
} | |||
else | |||
{ | |||
services.AddSingleton<IEventBus, EventBusRabbitMQ>(sp => | |||
{ | |||
var rabbitMQPersistentConnection = sp.GetRequiredService<IRabbitMQPersistentConnection>(); | |||
var iLifetimeScope = sp.GetRequiredService<ILifetimeScope>(); | |||
var logger = sp.GetRequiredService<ILogger<EventBusRabbitMQ>>(); | |||
var eventBusSubcriptionsManager = sp.GetRequiredService<IEventBusSubscriptionsManager>(); | |||
var retryCount = 5; | |||
if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"])) | |||
{ | |||
retryCount = int.Parse(Configuration["EventBusRetryCount"]); | |||
} | |||
return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount); | |||
}); | |||
} | |||
services.AddSingleton<IEventBusSubscriptionsManager, InMemoryEventBusSubscriptionsManager>(); | |||
} | |||
} | |||
public static class CustomExtensionMethods | |||
{ | |||
public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration) | |||
{ | |||
var hcBuilder = services.AddHealthChecks(); | |||
hcBuilder.AddCheck("self", () => HealthCheckResult.Healthy()); | |||
hcBuilder | |||
.AddSqlServer( | |||
configuration["ConnectionString"], | |||
name: "OrderingTaskDB-check", | |||
tags: new string[] { "orderingtaskdb" }); | |||
if (configuration.GetValue<bool>("AzureServiceBusEnabled")) | |||
{ | |||
hcBuilder | |||
.AddAzureServiceBusTopic( | |||
configuration["EventBusConnection"], | |||
topicName: "eshop_event_bus", | |||
name: "orderingtask-servicebus-check", | |||
tags: new string[] { "servicebus" }); | |||
} | |||
else | |||
{ | |||
hcBuilder | |||
.AddRabbitMQ( | |||
$"amqp://{configuration["EventBusConnection"]}", | |||
name: "orderingtask-rabbitmqbus-check", | |||
tags: new string[] { "rabbitmqbus" }); | |||
} | |||
return services; | |||
} | |||
} | |||
} |
@ -1,95 +0,0 @@ | |||
using Dapper; | |||
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; | |||
using Microsoft.Extensions.Hosting; | |||
using Microsoft.Extensions.Logging; | |||
using Microsoft.Extensions.Options; | |||
using Ordering.BackgroundTasks.Configuration; | |||
using Ordering.BackgroundTasks.IntegrationEvents; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Data.SqlClient; | |||
using System.Threading; | |||
using System.Threading.Tasks; | |||
namespace Ordering.BackgroundTasks.Tasks | |||
{ | |||
public class GracePeriodManagerService | |||
: BackgroundService | |||
{ | |||
private readonly ILogger<GracePeriodManagerService> _logger; | |||
private readonly BackgroundTaskSettings _settings; | |||
private readonly IEventBus _eventBus; | |||
public GracePeriodManagerService( | |||
IOptions<BackgroundTaskSettings> settings, | |||
IEventBus eventBus, | |||
ILogger<GracePeriodManagerService> logger) | |||
{ | |||
_settings = settings?.Value ?? throw new ArgumentNullException(nameof(settings)); | |||
_eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus)); | |||
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); | |||
} | |||
protected override async Task ExecuteAsync(CancellationToken stoppingToken) | |||
{ | |||
_logger.LogDebug("GracePeriodManagerService is starting."); | |||
stoppingToken.Register(() => _logger.LogDebug("#1 GracePeriodManagerService background task is stopping.")); | |||
while (!stoppingToken.IsCancellationRequested) | |||
{ | |||
_logger.LogDebug("GracePeriodManagerService background task is doing background work."); | |||
CheckConfirmedGracePeriodOrders(); | |||
await Task.Delay(_settings.CheckUpdateTime, stoppingToken); | |||
} | |||
_logger.LogDebug("GracePeriodManagerService background task is stopping."); | |||
await Task.CompletedTask; | |||
} | |||
private void CheckConfirmedGracePeriodOrders() | |||
{ | |||
_logger.LogDebug("Checking confirmed grace period orders"); | |||
var orderIds = GetConfirmedGracePeriodOrders(); | |||
foreach (var orderId in orderIds) | |||
{ | |||
var confirmGracePeriodEvent = new GracePeriodConfirmedIntegrationEvent(orderId); | |||
_logger.LogInformation("----- Publishing integration event: {IntegrationEventId} from {AppName} - ({@IntegrationEvent})", confirmGracePeriodEvent.Id, Program.AppName, confirmGracePeriodEvent); | |||
_eventBus.Publish(confirmGracePeriodEvent); | |||
} | |||
} | |||
private IEnumerable<int> GetConfirmedGracePeriodOrders() | |||
{ | |||
IEnumerable<int> orderIds = new List<int>(); | |||
using (var conn = new SqlConnection(_settings.ConnectionString)) | |||
{ | |||
try | |||
{ | |||
conn.Open(); | |||
orderIds = conn.Query<int>( | |||
@"SELECT Id FROM [ordering].[orders] | |||
WHERE DATEDIFF(minute, [OrderDate], GETDATE()) >= @GracePeriodTime | |||
AND [OrderStatusId] = 1", | |||
new { GracePeriodTime = _settings.GracePeriodTime }); | |||
} | |||
catch (SqlException exception) | |||
{ | |||
_logger.LogCritical(exception, "FATAL ERROR: Database connections could not be opened: {Message}", exception.Message); | |||
} | |||
} | |||
return orderIds; | |||
} | |||
} | |||
} |
@ -1,10 +0,0 @@ | |||
{ | |||
"Logging": { | |||
"IncludeScopes": false, | |||
"LogLevel": { | |||
"Default": "Debug", | |||
"System": "Information", | |||
"Microsoft": "Information" | |||
} | |||
} | |||
} |
@ -1,26 +0,0 @@ | |||
{ | |||
"ConnectionString": "Server=tcp:127.0.0.1,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;", | |||
"Serilog": { | |||
"SeqServerUrl": null, | |||
"LogstashgUrl": null, | |||
"MinimumLevel": { | |||
"Default": "Information", | |||
"Override": { | |||
"Microsoft": "Warning", | |||
"Microsoft.eShopOnContainers": "Information", | |||
"System": "Warning" | |||
} | |||
} | |||
}, | |||
"SubscriptionClientName": "BackgroundTasks", | |||
"GracePeriodTime": "1", | |||
"CheckUpdateTime": "1000", | |||
"ApplicationInsights": { | |||
"InstrumentationKey": "" | |||
}, | |||
"AzureServiceBusEnabled": false, | |||
"EventBusRetryCount": 5, | |||
"EventBusConnection": "", | |||
"EventBusUserName": "", | |||
"EventBusPassword": "" | |||
} |
@ -1,56 +0,0 @@ | |||
kind: helm-release | |||
apiVersion: 1.1 | |||
build: | |||
context: ..\..\..\.. | |||
dockerfile: Dockerfile | |||
install: | |||
chart: ../../../../k8s/helm/ordering-backgroundtasks | |||
set: | |||
replicaCount: 1 | |||
image: | |||
tag: $(tag) | |||
pullPolicy: Never | |||
ingress: | |||
annotations: | |||
kubernetes.io/ingress.class: traefik-azds | |||
hosts: | |||
- $(spacePrefix)eshop$(hostSuffix) | |||
inf: | |||
k8s: | |||
dns: $(spacePrefix)eshop$(hostSuffix) | |||
values: | |||
- values.dev.yaml? | |||
- secrets.dev.yaml? | |||
- inf.yaml | |||
- app.yaml | |||
configurations: | |||
develop: | |||
build: | |||
useGitIgnore: true | |||
dockerfile: Dockerfile.develop | |||
args: | |||
BUILD_CONFIGURATION: ${BUILD_CONFIGURATION:-Debug} | |||
container: | |||
sync: | |||
- '**/Pages/**' | |||
- '**/Views/**' | |||
- '**/wwwroot/**' | |||
- '!**/*.{sln,csproj}' | |||
command: | |||
- dotnet | |||
- run | |||
- --no-restore | |||
- --no-build | |||
- --no-launch-profile | |||
- -c | |||
- ${BUILD_CONFIGURATION:-Debug} | |||
iterate: | |||
processesToKill: | |||
- dotnet | |||
- vsdbg | |||
buildCommands: | |||
- - dotnet | |||
- build | |||
- --no-restore | |||
- -c | |||
- ${BUILD_CONFIGURATION:-Debug} |