From 506dbbeb8e4e3f02d64f3cfe9dbdb58fcc727e83 Mon Sep 17 00:00:00 2001 From: iamshen Date: Thu, 23 May 2024 10:01:12 +0800 Subject: [PATCH 1/3] Upgrade Aspire to GA release 8.0.1 --- Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index f46c248..e2bb023 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -126,8 +126,8 @@ - - + + -- Gitee From 24ae55907a34ecdf8375b02ba633285159446557 Mon Sep 17 00:00:00 2001 From: iamshen Date: Thu, 23 May 2024 14:38:38 +0800 Subject: [PATCH 2/3] Add aspirate config file and setup project docker to suport publish to docker --- Directory.Packages.props | 2 +- .../aspirate-state.json | 16 ++ build/DaprTool.Solution.AppHost/aspirate.json | 11 + build/DaprTool.Solution.AppHost/manifest.json | 241 ++++++++++++++++++ .../Idsrv4.Admin.Api/Idsrv4.Admin.Api.csproj | 3 + .../Idsrv4.Admin.STS.Identity.csproj | 3 + .../src/Idsrv4.Admin/Idsrv4.Admin.csproj | 3 + src/ProxyServer/ProxyServer.csproj | 9 +- .../Ordering.Api/Ordering.Api.csproj | 5 +- src/Web/WebAdmin/WebAdmin.csproj | 3 + 10 files changed, 293 insertions(+), 3 deletions(-) create mode 100644 build/DaprTool.Solution.AppHost/aspirate-state.json create mode 100644 build/DaprTool.Solution.AppHost/aspirate.json create mode 100644 build/DaprTool.Solution.AppHost/manifest.json diff --git a/Directory.Packages.props b/Directory.Packages.props index e2bb023..ebc6a02 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -66,7 +66,7 @@ - + diff --git a/build/DaprTool.Solution.AppHost/aspirate-state.json b/build/DaprTool.Solution.AppHost/aspirate-state.json new file mode 100644 index 0000000..141ed89 --- /dev/null +++ b/build/DaprTool.Solution.AppHost/aspirate-state.json @@ -0,0 +1,16 @@ +{ + "projectPath": ".", + "containerRegistry": "registry.cn-shenzhen.aliyuncs.com", + "containerImageTags": [ + "latest" + ], + "containerBuilder": "docker", + "containerRepositoryPrefix": "huangshen", + "outputFormat": "kustomize", + "secrets": { + "salt": "IkrA7nfBQ7D\u002BCckn", + "hash": "zDNrZprNGlk91UFwKeYuvkbWnm9MuqzeHAckg6gyxkI=", + "secrets": {} + }, + "processAllComponents": true +} \ No newline at end of file diff --git a/build/DaprTool.Solution.AppHost/aspirate.json b/build/DaprTool.Solution.AppHost/aspirate.json new file mode 100644 index 0000000..2a1d7dc --- /dev/null +++ b/build/DaprTool.Solution.AppHost/aspirate.json @@ -0,0 +1,11 @@ +{ + "TemplatePath": null, + "ContainerSettings": { + "Registry": "registry.cn-shenzhen.aliyuncs.com", + "RepositoryPrefix": "huangshen", + "Tags": [ + "latest" + ], + "Builder": "docker" + } +} \ No newline at end of file diff --git a/build/DaprTool.Solution.AppHost/manifest.json b/build/DaprTool.Solution.AppHost/manifest.json new file mode 100644 index 0000000..5ee701a --- /dev/null +++ b/build/DaprTool.Solution.AppHost/manifest.json @@ -0,0 +1,241 @@ +{ + "resources": { + "admin": { + "type": "project.v0", + "path": "../../src/Web/WebAdmin/WebAdmin.csproj", + "env": { + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory", + "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true" + }, + "bindings": { + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http" + }, + "https": { + "scheme": "https", + "protocol": "tcp", + "transport": "http" + }, + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http", + "port": 51871 + } + } + }, + "admin-dapr": { + "type": "dapr.v0", + "dapr": { + "application": "admin", + "appId": "admin", + "daprHttpMaxRequestSize": 60, + "daprHttpPort": 12010, + "daprHttpReadBufferSize": 128, + "resourcesPath": [ + "../../dapr/components" + ] + } + }, + "auth-sts": { + "type": "project.v0", + "path": "../../src/IdentityServer4/src/Idsrv4.Admin.STS.Identity/Idsrv4.Admin.STS.Identity.csproj", + "env": { + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory", + "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true" + }, + "bindings": { + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http" + }, + "https": { + "scheme": "https", + "protocol": "tcp", + "transport": "http" + }, + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http", + "port": 52871 + } + } + }, + "auth-sts-dapr": { + "type": "dapr.v0", + "dapr": { + "application": "auth-sts", + "appId": "auth-sts", + "daprHttpMaxRequestSize": 60, + "daprHttpPort": 12020, + "daprHttpReadBufferSize": 128, + "resourcesPath": [ + "../../dapr/components" + ] + } + }, + "auth-admin": { + "type": "project.v0", + "path": "../../src/IdentityServer4/src/Idsrv4.Admin/Idsrv4.Admin.csproj", + "env": { + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory", + "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true" + }, + "bindings": { + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http" + }, + "https": { + "scheme": "https", + "protocol": "tcp", + "transport": "http" + }, + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http", + "port": 53871 + } + } + }, + "auth-admin-dapr": { + "type": "dapr.v0", + "dapr": { + "application": "auth-admin", + "appId": "auth-admin", + "daprHttpMaxRequestSize": 60, + "daprHttpPort": 12030, + "daprHttpReadBufferSize": 128, + "resourcesPath": [ + "../../dapr/components" + ] + } + }, + "auth-api": { + "type": "project.v0", + "path": "../../src/IdentityServer4/src/Idsrv4.Admin.Api/Idsrv4.Admin.Api.csproj", + "env": { + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory", + "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true" + }, + "bindings": { + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http" + }, + "https": { + "scheme": "https", + "protocol": "tcp", + "transport": "http" + }, + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http", + "port": 54871 + } + } + }, + "auth-api-dapr": { + "type": "dapr.v0", + "dapr": { + "application": "auth-api", + "appId": "auth-api", + "daprHttpMaxRequestSize": 60, + "daprHttpPort": 12040, + "daprHttpReadBufferSize": 128, + "resourcesPath": [ + "../../dapr/components" + ] + } + }, + "order-api": { + "type": "project.v0", + "path": "../../src/Services/Ordering/Presentation/Ordering.Api/Ordering.Api.csproj", + "env": { + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory", + "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true" + }, + "bindings": { + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http" + }, + "https": { + "scheme": "https", + "protocol": "tcp", + "transport": "http" + }, + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http", + "port": 31441 + } + } + }, + "order-api-dapr": { + "type": "dapr.v0", + "dapr": { + "application": "order-api", + "appId": "order-api", + "daprHttpMaxRequestSize": 60, + "daprHttpPort": 12050, + "daprHttpReadBufferSize": 128, + "resourcesPath": [ + "../../dapr/components" + ] + } + }, + "proxy-server": { + "type": "project.v0", + "path": "../../src/ProxyServer/ProxyServer.csproj", + "env": { + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true", + "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory", + "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true", + "services__admin__http__0": "{admin.bindings.http.url}", + "services__admin__https__0": "{admin.bindings.https.url}", + "services__auth-admin__http__0": "{auth-admin.bindings.http.url}", + "services__auth-admin__https__0": "{auth-admin.bindings.https.url}", + "services__auth-sts__http__0": "{auth-sts.bindings.http.url}", + "services__auth-sts__https__0": "{auth-sts.bindings.https.url}", + "services__auth-api__http__0": "{auth-api.bindings.http.url}", + "services__auth-api__https__0": "{auth-api.bindings.https.url}", + "services__order-api__http__0": "{order-api.bindings.http.url}", + "services__order-api__https__0": "{order-api.bindings.https.url}" + }, + "bindings": { + "http": { + "scheme": "http", + "protocol": "tcp", + "transport": "http" + }, + "https": { + "scheme": "https", + "protocol": "tcp", + "transport": "http" + } + } + } + } +} \ No newline at end of file diff --git a/src/IdentityServer4/src/Idsrv4.Admin.Api/Idsrv4.Admin.Api.csproj b/src/IdentityServer4/src/Idsrv4.Admin.Api/Idsrv4.Admin.Api.csproj index 8f06e11..2efb2f1 100644 --- a/src/IdentityServer4/src/Idsrv4.Admin.Api/Idsrv4.Admin.Api.csproj +++ b/src/IdentityServer4/src/Idsrv4.Admin.Api/Idsrv4.Admin.Api.csproj @@ -2,6 +2,9 @@ net8.0 1cc472a2-4e4b-48ce-846b-5219f71fc643 + auth-api + registry.cn-shenzhen.aliyuncs.com + mcr.microsoft.com/dotnet/aspnet:8.0 diff --git a/src/IdentityServer4/src/Idsrv4.Admin.STS.Identity/Idsrv4.Admin.STS.Identity.csproj b/src/IdentityServer4/src/Idsrv4.Admin.STS.Identity/Idsrv4.Admin.STS.Identity.csproj index 61b8c27..dec30f5 100644 --- a/src/IdentityServer4/src/Idsrv4.Admin.STS.Identity/Idsrv4.Admin.STS.Identity.csproj +++ b/src/IdentityServer4/src/Idsrv4.Admin.STS.Identity/Idsrv4.Admin.STS.Identity.csproj @@ -3,6 +3,9 @@ net8.0 9c91d295-54c5-4d09-9bd6-fa56fb74011b false + auth-sts + registry.cn-shenzhen.aliyuncs.com + mcr.microsoft.com/dotnet/aspnet:8.0 diff --git a/src/IdentityServer4/src/Idsrv4.Admin/Idsrv4.Admin.csproj b/src/IdentityServer4/src/Idsrv4.Admin/Idsrv4.Admin.csproj index e1efb45..589576c 100644 --- a/src/IdentityServer4/src/Idsrv4.Admin/Idsrv4.Admin.csproj +++ b/src/IdentityServer4/src/Idsrv4.Admin/Idsrv4.Admin.csproj @@ -4,6 +4,9 @@ 8fe260ca-ef4c-4fa3-9364-029146f8d339 NU1803;NU1507;1701;1702;1591;8002;CS1573;NU1604; false + auth-admin + registry.cn-shenzhen.aliyuncs.com + mcr.microsoft.com/dotnet/aspnet:8.0 diff --git a/src/ProxyServer/ProxyServer.csproj b/src/ProxyServer/ProxyServer.csproj index 1050c6a..7282199 100644 --- a/src/ProxyServer/ProxyServer.csproj +++ b/src/ProxyServer/ProxyServer.csproj @@ -1,5 +1,12 @@ - + + + proxy-server + registry.cn-shenzhen.aliyuncs.com + mcr.microsoft.com/dotnet/aspnet:8.0 + + + diff --git a/src/Services/Ordering/Presentation/Ordering.Api/Ordering.Api.csproj b/src/Services/Ordering/Presentation/Ordering.Api/Ordering.Api.csproj index a0edf6c..879e1a1 100644 --- a/src/Services/Ordering/Presentation/Ordering.Api/Ordering.Api.csproj +++ b/src/Services/Ordering/Presentation/Ordering.Api/Ordering.Api.csproj @@ -2,7 +2,10 @@ db0f9eb4-ee32-47d3-8d93-f59a66d79da5 - false + false + order-api + registry.cn-shenzhen.aliyuncs.com + mcr.microsoft.com/dotnet/aspnet:8.0 diff --git a/src/Web/WebAdmin/WebAdmin.csproj b/src/Web/WebAdmin/WebAdmin.csproj index 8e018bd..dbc7198 100644 --- a/src/Web/WebAdmin/WebAdmin.csproj +++ b/src/Web/WebAdmin/WebAdmin.csproj @@ -1,6 +1,9 @@  false + web-admin + registry.cn-shenzhen.aliyuncs.com + mcr.microsoft.com/dotnet/aspnet:8.0 -- Gitee From 746353926a456da5e0a1cd8b6c0b8f94e7c0db24 Mon Sep 17 00:00:00 2001 From: iamshen Date: Fri, 24 May 2024 10:12:54 +0800 Subject: [PATCH 3/3] Add aspirate output files --- .../aspirate-output.zip | Bin 0 -> 9321 bytes .../aspirate-output/admin/deployment.yaml | 41 +++++++++++ .../aspirate-output/admin/kustomization.yaml | 16 +++++ .../aspirate-output/admin/service.yaml | 16 +++++ .../auth-admin/deployment.yaml | 41 +++++++++++ .../auth-admin/kustomization.yaml | 16 +++++ .../aspirate-output/auth-admin/service.yaml | 16 +++++ .../aspirate-output/auth-api/deployment.yaml | 41 +++++++++++ .../auth-api/kustomization.yaml | 16 +++++ .../aspirate-output/auth-api/service.yaml | 16 +++++ .../aspirate-output/auth-sts/deployment.yaml | 41 +++++++++++ .../auth-sts/kustomization.yaml | 16 +++++ .../aspirate-output/auth-sts/service.yaml | 16 +++++ .../aspirate-output/dashboard.yaml | 64 ++++++++++++++++++ .../aspirate-output/kustomization.yaml | 16 +++++ .../aspirate-output/namespace.yaml | 4 ++ .../aspirate-output/order-api/deployment.yaml | 41 +++++++++++ .../order-api/kustomization.yaml | 16 +++++ .../aspirate-output/order-api/service.yaml | 16 +++++ .../proxy-server/deployment.yaml | 31 +++++++++ .../proxy-server/kustomization.yaml | 21 ++++++ .../aspirate-output/proxy-server/service.yaml | 16 +++++ .../aspirate-state.json | 5 ++ build/README.md | 7 +- .../Idsrv4.Admin.STS.Identity.csproj | 1 + 25 files changed, 527 insertions(+), 3 deletions(-) create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output.zip create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/admin/deployment.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/admin/kustomization.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/admin/service.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-admin/deployment.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-admin/kustomization.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-admin/service.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-api/deployment.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-api/kustomization.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-api/service.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-sts/deployment.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-sts/kustomization.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/auth-sts/service.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/dashboard.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/kustomization.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/namespace.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/order-api/deployment.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/order-api/kustomization.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/order-api/service.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/proxy-server/deployment.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/proxy-server/kustomization.yaml create mode 100644 build/DaprTool.Solution.AppHost/aspirate-output/proxy-server/service.yaml diff --git a/build/DaprTool.Solution.AppHost/aspirate-output.zip b/build/DaprTool.Solution.AppHost/aspirate-output.zip new file mode 100644 index 0000000000000000000000000000000000000000..849721a8cd28e48a00b73880df4bd88b153bb0e9 GIT binary patch literal 9321 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 -- Gitee