Skip to content

Add new auth function in parallel upgraded to dotnet 8 #67

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 80 commits into from
Mar 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
2b2dab5
Docker space compose
adamtry Mar 12, 2025
4cc4470
Fix makefile
adamtry Mar 12, 2025
ad0eecb
Copy into new folders
adamtry Mar 12, 2025
a7619bd
Dotnet 8 parallel function
adamtry Mar 13, 2025
9b06dc5
Simplify maybe
adamtry Mar 13, 2025
0386957
Keep build
adamtry Mar 13, 2025
6349016
Fix namespaces
LBHCallumM Mar 17, 2025
5fdc60d
Add new projects to solution
LBHCallumM Mar 17, 2025
4ee28e9
update pipelihne
LBHCallumM Mar 17, 2025
8bd6371
update dockerfile
LBHCallumM Mar 17, 2025
923eb5d
Fix dependency issues
LBHCallumM Mar 17, 2025
6d23b1b
DF
LBHCallumM Mar 17, 2025
dbae2c1
remove 'new' projects
LBHCallumM Mar 17, 2025
2d224d2
update config
LBHCallumM Mar 17, 2025
128143a
update config
LBHCallumM Mar 17, 2025
5d3ed0a
fix dotnet version in config
LBHCallumM Mar 17, 2025
8ff7d73
Add serverless framework context
LBHCallumM Mar 17, 2025
318a619
update build script
LBHCallumM Mar 17, 2025
04a4d44
serverless deploy
LBHCallumM Mar 17, 2025
5df85f5
rename service logical id
LBHCallumM Mar 17, 2025
b534a9b
add debug flag
LBHCallumM Mar 17, 2025
2c8096c
comment out failing policy
LBHCallumM Mar 17, 2025
d17517b
Add manage logs policty
LBHCallumM Mar 17, 2025
1ef9a0f
revert policy
LBHCallumM Mar 17, 2025
f29b90b
Re-add s3 policy
LBHCallumM Mar 17, 2025
25eb1ba
Add specific deploymentBucket
LBHCallumM Mar 17, 2025
144ff0d
specify bucket
LBHCallumM Mar 17, 2025
e75f4a7
try again
LBHCallumM Mar 17, 2025
625c650
move deploymentBucket setting
LBHCallumM Mar 17, 2025
ef2a12b
rm deploymenBucket config
LBHCallumM Mar 17, 2025
b4bb5be
Add install serverless step
LBHCallumM Mar 17, 2025
37edd5c
comment out ServerlessDeploymentBucket policy again
LBHCallumM Mar 17, 2025
e9efa55
rm serverless installer
LBHCallumM Mar 17, 2025
744a588
Try new apigateway policy
LBHCallumM Mar 17, 2025
47421b9
Add UnsafeRelaxHmacKeySizeValidation FT to appsettings.json
LBHCallumM Mar 17, 2025
b097258
Add new ValidateToken method
LBHCallumM Mar 18, 2025
679da39
comment out test
LBHCallumM Mar 18, 2025
04d0792
add policy to get api gateway resource
LBHCallumM Mar 18, 2025
caa4523
Replace assume role policy with actual policy
LBHCallumM Mar 18, 2025
44f209d
redeploy
LBHCallumM Mar 18, 2025
76ce0ee
rm redundant policy
LBHCallumM Mar 18, 2025
e46ec49
cleanup serverless
LBHCallumM Mar 18, 2025
3fa34ae
revert
LBHCallumM Mar 18, 2025
d85ae97
rm
LBHCallumM Mar 18, 2025
ecdac7b
try fix assume role permish
LBHCallumM Mar 18, 2025
2521c08
Refactor VerifyTokenHelper
LBHCallumM Mar 18, 2025
42a887c
cleanup
LBHCallumM Mar 18, 2025
a9d3e7a
change authorizer name so its not 'new'
LBHCallumM Mar 19, 2025
b6715ed
Update apiGateway permission to work on any AWS account
LBHCallumM Mar 19, 2025
028c597
try different policy
LBHCallumM Mar 19, 2025
006fe32
rm sourceAccount from policy
LBHCallumM Mar 19, 2025
a9b3af7
revert previous changes
LBHCallumM Mar 19, 2025
cc6884f
Add policy to able authorizer to be called from housing-staging
LBHCallumM Mar 19, 2025
124635d
update authorizer policy
LBHCallumM Mar 19, 2025
db46119
try update another permission
LBHCallumM Mar 19, 2025
66379fc
try with hardcoded api gateway
LBHCallumM Mar 19, 2025
f1b15ce
wrong api gateway key
LBHCallumM Mar 19, 2025
3fffe2e
worth a try
LBHCallumM Mar 19, 2025
0259058
missing colon
LBHCallumM Mar 19, 2025
caaf44a
hardcode specific ARN for api gateway
LBHCallumM Mar 19, 2025
0190e2e
make authorizer permission more permissive
LBHCallumM Mar 19, 2025
58c08a0
attempt 2
LBHCallumM Mar 19, 2025
e0cba13
arn
LBHCallumM Mar 19, 2025
2e44962
remove unused policy
LBHCallumM Mar 20, 2025
f68fc78
Speed up pipeline
LBHCallumM Mar 20, 2025
20db902
re-add permission for fetching credentials from housing-staging
LBHCallumM Mar 20, 2025
2a7230c
switch back to dynamic sourceArn
LBHCallumM Mar 20, 2025
b80a48b
change cross-account policy names to be more generic
LBHCallumM Mar 20, 2025
ef51f57
cleanup
LBHCallumM Mar 20, 2025
81e8926
cleanup config.yml
LBHCallumM Mar 20, 2025
574d6c4
add missed filters
LBHCallumM Mar 20, 2025
196be30
Add DR account policies
LBHCallumM Mar 21, 2025
16649f3
fix serverless error
LBHCallumM Mar 21, 2025
191fa48
toggle policy
LBHCallumM Mar 21, 2025
386f291
missed comment
LBHCallumM Mar 21, 2025
59351e0
Update serverless condition syntax
LBHCallumM Mar 21, 2025
24d1063
Add back other DR policy
LBHCallumM Mar 21, 2025
7ad0a35
extract DR policy logic
LBHCallumM Mar 21, 2025
d517002
Remove auto staging deploy
adamtry Mar 24, 2025
634755b
Check ignore master and development
adamtry Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 39 additions & 21 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
version: 2.1

orbs:
aws-cli: circleci/[email protected]
aws_assume_role: lbh-hackit/[email protected]
node: circleci/[email protected]

executors:
docker-python:
docker:
- image: circleci/python:3.7
- image: cimg/python:3.12
docker-terraform:
docker:
- image: "hashicorp/terraform:0.12.29"
docker-dotnet:
docker:
- image: mcr.microsoft.com/dotnet/core/sdk:3.1
- image: mcr.microsoft.com/dotnet/sdk:8.0

references:
workspace_root: &workspace_root "~"
Expand Down Expand Up @@ -61,29 +61,25 @@ commands:
parameters:
stage:
type: string
path:
type: string
default: "./ApiAuthVerifyToken/"
steps:
- *attach_workspace
- checkout
- setup_remote_docker
- run:
name: Install Node.js
command: |
curl -sL https://deb.nodesource.com/setup_13.x | bash -
apt-get update && apt-get install -y nodejs
- run:
name: Install serverless CLI
command: npm i -g serverless
- node/install
- run:
name: Build lambda
command: |
cd ./ApiAuthVerifyToken/
cd <<parameters.path>>
chmod +x ./build.sh
./build.sh
- run:
name: Deploy lambda
command: |
cd ./ApiAuthVerifyToken/
sls deploy --stage <<parameters.stage>> --conceal
cd <<parameters.path>>
npx --yes --debug serverless deploy --stage <<parameters.stage>> --conceal
jobs:
check-code-formatting:
executor: docker-dotnet
Expand All @@ -102,10 +98,10 @@ jobs:
- setup_remote_docker
- run:
name: build
command: docker-compose build api-auth-verify-token-test
command: docker compose build api-auth-verify-token-test
- run:
name: Run tests
command: docker-compose run api-auth-verify-token-test
command: docker compose run api-auth-verify-token-test
terraform-init-and-apply-to-development:
executor: docker-terraform
steps:
Expand Down Expand Up @@ -153,10 +149,31 @@ jobs:
stage: "production"

workflows:
check:
jobs:
- check-code-formatting:
filters:
branches:
ignore:
- master
- development
- build-and-test:
filters:
branches:
ignore:
- master
- development

check-and-deploy-development:
jobs:
- check-code-formatting
- build-and-test
- check-code-formatting:
filters:
branches:
only: development
- build-and-test:
filters:
branches:
only: development
- assume-role-development:
context: api-assume-role-development-context
requires:
Expand All @@ -176,6 +193,7 @@ workflows:
filters:
branches:
only: development

check-and-deploy-staging-and-production:
jobs:
- build-and-test:
Expand All @@ -185,10 +203,10 @@ workflows:
- assume-role-staging:
context: api-assume-role-staging-context
requires:
- build-and-test
- build-and-test
filters:
branches:
only: master
branches:
only: master
- terraform-init-and-apply-to-staging:
requires:
- assume-role-staging
Expand Down
8 changes: 4 additions & 4 deletions ApiAuthVerifyToken.Tests/ApiAuthVerifyToken.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TargetFramework>net8.0</TargetFramework>

