From 08942202e1f51647ee08e9b611870f66b8050fc0 Mon Sep 17 00:00:00 2001 From: Stamen Stoychev Date: Tue, 29 Sep 2026 17:20:50 +0300 Subject: [PATCH 1/2] feat(ci): build Japanese as well as English on PRs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI built English only: the matrix covered platforms, not languages, and both build steps used the default (EN) scripts. Nothing in PR validation ever exercised JP, so JP-only breakage reached vnext and was found by a deploy. The two languages do not resolve content identically, so an EN build is not a proxy for a JP one. docs/angular/astro.config.ts maps @xplat-images to src/content//images, which means an image present in EN does not satisfy a JP import — exactly how #873 happened, and what #842 asks for. Adds a lang axis to the existing matrix, taking it from 4 jobs to 8. The JP scripts already exist and are what the deploy workflows run, so each job is the same build the corresponding deploy performs, with DOCS_TOC_STRICT on. Also sets fail-fast: false. With two languages in the matrix the default would let a JP failure cancel the EN jobs, hiding results that are still worth seeing. Related to #842, #873 Co-Authored-By: Claude Opus 5 --- .github/workflows/ci.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 743e92dafa..b883cb6efb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,8 +12,16 @@ jobs: runs-on: ubuntu-latest strategy: + # Report every platform/language combination instead of stopping at the + # first failure — a JP-only break should not hide the EN results. + fail-fast: false matrix: platform: ['angular', 'react', 'webcomponents', 'blazor'] + # Japanese is built as well as English because the two resolve content + # differently: docs/angular/astro.config.ts maps @xplat-images to + # src/content//images, so an image that exists in EN does not + # satisfy a JP import, and an EN-only build never notices. + lang: ['en', 'jp'] steps: - name: Checkout @@ -30,13 +38,13 @@ jobs: # DOCS_TOC_STRICT fails the build when a toc.json entry points at a # missing file, instead of silently dropping it from the sidebar. - - name: Build ${{ matrix.platform }} - run: npm run xplat:build:${{ matrix.platform }} + - name: Build ${{ matrix.platform }} (${{ matrix.lang }}) + run: npm run xplat:build:${{ matrix.platform }}${{ matrix.lang == 'jp' && ':jp' || '' }} env: DOCS_TOC_STRICT: 'true' - - name: Build Angular Unique + - name: Build Angular Unique (${{ matrix.lang }}) if: matrix.platform == 'angular' - run: npm run angular:build + run: npm run angular:build${{ matrix.lang == 'jp' && ':jp' || '' }} env: DOCS_TOC_STRICT: 'true' From 94738920a32f9bf62f8af0be71cb4c86864f3c90 Mon Sep 17 00:00:00 2001 From: Stamen Stoychev Date: Tue, 29 Sep 2026 17:41:48 +0300 Subject: [PATCH 2/2] feat(ci): cancel superseded runs for the same PR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Doubling the matrix to eight jobs makes superseded runs expensive: without a concurrency group, pushing to a PR leaves the previous run building all eight to completion while the new one starts, and nobody reads the old result. Grouping on head_ref keeps this per-PR, so runs on other PRs are untouched. The github.ref fallback is inert while this workflow is pull_request-only; it matters only if a push trigger is ever added. Safe to cancel here because these jobs only build — nothing is published or deployed, so a job killed mid-step leaves no partial state behind. Co-Authored-By: Claude Opus 5 --- .github/workflows/ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b883cb6efb..e2328c9e98 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,13 @@ on: pull_request: branches: [ master, vnext ] +# A new push supersedes whatever is still running for the same PR, so cancel it +# rather than paying for eight jobs worth of results nobody will read. head_ref +# keeps the group per-PR; the fallback matters only if a push trigger is ever added. +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} + cancel-in-progress: true + jobs: build-and-verify: