Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"rollForward": false
},
"chillicream.nitro.commandline": {
"version": "16.0.0-p.10.35",
"version": "16.0.0-p.10.38",
"commands": ["nitro"],
"rollForward": false
}
Expand Down
64 changes: 49 additions & 15 deletions .github/workflows/deploy-gateway.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,21 @@ on:
workflow_dispatch: {}

jobs:
build-publish-deploy:
prepare:
runs-on: ubuntu-latest
concurrency:
group: deploy-gateway
cancel-in-progress: false
outputs:
tag: ${{ steps.meta.outputs.tag }}
steps:
- name: Compute image tag
id: meta
run: |
TS=$(date -u +'%Y%m%dT%H%M%SZ')
SHORTSHA=${GITHUB_SHA::7}
echo "tag=${TS}-${SHORTSHA}" >> $GITHUB_OUTPUT

build:
runs-on: ubuntu-latest
needs: prepare

steps:
- name: Checkout
Expand All @@ -38,26 +48,40 @@ jobs:
username: ${{ secrets.ACR_USERNAME }}
password: ${{ secrets.ACR_PASSWORD }}

- name: Compute image tag
id: meta
run: |
TS=$(date -u +'%Y%m%dT%H%M%SZ')
SHORTSHA=${GITHUB_SHA::7}
echo "tag=${TS}-${SHORTSHA}" >> $GITHUB_OUTPUT
echo "image=${{ secrets.ACR_LOGIN_SERVER }}/ccc-eu1-demo-ca-gateway:${TS}-${SHORTSHA}" >> $GITHUB_OUTPUT

# Build .NET app and publish directly to an OCI image, then push to ACR.
- name: dotnet publish -> container (push to ACR)
working-directory: src/Gateway
run: |
dotnet restore
dotnet publish -c Release \
-p:ContainerRepository=ccc-eu1-demo-ca-gateway \
-p:ContainerImageTag=${{ steps.meta.outputs.tag }} \
-p:ContainerImageTag=${{ needs.prepare.outputs.tag }} \
-p:ContainerRegistry=${{ secrets.ACR_LOGIN_SERVER }} \
-p:PublishAot=true \
-p:RuntimeIdentifier=linux-x64

- name: Upload OpenAPI collection
run: |
# Equivalent to `dotnet nitro openapi upload ...`
dotnet tool exec ChilliCream.Nitro.CommandLine --prerelease --yes -- openapi upload \
--pattern "src/Gateway/OpenApi/*.graphql" \
--tag ${{ needs.prepare.outputs.tag }} \
--openapi-collection-id "" \
--api-key ${{ secrets.NITRO_API_KEY }}

deploy:
runs-on: ubuntu-latest
needs: [prepare, build]
concurrency:
group: deploy-gateway
cancel-in-progress: false

steps:
- name: Azure login
uses: azure/login@v2
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}

- name: Create or Update App Service
run: |
# Create the web app if it doesn't exist
Expand All @@ -67,14 +91,14 @@ jobs:
--name ccc-eu1-demo-ca-gateway \
--resource-group ${{ secrets.AZURE_RESOURCE_GROUP }} \
--plan ${{ secrets.APP_SERVICE_PLAN }} \
--deployment-container-image-name ${{ steps.meta.outputs.image }}
--deployment-container-image-name ${{ secrets.ACR_LOGIN_SERVER }}/ccc-eu1-demo-ca-gateway:${{ needs.prepare.outputs.tag }}
fi

# Configure container settings
az webapp config container set \
--name ccc-eu1-demo-ca-gateway \
--resource-group ${{ secrets.AZURE_RESOURCE_GROUP }} \
--container-image-name ${{ steps.meta.outputs.image }} \
--container-image-name ${{ secrets.ACR_LOGIN_SERVER }}/ccc-eu1-demo-ca-gateway:${{ needs.prepare.outputs.tag }} \
--container-registry-url https://${{ secrets.ACR_LOGIN_SERVER }} \
--container-registry-user ${{ secrets.ACR_USERNAME }} \
--container-registry-password ${{ secrets.ACR_PASSWORD }}
Expand All @@ -95,3 +119,13 @@ jobs:
az webapp restart \
--name ccc-eu1-demo-ca-gateway \
--resource-group ${{ secrets.AZURE_RESOURCE_GROUP }}

- name: Publish OpenAPI collection
run: |
# Equivalent to `dotnet nitro openapi publish ...`
dotnet tool exec ChilliCream.Nitro.CommandLine --prerelease --yes -- openapi publish \
--openapi-collection-id "" \
--tag ${{ needs.prepare.outputs.tag }} \
--stage ${{ secrets.NITRO_STAGE }} \
--openapi-collection-id "" \
--api-key ${{ secrets.NITRO_API_KEY }}
23 changes: 13 additions & 10 deletions .github/workflows/deploy-source-schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ on:
NITRO_STAGE: { required: true }