<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
Expand All @@ -14,17 +14,17 @@
<PackageReference Include="FluentAssertions" Version="5.10.3" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.7">
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.12">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.12" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.12.0" />
<PackageReference Include="Bogus" Version="25.0.4" />
<PackageReference Include="Moq" Version="4.10.1" />
<PackageReference Include="nunit" Version="3.11.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.3" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.11" />
</ItemGroup>

<ItemGroup>
Expand Down
2 changes: 2 additions & 0 deletions ApiAuthVerifyToken.Tests/DatabaseTests.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using ApiAuthVerifyToken.V1.Infrastructure;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
Expand All @@ -14,6 +15,7 @@ public class DatabaseTests
[SetUp]
public void RunBeforeAnyTests()
{
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
var builder = new DbContextOptionsBuilder();
builder.UseNpgsql(ConnectionString.TestDatabase());
DatabaseContext = new TokenDatabaseContext(builder.Options);
Expand Down
11 changes: 5 additions & 6 deletions ApiAuthVerifyToken.Tests/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/core/sdk:3.1
FROM mcr.microsoft.com/dotnet/sdk:8.0

# disable microsoft telematry
ENV DOTNET_CLI_TELEMETRY_OPTOUT='true'
Expand All @@ -10,12 +10,11 @@ COPY ./ApiAuthVerifyToken.sln ./
COPY ./ApiAuthVerifyToken/ApiAuthVerifyToken.csproj ./ApiAuthVerifyToken/
COPY ./ApiAuthVerifyToken.Tests/ApiAuthVerifyToken.Tests.csproj ./ApiAuthVerifyToken.Tests/

RUN dotnet restore ./ApiAuthVerifyToken/ApiAuthVerifyToken.csproj
RUN dotnet restore ./ApiAuthVerifyToken.Tests/ApiAuthVerifyToken.Tests.csproj
RUN dotnet restore ApiAuthVerifyToken
RUN dotnet restore ApiAuthVerifyToken.Tests

# Copy everything else and build
COPY . .
COPY . ./

RUN dotnet build -c debug -o out ApiAuthVerifyToken.Tests/ApiAuthVerifyToken.Tests.csproj

CMD dotnet test
CMD dotnet test ApiAuthVerifyToken.Tests/ApiAuthVerifyToken.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public void Setup()
_mockAwsStsGateway = new Mock<IAwsStsGateway>();
_mockDynamoDbGateway = new Mock<IDynamoDbGateway>();
//set up env vars
Environment.SetEnvironmentVariable("jwtSecret", _fixture.Create<string>());
Environment.SetEnvironmentVariable("hackneyUserAuthTokenJwtSecret", _faker.Random.AlphaNumeric(25));
Environment.SetEnvironmentVariable("jwtSecret", _faker.Random.AlphaNumeric(50));
Environment.SetEnvironmentVariable("hackneyUserAuthTokenJwtSecret", _faker.Random.AlphaNumeric(50));
//set up JWT tokens
_allowedGroups = new List<string> { _faker.Random.Word(), _faker.Random.Word() };
_jwtServiceFlow = GenerateJwtHelper.GenerateJwtToken();
Expand Down Expand Up @@ -91,7 +91,7 @@ public void FunctionShouldReturnAPIGatewayCustomAuthorizerPolicyWithDenyEffectWh
var lambdaRequest = _fixture.Build<APIGatewayCustomAuthorizerRequest>().Create();
lambdaRequest.Headers["Authorization"] = _jwtServiceFlow;
//change jwt secret to simulate failure of validating token
Environment.SetEnvironmentVariable("jwtSecret", _fixture.Create<string>());
Environment.SetEnvironmentVariable("jwtSecret", _faker.Random.AlphaNumeric(50));
var result = _classUnderTest.VerifyToken(lambdaRequest);

result.Should().BeOfType<APIGatewayCustomAuthorizerResponse>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ public void Setup()
_mockAwsStsGateway = new Mock<IAwsStsGateway>();
_mockDynamoDbGateway = new Mock<IDynamoDbGateway>();
_classUnderTest = new VerifyAccessUseCase(_mockDatabaseGateway.Object, _mockAwsApiGateway.Object, _mockAwsStsGateway.Object, _mockDynamoDbGateway.Object);
Environment.SetEnvironmentVariable("jwtSecret", _faker.Random.AlphaNumeric(25));
Environment.SetEnvironmentVariable("hackneyUserAuthTokenJwtSecret", _faker.Random.AlphaNumeric(25));
Environment.SetEnvironmentVariable("jwtSecret", _faker.Random.AlphaNumeric(50));
Environment.SetEnvironmentVariable("hackneyUserAuthTokenJwtSecret", _faker.Random.AlphaNumeric(50));
}
#region Service Auth Flow

