From 16c69e9a427cd980ce4c8180e9c5ce7c989ece6c Mon Sep 17 00:00:00 2001 From: Thomas Jung Date: Sun, 25 Oct 2026 13:40:52 +0100 Subject: [PATCH 1/3] fix(ci): regenerate gitignored CSS before unit-test Hugo build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test/unit/hugo-homepage-partials.test.ts spawns a real Hugo build. head.html:27 does `resources.Get "css/fundamental-styles-icon.css" | minify | fingerprint`. Since ac6b7e39f stopped committing the generated CSS (sap-fundamental.css, fundamental-styles-icon.css are now gitignored build outputs), these assets are absent on a fresh checkout. unit-tests.yml never regenerated them, so resources.Get missed the asset, minify got a non-transformable resource.Resource, and the Hugo build exited 1 — failing 7 test files. rebuild-content.yml already regenerates these before its Hugo build; this mirrors that step (build:icon-subset + build:css) before npm test. Verified: without the assets Hugo exits 1 (4 minify errors); after the two gen steps Hugo exits 0 and hugo-homepage-partials.test.ts passes 4/4. --- .github/workflows/unit-tests.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index beebed31b..0137dec40 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -54,5 +54,19 @@ jobs: # available to all workers unconditionally, matching what the MTA # before-all and local dev do. run: node scripts/bundle-shared.cjs + - name: Generate fingerprinted CSS (sap-fundamental + icon subset) required by the Hugo build test + # test/unit/hugo-homepage-partials.test.ts spawns a real Hugo build, and + # hugo/layouts/partials/head.html:27 does + # resources.Get "css/fundamental-styles-icon.css" | minify | fingerprint + # Since ac6b7e39f ("stop committing generated CSS so deploy & rebuild + # agree on fingerprint") both sap-fundamental.css and + # fundamental-styles-icon.css are gitignored build outputs — absent on a + # fresh checkout. Without them `resources.Get` misses the asset, `minify` + # receives a non-transformable resource.Resource, and the Hugo build exits + # 1 → 7 test files fail. rebuild-content.yml already regenerates these + # before its Hugo build; mirror that here so the unit suite does too. + run: | + npm run build:icon-subset + npm run build:css - name: Run unit tests run: npm test From abdf1745a5314ab159cb8d3d3ccfedd3277629bd Mon Sep 17 00:00:00 2001 From: Thomas Jung Date: Sun, 25 Oct 2026 14:31:05 +0100 Subject: [PATCH 2/3] fix(ci): QA asset guard probes the PROD approuter, not nonexistent APPROUTER_URL_QA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /tutorials-qa/* is served by the MAIN (prod) approuter (approuter/xs-app.json routes it to the srv-qa-api destination) — QA is a feature of production, not a separate environment. The asset guard referenced secrets.APPROUTER_URL_QA, which does not exist (repo has only APPROUTER_URL_DEV and APPROUTER_URL_PROD), so it resolved to an empty string and the guard die()d with 'missing --approuter-url' on every full QA rebuild. Point it at APPROUTER_URL_PROD. --- .github/workflows/rebuild-content-qa.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rebuild-content-qa.yml b/.github/workflows/rebuild-content-qa.yml index 6a736df0a..d9ad1b6cf 100644 --- a/.github/workflows/rebuild-content-qa.yml +++ b/.github/workflows/rebuild-content-qa.yml @@ -430,7 +430,14 @@ jobs: # infra run and file a false failure issue. if: ${{ steps.source_errors.outputs.bad_slug == '' }} env: - APPROUTER_URL: ${{ secrets.APPROUTER_URL_QA }} + # QA is a feature of PRODUCTION, not a separate environment: /tutorials-qa/* + # is routed by the MAIN (prod) approuter (approuter/xs-app.json → srv-qa-api + # destination), so the QA HTML is dressed by the PROD approuter. The asset + # guard must probe that same approuter. There is no APPROUTER_URL_QA secret + # (only _DEV / _PROD); referencing it resolved to an empty string and the + # guard die()d with "missing --approuter-url" on every full QA rebuild + # (2026-10-25). + APPROUTER_URL: ${{ secrets.APPROUTER_URL_PROD }} # Match the publish step's PUBLISH_SLUG / PUBLISH_SLUGS expressions # EXACTLY (lines 424/431) so the probe scope tracks the publish scope: # a force-publish run ships the WHOLE catalog, so it must NOT pin the From 00b5b31e364c887a9614b3db51325c2c69f633c0 Mon Sep 17 00:00:00 2001 From: Thomas Jung Date: Sun, 25 Oct 2026 14:41:08 +0100 Subject: [PATCH 3/3] chore(release): 1.41.3 --- .deploy/mta.yaml | 2 +- hugo/data/whats_new.json | 145 ++++++++++++++++++++++++++++++++++++++- mta-mcp.yaml | 2 +- 3 files changed, 146 insertions(+), 3 deletions(-) diff --git a/.deploy/mta.yaml b/.deploy/mta.yaml index f71d5e5ab..fcc129d85 100644 --- a/.deploy/mta.yaml +++ b/.deploy/mta.yaml @@ -10,7 +10,7 @@ ID: tutorials-ims # Bump this on each release you deploy — it's the version shown by `cf mtas` # and in the mtar filename (tutorials-ims_.mtar). Deploy is manual: # `cd .deploy && mbt build && cf deploy mta_archives/tutorials-ims_.mtar -e ../deploy/.mtaext -f`. -version: 1.41.0 +version: 1.41.3 # Top-level parameters (overridable per-env via deploy/.mtaext). parameters: diff --git a/hugo/data/whats_new.json b/hugo/data/whats_new.json index 736efa9c9..c187323a2 100644 --- a/hugo/data/whats_new.json +++ b/hugo/data/whats_new.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-10-24T10:33:13.644Z", + "generatedAt": "2026-10-25T13:40:20.076Z", "repos": [ { "key": "tutorials-ims", @@ -8,6 +8,149 @@ } ], "entries": [ + { + "id": "tutorials-ims#2923", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2923, + "title": "fix(ci): QA asset guard probes PROD approuter (QA is a feature of prod)", + "summary": "Fixed the QA author-preview rebuild so its asset check targets the correct approuter, unblocking QA content refreshes.", + "category": "Maintenance", + "mergedAt": "2026-10-25T13:37:15Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2923" + }, + { + "id": "tutorials-ims#2922", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2922, + "title": "fix(ci): regenerate gitignored CSS before unit-test Hugo build", + "summary": "Unit-test build now regenerates its CSS first, so the test suite runs reliably on a clean checkout.", + "category": "Maintenance", + "mergedAt": "2026-10-25T12:48:25Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2922" + }, + { + "id": "tutorials-ims#2921", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2921, + "title": "TypeScript glossary entry corrected", + "summary": "Corrected the glossary definition for TypeScript so the term reads accurately for learners.", + "category": "Fix", + "mergedAt": "2026-10-25T12:23:58Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2921" + }, + { + "id": "tutorials-ims#2919", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2919, + "title": "release v1.41.2 DEV to main promotion", + "summary": "Release 1.41.2 promoted the QA content-pipeline fix from DEV to the production branch.", + "category": "Maintenance", + "mergedAt": "2026-10-25T12:05:49Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2919" + }, + { + "id": "tutorials-ims#2918", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2918, + "title": "docs: record QA/PROD rebuild-workflow parity rule (follow-up to #2917)", + "summary": "Documented the parity rule that keeps the QA and production content-rebuild pipelines generating identical CSS.", + "category": "Maintenance", + "mergedAt": "2026-10-25T11:59:44Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2918" + }, + { + "id": "tutorials-ims#2917", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2917, + "title": "QA tutorial previews build and style correctly again", + "summary": "The QA author-preview channel now regenerates its icon and base CSS before building, so author previews render with full styling.", + "category": "Fix", + "mergedAt": "2026-10-25T11:53:50Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2917" + }, + { + "id": "tutorials-ims#2916", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2916, + "title": "release v1.41.1 DEV to main promotion", + "summary": "Release 1.41.1 promoted the prior window of fixes from DEV to the production branch.", + "category": "Maintenance", + "mergedAt": "2026-10-25T11:44:57Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2916" + }, + { + "id": "tutorials-ims#2915", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2915, + "title": "Prize-drawing winner cards show the winner's email again", + "summary": "Prize-drawing winner cards now show the winner's email by falling back to their verified sign-in identity when no address is on their main profile.", + "category": "Fix", + "mergedAt": "2026-10-25T08:20:00Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2915" + }, + { + "id": "tutorials-ims#2914", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2914, + "title": "Badge scanner shows the contestant name in dark mode", + "summary": "The badge scanner's contestant name is now legible in dark mode, and the underlying theme fix also corrects icon and card-border colors across every page island.", + "category": "Fix", + "mergedAt": "2026-10-25T08:08:40Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2914" + }, + { + "id": "tutorials-ims#2913", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2913, + "title": "App Space parallel-path timelines use the full width", + "summary": "App Space tracks with multiple parallel lanes now widen to fill the available space so card titles stop wrapping one word per line.", + "category": "Fix", + "mergedAt": "2026-10-24T14:02:14Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2913" + }, + { + "id": "tutorials-ims#2911", + "repo": "tutorials-ims", + "label": "Developer Portal", + "number": 2911, + "title": "release v1.41.0 DEV to main promotion", + "summary": "Release 1.41.0 promoted the prior window of fixes and features from DEV to the production branch.", + "category": "Maintenance", + "mergedAt": "2026-10-24T10:35:54Z", + "week": "2026-W43", + "weekStart": "2026-10-19", + "url": "https://github.com/sap-tutorials/tutorials-ims/pull/2911" + }, { "id": "tutorials-ims#2910", "repo": "tutorials-ims", diff --git a/mta-mcp.yaml b/mta-mcp.yaml index fee769d2b..c74875f39 100644 --- a/mta-mcp.yaml +++ b/mta-mcp.yaml @@ -4,7 +4,7 @@ _schema-version: 3.3.0 # This file lives at repo root → path: gen/srv-mcp (root-relative, no ../). # before-all runs from ROOT (no cd ..) — mbt uses the descriptor's directory as cwd. ID: tutorials-mcp -version: 1.1.0 +version: 1.1.3 # Destinations are subaccount-level, so DEV and PROD (sharing one subaccount) # need DISTINCT destination names. `dest-main-srv` defaults to the PROD name;