jobs:
version:
prepare:
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.meta.outputs.tag }}
Expand All @@ -54,7 +54,7 @@ jobs:

build:
runs-on: ubuntu-latest
needs: version
needs: prepare

steps:
- name: Checkout
Expand All @@ -65,6 +65,9 @@ jobs:
with:
dotnet-version: 10.0.x

- name: Restore tools
run: dotnet tool restore

- name: Azure login
uses: azure/login@v2
with:
Expand All @@ -85,7 +88,7 @@ jobs:
dotnet publish -c Release \
-p:PublishProfile=DefaultContainer \
-p:ContainerRepository=${{ inputs.app_name }} \
-p:ContainerImageTag=${{ needs.version.outputs.tag }} \
-p:ContainerImageTag=${{ needs.prepare.outputs.tag }} \
-p:ContainerRegistry=${{ secrets.ACR_LOGIN_SERVER }} \
-p:ContainerPort=${{ inputs.container_port }} \
-p:ContainerBaseImage=mcr.microsoft.com/dotnet/aspnet:10.0
Expand All @@ -99,13 +102,13 @@ jobs:
# Equivalent to `dotnet nitro fusion upload ...`
dotnet tool exec ChilliCream.Nitro.CommandLine --prerelease --yes -- fusion upload \
--source-schema-file "${{ inputs.schema_file }}" \
--tag ${{ needs.version.outputs.version }} \
--tag ${{ needs.prepare.outputs.version }} \
--api-id ${{ secrets.NITRO_API_ID }} \
--api-key ${{ secrets.NITRO_API_KEY }} \
--api-key ${{ secrets.NITRO_API_KEY }}

deploy:
runs-on: ubuntu-latest
needs: [version, build]
needs: [prepare, build]
concurrency:
group: deploy-${{ inputs.app_name }}
cancel-in-progress: false
Expand All @@ -125,14 +128,14 @@ jobs:
--name ${{ inputs.app_name }} \
--resource-group ${{ secrets.AZURE_RESOURCE_GROUP }} \
--plan ${{ secrets.APP_SERVICE_PLAN }} \
--deployment-container-image-name ${{ secrets.ACR_LOGIN_SERVER }}/${{ inputs.app_name }}:${{ needs.version.outputs.tag }}
--deployment-container-image-name ${{ secrets.ACR_LOGIN_SERVER }}/${{ inputs.app_name }}:${{ needs.prepare.outputs.tag }}
fi

# Configure container settings
az webapp config container set \
--name ${{ inputs.app_name }} \
--resource-group ${{ secrets.AZURE_RESOURCE_GROUP }} \
--container-image-name ${{ secrets.ACR_LOGIN_SERVER }}/${{ inputs.app_name }}:${{ needs.version.outputs.tag }} \
--container-image-name ${{ secrets.ACR_LOGIN_SERVER }}/${{ inputs.app_name }}:${{ needs.prepare.outputs.tag }} \
--container-registry-url https://${{ secrets.ACR_LOGIN_SERVER }} \
--container-registry-user ${{ secrets.ACR_USERNAME }} \
--container-registry-password ${{ secrets.ACR_PASSWORD }}
Expand All @@ -159,7 +162,7 @@ jobs:
# Equivalent to `dotnet nitro fusion publish ...`
dotnet tool exec ChilliCream.Nitro.CommandLine --prerelease --yes -- fusion publish \
--source-schema ${{ inputs.source_schema_name }} \
--tag ${{ needs.version.outputs.version }} \
--tag ${{ needs.prepare.outputs.version }} \
--stage ${{ secrets.NITRO_STAGE }} \
--api-id ${{ secrets.NITRO_API_ID }} \
--api-key ${{ secrets.NITRO_API_KEY }} \
--api-key ${{ secrets.NITRO_API_KEY }}
83 changes: 83 additions & 0 deletions .github/workflows/pr-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
name: Build

on:
pull_request:
branches: [main]

jobs:
backend:
name: Build Backend
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up .NET 10 SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x

- name: Restore .NET tools
run: dotnet tool restore

- name: Restore
run: dotnet restore

- name: Build
run: dotnet build --no-restore -c Release

- name: Export Source Schemas
run: |
for project in Accounts Cart Inventory Order Payments Products Reviews Shipping; do
dotnet run --project "src/SourceSchemas/$project" --no-build -c Release -- schema export
done

- name: Validate GraphQL schema
run: |
dotnet nitro fusion validate \
--source-schema-file "src/SourceSchemas/Accounts/schema.graphqls" \
--source-schema-file "src/SourceSchemas/Cart/schema.graphqls" \
--source-schema-file "src/SourceSchemas/Inventory/schema.graphqls" \
--source-schema-file "src/SourceSchemas/Order/schema.graphqls" \
--source-schema-file "src/SourceSchemas/Payments/schema.graphqls" \
--source-schema-file "src/SourceSchemas/Products/schema.graphqls" \
--source-schema-file "src/SourceSchemas/Reviews/schema.graphqls" \
--source-schema-file "src/SourceSchemas/Shipping/schema.graphqls" \
--stage "dev" \
--api-id ${{ secrets.NITRO_API_ID }} \
--api-key ${{ secrets.NITRO_API_KEY }}

# TODO: Create OpenAPI collection once deployed to prod
- name: Validate OpenAPI documents
run: |
dotnet nitro openapi validate \
--openapi-collection-id "" \
--pattern "src/Gateway/OpenApi/*.graphql" \
--stage "dev" \
--api-key ${{ secrets.NITRO_API_KEY }}

frontend:
name: Build Frontend
runs-on: ubuntu-latest

defaults:
run:
working-directory: src/frontend

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: yarn
cache-dependency-path: src/frontend/yarn.lock

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Build
run: yarn build
28 changes: 15 additions & 13 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,24 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup Label="HotChocolate">
<PackageVersion Include="HotChocolate" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.AspNetCore" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.AspNetCore.Authorization" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.AspNetCore.CommandLine" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Data.EntityFramework" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Fusion.Composition" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Fusion.Packaging" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Subscriptions.Postgres" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Fusion.AspNetCore" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Fusion.Aspire" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Diagnostics" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Execution" Version="16.0.0-p.10.36" />
<PackageVersion Include="HotChocolate.Types.Analyzers" Version="16.0.0-p.10.36">
<PackageVersion Include="HotChocolate" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.AspNetCore" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.AspNetCore.Authorization" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.AspNetCore.CommandLine" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Data.EntityFramework" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Fusion.Adapters.OpenApi" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Fusion.Composition" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Fusion.Packaging" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Subscriptions.Postgres" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Fusion.AspNetCore" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Fusion.Aspire" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Diagnostics" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Execution" Version="16.0.0-p.10.38" />
<PackageVersion Include="HotChocolate.Types.Analyzers" Version="16.0.0-p.10.38">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerUI" Version="10.1.0" />
</ItemGroup>
<ItemGroup Label="Nitro">
<PackageVersion Include="ChilliCream.Nitro" Version="16.0.0-preview.19" />
Expand Down
17 changes: 10 additions & 7 deletions src/Gateway/Demo.Gateway.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,26 @@
<PropertyGroup>
<IsAotCompatible>true</IsAotCompatible>
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime-deps:10.0-noble</ContainerBaseImage>
<InterceptorsNamespaces>$(InterceptorsNamespaces);Microsoft.AspNetCore.OpenApi.Generated</InterceptorsNamespaces>
</PropertyGroup>

<ItemGroup Condition="'$(ImplicitUsings)' == 'enable'">
<Using Include="Demo.Gateway"/>
<Using Include="Demo.Gateway.Properties"/>
<Using Include="Demo.Gateway" />
<Using Include="Demo.Gateway.Properties" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="HotChocolate.Fusion.AspNetCore"/>
<PackageReference Include="HotChocolate.AspNetCore.Authorization"/>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer"/>
<PackageReference Include="Microsoft.AspNetCore.HeaderPropagation"/>
<PackageReference Include="HotChocolate.Fusion.Adapters.OpenApi" />
<PackageReference Include="HotChocolate.Fusion.AspNetCore" />
<PackageReference Include="HotChocolate.AspNetCore.Authorization" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
<PackageReference Include="Microsoft.AspNetCore.HeaderPropagation" />
<PackageReference Include="ChilliCream.Nitro.Fusion" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Defaults\ServiceDefaults\Demo.ServiceDefaults.csproj"/>
<ProjectReference Include="..\Defaults\ServiceDefaults\Demo.ServiceDefaults.csproj" />
</ItemGroup>

</Project>
8 changes: 8 additions & 0 deletions src/Gateway/OpenApi/AllProducts.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
query AllProducts($first: Int, $after: String)
@http(method: GET, route: "/products", queryParameters: ["first", "after"]) {
products(first: $first, after: $after) {
nodes {
...Product
}
}
}
5 changes: 5 additions & 0 deletions src/Gateway/OpenApi/GetProductById.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
query GetProductById($id: ID!) @http(method: GET, route: "/products/{id}") {
productById(id: $id) {
...Product
}
}
7 changes: 7 additions & 0 deletions src/Gateway/OpenApi/Product.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fragment Product on Product {
id
name
price
availableQuantity: quantity
pictureUrl
}
Loading
Loading