Expand All @@ -54,7 +54,7 @@ public void ShouldReturnFalseIfTokenIsNotValid()
{
var request = GenerateAuthorizerRequest(GenerateJwtHelper.GenerateJwtToken());
//change key to simulate failed validation
Environment.SetEnvironmentVariable("jwtSecret", _faker.Random.AlphaNumeric(16));
Environment.SetEnvironmentVariable("jwtSecret", _faker.Random.AlphaNumeric(50));
var result = _classUnderTest.ExecuteServiceAuth(request);
result.Allow.Should().BeFalse();
result.User.Should().Be("user");
Expand Down
22 changes: 19 additions & 3 deletions ApiAuthVerifyToken.sln
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiAuthVerifyToken", "ApiAuthVerifyToken\ApiAuthVerifyToken.csproj", "{6F482163-3F51-487F-8F7D-37A1D4DAEA8B}"
# Visual Studio Version 17
VisualStudioVersion = 17.9.34723.18
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiAuthVerifyToken", "ApiAuthVerifyToken\ApiAuthVerifyToken.csproj", "{6F482163-3F51-487F-8F7D-37A1D4DAEA8B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiAuthVerifyToken.Tests", "ApiAuthVerifyToken.Tests\ApiAuthVerifyToken.Tests.csproj", "{DE8E4E61-EB76-416B-8417-E8F2F6A0C0D3}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiAuthVerifyToken.Tests", "ApiAuthVerifyToken.Tests\ApiAuthVerifyToken.Tests.csproj", "{DE8E4E61-EB76-416B-8417-E8F2F6A0C0D3}"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The project GUID somehow changed?

EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -19,5 +21,19 @@ Global
{DE8E4E61-EB76-416B-8417-E8F2F6A0C0D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DE8E4E61-EB76-416B-8417-E8F2F6A0C0D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE8E4E61-EB76-416B-8417-E8F2F6A0C0D3}.Release|Any CPU.Build.0 = Release|Any CPU
{310A6722-973C-4CAF-952B-EA7CBF4FEC88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{310A6722-973C-4CAF-952B-EA7CBF4FEC88}.Debug|Any CPU.Build.0 = Debug|Any CPU
{310A6722-973C-4CAF-952B-EA7CBF4FEC88}.Release|Any CPU.ActiveCfg = Release|Any CPU
{310A6722-973C-4CAF-952B-EA7CBF4FEC88}.Release|Any CPU.Build.0 = Release|Any CPU
{466564FF-AD08-447B-ADAB-BB8A9395D9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{466564FF-AD08-447B-ADAB-BB8A9395D9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{466564FF-AD08-447B-ADAB-BB8A9395D9E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{466564FF-AD08-447B-ADAB-BB8A9395D9E0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {041ABF76-4241-466B-9034-59E4C0520DCC}
EndGlobalSection
EndGlobal
15 changes: 8 additions & 7 deletions ApiAuthVerifyToken/ApiAuthVerifyToken.csproj
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
</PropertyGroup>

Expand All @@ -18,21 +18,22 @@
<PackageReference Include="AWSSDK.DynamoDBv2" Version="3.7.0.12" />
<PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.0.1" />
<PackageReference Include="AWSSDK.SecurityToken" Version="3.7.0.9" />
<PackageReference Include="JWT" Version="11.0.0" />
<PackageReference Include="Microsoft.AspNetCore.HealthChecks" Version="1.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="4.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="4.1.1" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.7">
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.12">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.12" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.4.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="5.4.1" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="5.4.1" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="5.4.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.3" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.7.1" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="7.2.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.11" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.6.1" />
</ItemGroup>

</Project>
2 changes: 2 additions & 0 deletions ApiAuthVerifyToken/ConfigureServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ public static void Configure(this IServiceCollection services)

var connectionString = Environment.GetEnvironmentVariable("CONNECTION_STRING");

AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);

services.AddDbContext<TokenDatabaseContext>(
opt => opt.UseNpgsql(connectionString));

Expand Down
2 changes: 1 addition & 1 deletion ApiAuthVerifyToken/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/core/sdk:3.1
FROM mcr.microsoft.com/dotnet/sdk:8.0

WORKDIR /app

Expand Down
Loading