Skip to content

🔧 chore(i18n): sync translations from Crowdin#598

Closed
github-actions[bot] wants to merge 4 commits into
dev/v1.6from
l10n_crowdin
Closed

🔧 chore(i18n): sync translations from Crowdin#598
github-actions[bot] wants to merge 4 commits into
dev/v1.6from
l10n_crowdin

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated sync from Crowdin. Review wording, then merge.

@vercel

vercel Bot commented Jul 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
drydock-website Ready Ready Preview, Comment Jul 24, 2026 11:35pm
drydockdemo-website Ready Ready Preview, Comment Jul 24, 2026 11:35pm

@scttbnsn

Copy link
Copy Markdown
Contributor

Closing this one. The l10n_crowdin branch was cut at 6518387, before the previous sync (#545) landed, so it's carrying stale copies of 17 locales' listViews.json plus fr/containerComponents.json and conflicts with dev/v1.6. CI Verify and E2E never ran on it either, since GitHub can't build a merge commit for a conflicting PR.

Nothing's lost, Crowdin has the translations. Deleting the branch so the next sync recreates it from the current dev tip.

@scttbnsn scttbnsn closed this Jul 26, 2026
@scttbnsn
scttbnsn deleted the l10n_crowdin branch July 26, 2026 14:58
scttbnsn added a commit that referenced this pull request Jul 26, 2026
)

The Crowdin sync failed on main on 2026-07-24 with a bare `exit 1` and
no message. Root cause turned out to be a bug class rather than a
one-off, so this fixes both instances of it and adds coverage.

## The pattern

Inside a `set -e`/`pipefail` region, a command that exits non-zero on an
*empty* result aborts the step before an explicitly written fallback can
run. The fallback is dead code. The tell: someone wrote handling for the
empty case, and the empty case can't reach it.

## 1. Crowdin base-branch resolution

`i18n-crowdin.yml` resolves the highest `dev/vX.Y` on origin and falls
back to the default branch when there is none, so translations always
have somewhere to land between a GA and the next dev branch being cut.
Under `set -euo pipefail` a no-match `grep` exits 1, which fails the
pipeline, which fails the assignment, which aborts the step. The `if [
-z ]` fallback below it could never run.

It fired for real: merging sync PR #596 briefly deleted `dev/v1.6` via
auto-delete-head-branches, the push-to-main sync run found no `dev/v*`,
and the job died.

Guards the grep only, so a failing `ls-remote` (network, auth) still
propagates and fails loudly instead of silently retargeting translations
at main. That distinction matters more than the fix itself.

## 2. Load-test report resolution

Sweeping the other workflows for the same pattern turned up 8 more sites
in `ci-verify.yml`:

```
report="$(find artifacts/load-test/<mode> ... | sort -rn | head -n1 | cut -d' ' -f2-)"
```

`find` exits 0 on a directory that exists but is empty — the case the
downstream scripts handle. It exits 1 when the directory is *missing*,
and GitHub runs these steps under the default `bash -eo pipefail`, so
that aborts the step. `summarize-load-test-report.sh` and
`check-load-test-correctness.sh` both open with an `if [ -z "${REPORT}"
]` block written for exactly this, and neither gets to run.

Reachable, not theoretical: these steps are `if: always()`, and
`run-load-test.sh` only does `mkdir -p` on the artifact dir at line 168
— after the docker build, compose up, and the health-check wait that
exits 1 at line 136. A load test that fails the way load tests usually
fail leaves the directory absent, and the step meant to explain that
dies with a bare exit 1.

## Coverage

`crowdin-base-branch-resolver.test.ts` executes the real `id: base` run
block extracted from the workflow against a stubbed git, rather than
asserting on workflow text, so it tracks the actual logic instead of a
copy that can drift. Three cases: no dev branches falls back and exits
0; several picks `dev/v1.10` over `v1.9` (lexical sort gets this wrong);
failing `ls-remote` still exits non-zero. That last one guards against
"fixing" the bug by swallowing all errors, which would be worse than the
bug.

Verified it fails against the pre-fix snippet with `expected 1 to be
+0`, and that the other two still pass — the bug only affects the one
path.

`ci-verify-find-pipefail-guard.test.ts` discovers the find sites by
walking the parsed workflow rather than pinning line numbers, so it also
catches a new unguarded `find` added later. Carries a sanity assertion
so it can't pass vacuously if the shape stops matching. Verified it
catches a revert by naming the exact offending step.

Executing the load-test steps for real would need docker plus Artillery
artifacts, so that one is a static assertion by design — noted in a
comment in the file.

## Notes

- Full pre-push gate green locally, including the 100% coverage gate and
zizmor.
- Related but separate: `main` is currently failing its scheduled CI
Verify on `brace-expansion@5.0.7` (CVE-2026-14257). That is already
fixed on `dev/v1.6` at 5.0.8 — it just needs the next dev → main sync,
no code change.
- Also closed #598 and deleted `l10n_crowdin`; it was cut before #545
landed and had gone conflicting. It regenerates from the dev tip on the
next push here.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Changelog

- 🐛 Fixed Crowdin base-branch resolver so “no matching dev/vX.Y”
correctly falls back to `DEFAULT_BRANCH` under `set -euo pipefail`,
while `git ls-remote` failures still propagate.
- 🐛 Fixed CI load-test report discovery by guarding each `find
artifacts/load-test/<site>/...*.json ...` command-substitution pipeline
so missing artifact directories don’t abort later empty-report handling
under `pipefail`.
- 🔧 Changed `test/cpu-bench.sh` to guard the per-container `grep "^$c "`
used to compute stats so missing samples don’t stop the script under
`set -euo pipefail`.
- ✨ Added Jest coverage for Crowdin fallback behavior, highest
`dev/vX.Y` selection, and `ls-remote` error propagation.
- ✨ Added static workflow analysis coverage to ensure every load-test
report lookup assignment site uses a fully pipefail-safe `find` guard
(including later pipeline stages).

## Concerns

- Ensure the workflow-scan regex continues to correctly identify the
intended `find`-into-variable command-substitution assignments and
doesn’t miss new sites.
- Verify the static “expected eight-site count” remains in sync with the
number of load-test report lookup assignments across CI
(ci/behavior/stress, summarize/correctness/regression).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants