Skip to content

Commit 7d0c04d

Browse files
committed
Merge branch 'dev' of github.com:FritzAndFriends/BlazorWebFormsComponents into dev
2 parents 2af5abc + 17e5378 commit 7d0c04d

7 files changed

Lines changed: 63 additions & 12 deletions

File tree

.ai-team/agents/colossus/history.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,5 @@ Added 9 smoke tests and 9 interaction tests for M7 sample pages: GridView Select
3434

3535
Team update (2026-02-24): Menu auto-ID pattern Menu now auto-generates IDs, JS interop crash fixed decided by Cyclops
3636
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz
37+
38+
Team update (2026-02-25): Deployment pipeline patterns established compute Docker version with nbgv before build, gate on secrets, dual NuGet publishing decided by Forge

.ai-team/agents/cyclops/history.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,5 @@ Audited 13 controls. Found: AccessKey/ToolTip missing from base class (universal
7272
- **Shared PagerSettings sub-component:** Created `PagerSettings` class (plain C# POCO, not a Blazor component) with all 12 Web Forms PagerSettings properties (Mode, PageButtonCount, First/Last/Next/PreviousPageText, image URLs, Position, Visible). Created `PagerPosition` enum in `Enums/` (PagerButtons already existed). Created `IPagerSettingsContainer` interface in `Interfaces/`. Created `UiPagerSettings` abstract base component following the `UiTableItemStyle` CascadingParameter pattern but for settings instead of styles. Created 3 concrete sub-component pairs: `GridViewPagerSettings`, `FormViewPagerSettings`, `DetailsViewPagerSettings` — each inherits `UiPagerSettings` and uses `[CascadingParameter(Name = "ParentXxx")]` to set properties on the parent's `PagerSettings` instance. Wired into GridView, FormView, DetailsView: added `IPagerSettingsContainer` to each control's interface list, added `PagerSettings` property + `PagerSettingsContent` RenderFragment parameter, rendered `@PagerSettingsContent` inside existing `<CascadingValue>` block. Key files: `Enums/PagerPosition.cs`, `PagerSettings.cs`, `Interfaces/IPagerSettingsContainer.cs`, `UiPagerSettings.cs`, `GridViewPagerSettings.razor(.cs)`, `FormViewPagerSettings.razor(.cs)`, `DetailsViewPagerSettings.razor(.cs)`.
7373
Team update (2026-02-24): Substitution/Xml formally deferred no implementation needed decided by Beast
7474
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz
75+
76+
Team update (2026-02-25): Deployment pipeline patterns established compute Docker version with nbgv before build, gate on secrets, dual NuGet publishing decided by Forge

.ai-team/agents/forge/history.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,23 @@ Planned M7: "Control Depth & Navigation Overhaul" — 51 work items targeting ~1
8989
Team update (2026-02-24): Substitution/Xml formally deferred in status.md and README decided by Beast
9090
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz
9191
Team update (2026-02-24): PagerSettings shared sub-component created for GridView/FormView/DetailsView decided by Cyclops
92+
93+
### Summary: v0.14 Deployment Pipeline Fixes (2026-02-25)
94+
95+
Fixed three deployment pipeline issues on `fix/deployment-workflows` branch:
96+
97+
- **Docker version computation:** `.dockerignore` excludes `.git`, so nbgv can't run inside the Docker build. Solution: compute version with `nbgv get-version` in the workflow BEFORE Docker build, pass as `ARG VERSION` into the Dockerfile, use `-p:Version=$VERSION -p:InformationalVersion=$VERSION` in both `dotnet build` and `dotnet publish`. This pattern (compute outside, inject via build-arg) is the standard approach when `.git` isn't available inside the build context.
98+
- **Azure App Service webhook:** Added a `curl -sf -X POST` step gated on `AZURE_WEBAPP_WEBHOOK_URL` secret. Uses `|| echo "::warning::..."` fallback so the workflow doesn't fail if the webhook is unavailable. The webhook URL comes from Azure Portal → App Service → Deployment Center.
99+
- **nuget.org publishing:** Added a second push step after the existing GitHub Packages push, gated on `NUGET_API_KEY` secret. Both pushes use `--skip-duplicate` for idempotency.
100+
101+
**Key file paths:**
102+
- `.github/workflows/deploy-server-side.yml` — Docker build + push + Azure webhook
103+
- `.github/workflows/nuget.yml` — NuGet pack + push (GitHub Packages + nuget.org)
104+
- `samples/AfterBlazorServerSide/Dockerfile` — server-side demo container
105+
106+
**Patterns established:**
107+
- Secret-gated workflow steps use `if: ${{ secrets.SECRET_NAME != '' }}` for graceful fallback when secrets aren't configured
108+
- Docker images are tagged with version number (from nbgv), `latest`, and commit SHA
109+
- Version is computed once via nbgv and shared via GitHub Actions step outputs (`steps.nbgv.outputs.version`)
110+
111+
Team update (2026-02-25): Deployment pipeline patterns established compute Docker version with nbgv before build, gate on secrets, dual NuGet publishing decided by Forge

.ai-team/decisions.md

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -462,12 +462,11 @@ Suggested timeline:
462462
**What:** `Label` currently inherits `BaseWebFormsComponent` but Web Forms `Label` inherits from `WebControl`. This means Label is missing all 9 style properties (CssClass, BackColor, ForeColor, Font, etc.). Also consider `AssociatedControlID` to render `<label for="...">` instead of `<span>`.
463463
**Why:** Label is one of the most commonly used controls. Missing style properties break migration for any page that styles its Labels.
464464

465-
### 2026-02-23: Substitution and Xml remain permanently deferred
465+
### 2026-02-25: Substitution and Xml permanently deferred (consolidated)
466466

467467
**By:** Beast
468-
**What:** Both controls are tightly coupled to server-side ASP.NET infrastructure: Substitution depends on the output caching pipeline (`HttpResponse.WriteSubstitution`); Xml depends on XSLT transformation. Neither maps to Blazor's component model.
469-
**Recommendation:** Document migration alternatives in `DeferredControls.md`. Substitution → Blazor component lifecycle. Xml → convert XML to C# objects and use Blazor templates.
470-
**Why:** Reinforces and formalizes the Sprint 3 deferral decision with specific migration guidance.
468+
**What:** Both controls are tightly coupled to server-side ASP.NET infrastructure: Substitution depends on the output caching pipeline; Xml depends on XSLT transformation. Neither maps to Blazor's component model. Both are formally marked as deferred in status.md and README.md. DeferredControls.md contains migration guidance: Substitution -> Blazor component lifecycle; Xml -> convert XML to C# objects and use Blazor templates.
469+
**Why:** Architecturally incompatible with Blazor. Marking as deferred (not "Not Started") accurately communicates they will not be implemented.
471470

472471
### 2026-02-23: Chart Type Gallery documentation convention
473472

@@ -1344,12 +1343,6 @@ All P2 features (WI-47 through WI-52) have been tested with 32 bUnit tests acros
13441343

13451344
Team should be aware that Login/ChangePassword/CreateUserWizard BaseStyledComponent inheritance was already in place — WI-52's implementation may have been a no-op or only required template changes to wire `Style`/`CssClass` to the outer element.
13461345

1347-
### Substitution and Xml formally deferred
1348-
1349-
**By:** Beast
1350-
**What:** Substitution and Xml controls are now formally marked as "⏸️ Deferred" (not "Not Started") in status.md. DeferredControls.md already had migration guidance; status.md and README.md now reflect the permanent deferral. Chart is marked as fully complete with no "Phase 1" qualifier.
1351-
**Why:** These two controls are architecturally incompatible with Blazor (Substitution relies on output caching; Xml relies on XSLT transforms). Marking them as deferred rather than "Not Started" accurately communicates that they will not be implemented, and clears the remaining work count to 0.
1352-
13531346
# Decision: M7 Integration Tests Added (WI-39 + WI-40)
13541347

13551348
**Author:** Colossus
@@ -1924,3 +1917,8 @@ Removed the `@rendermode InteractiveServer` directive. No other sample page in t
19241917
- `dotnet build samples/AfterBlazorClientSide/ --configuration Release` — ✅ passes
19251918
- `dotnet build samples/AfterBlazorServerSide/ --configuration Release` — ✅ passes
19261919
- `dotnet test src/BlazorWebFormsComponents.Test/ --no-restore` — ✅ passes
1920+
1921+
### 2026-02-25: Deployment pipeline patterns for Docker versioning, Azure webhook, and NuGet publishing
1922+
**By:** Forge
1923+
**What:** Established three CI/CD patterns: (1) Compute version with nbgv outside Docker build and inject via build-arg, since .dockerignore excludes .git. (2) Gate optional deployment steps on repository secrets with `if: ${{ secrets.SECRET_NAME != '' }}` so workflows don't fail when secrets aren't configured. (3) Dual NuGet publishing always push to GitHub Packages, conditionally push to nuget.org.
1924+
**Why:** The .dockerignore excluding .git is a structural constraint that won't change (it's correct for build performance). Secret-gating ensures the workflows work in forks and PRs where secrets aren't available. Dual NuGet publishing gives us private (GitHub) and public (nuget.org) distribution without duplicating the pack step. These patterns should be followed for any future workflow additions.

.github/workflows/deploy-server-side.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@ jobs:
2929
with:
3030
fetch-depth: 0
3131

32+
- name: Setup .NET for version computation
33+
uses: actions/setup-dotnet@v4
34+
with:
35+
dotnet-version: '10.0.x'
36+
37+
- name: Compute version with nbgv
38+
id: nbgv
39+
run: |
40+
dotnet tool install --global nbgv
41+
VERSION=$(nbgv get-version -v NuGetPackageVersion)
42+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
43+
echo "Computed version: $VERSION"
44+
3245
- name: Log in to GitHub Container Registry
3346
uses: docker/login-action@v3
3447
with:
@@ -45,6 +58,17 @@ jobs:
4558
context: .
4659
file: samples/AfterBlazorServerSide/Dockerfile
4760
push: true
61+
build-args: |
62+
VERSION=${{ steps.nbgv.outputs.version }}
4863
tags: |
4964
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
65+
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.nbgv.outputs.version }}
5066
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
67+
68+
- name: Trigger Azure App Service deployment
69+
if: ${{ secrets.AZURE_WEBAPP_WEBHOOK_URL != '' }}
70+
run: |
71+
curl -sf -X POST "${{ secrets.AZURE_WEBAPP_WEBHOOK_URL }}" \
72+
-H "Content-Length: 0" \
73+
--max-time 60 \
74+
|| echo "::warning::Azure webhook call failed — the App Service may need to be updated manually"

.github/workflows/nuget.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ jobs:
4040
- name: Push to GitHub Packages
4141
run: dotnet nuget push ./nupkg/*.nupkg --source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" --api-key ${{ secrets.GITHUB_TOKEN }} --skip-duplicate
4242

43+
- name: Push to nuget.org
44+
if: ${{ secrets.NUGET_API_KEY != '' }}
45+
run: dotnet nuget push ./nupkg/*.nupkg --source "https://api.nuget.org/v3/index.json" --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
46+
4347
- name: Upload NuGet package artifact
4448
uses: actions/upload-artifact@v4
4549
with:

samples/AfterBlazorServerSide/Dockerfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ EXPOSE 80
66
ENV ASPNETCORE_HTTP_PORTS=80
77

88
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
9+
ARG VERSION=0.0.0
910
WORKDIR /src
1011
COPY ["Directory.Build.props", "./"]
1112
COPY ["samples/AfterBlazorServerSide/AfterBlazorServerSide.csproj", "samples/AfterBlazorServerSide/"]
@@ -14,10 +15,10 @@ COPY ["samples/SharedSampleObjects/SharedSampleObjects.csproj", "samples/SharedS
1415
RUN dotnet restore "samples/AfterBlazorServerSide/AfterBlazorServerSide.csproj"
1516
COPY . .
1617
WORKDIR "/src/samples/AfterBlazorServerSide"
17-
RUN dotnet build "AfterBlazorServerSide.csproj" -c Release -o /app/build
18+
RUN dotnet build "AfterBlazorServerSide.csproj" -c Release -o /app/build -p:Version=$VERSION -p:InformationalVersion=$VERSION
1819

1920
FROM build AS publish
20-
RUN dotnet publish "AfterBlazorServerSide.csproj" -c Release -o /app/publish
21+
RUN dotnet publish "AfterBlazorServerSide.csproj" -c Release -o /app/publish -p:Version=$VERSION -p:InformationalVersion=$VERSION
2122

2223
FROM base AS final
2324
WORKDIR /app

0 commit comments

Comments
 (0)