Skip to content

chore(release): promote staging to production - #2904

Merged
RemiBonnet merged 5 commits into
mainfrom
staging
Aug 26, 2026
Merged

chore(release): promote staging to production#2904
RemiBonnet merged 5 commits into
mainfrom
staging

Conversation

@RemiBonnet

Copy link
Copy Markdown
Member

Opens the production promotion path from staging to main. Merging this PR triggers semantic-release, then the existing production deployment workflow.

Do not squash this PR. Use a merge commit to preserve the original conventional commits for semantic-release.

RemiBonnet and others added 5 commits August 24, 2026 15:18
* feat(terraform): move variables to service variables tab

* fix(terraform): align variables tab layout

* fix(terraform): move save action outside variables panel

* fix(terraform): refine variables tab integration

* refactor(terraform): keep variables table styling flexible

* chore(terraform): document variables action portal

* fix(terraform): refine variables tab actions
…ed (#2901)

* feat(services): improve delete flow when service has been been deployed

* fix(services): handle uninstall errors without masking modal failures

- Propagate confirmation modal deletion failures
- Log errors from the post-close removal modal action

* test(services): restore mocks after each service action test
* feat(envs): add bulk stop action

Update stop confirmation modal

* Add missing aria-labels to checkboxes

* Add unit test

* UI improvements

* fix(envs): preserve checkbox focus on selection

- Render environment sections directly to avoid remounts
- Add regression coverage for checkbox focus

* feat(envs): add success toast for bulk stop

- Suppress per-environment success notifications during bulk stops
- Show a single success toast after stopping selected environments
- Add coverage for notification behavior

* Fix unit test
* fix(blueprint): render every preview outcome instead of spinning forever

What:
The blueprint update preview now settles on an explicit outcome
(pending / diff / no-changes / error / cancelled / timeout) instead of a
raw output string plus three booleans. The hook matches all four
BlueprintPreviewResult variants exhaustively, treats a diff with a blank
payload as "no changes", surfaces the error frame's message, fails fast
when the socket closes before any frame, and bounds the wait with a
12-minute watchdog. The step component renders one branch per outcome and
gates "Confirm & deploy update" on a successful preview.

Why:
The websocket contract sends exactly one frame then closes, and it has four
variants. The hook only handled `diff` and dropped `error`, `cancelled` and
`timeout` through a catch-all, so the component — which keyed its render on
whether the raw output string was non-empty — showed the loading skeleton
forever in all three cases, and in the empty-diff case too. Confirm was
gated on "a message arrived" rather than on the outcome, so it went live
while the skeleton was still animating. A failed preview was therefore
indistinguishable from one still running, and the user could deploy anyway.

Notes:
Verified by reproducing first: a temporary spec asserting the broken
behaviour (skeleton rendered + Confirm enabled for error/cancelled/timeout
and for an empty diff) passed against the unfixed code and fails against
this change.
The watchdog is 12min, deliberately above the gateway's own 11min limit, so
the server's timeout frame wins in the normal case and the watchdog only
catches a socket that dies without delivering anything.
onOpen is gone: `pending` is now the initial state, so there was nothing
left for it to set.
This is the console half of a wider fix. The backend still needs two
changes to make failures fast rather than merely visible: q-core's preview
broker reads only `message.fullDetails` in its `Diff` branch, so engine
errors — which arrive at step `Diff` with the text in
`error.userLogMessage` — are skipped, and it ignores the engine's
`Terminated` step, so a run that ends without a diff waits out the full
10-minute consumer timeout. Separately, the engine's DIFF path drops the
resolved timeout and runs `terraform plan` unbounded.

* fix(blueprint): center preview outcome messages and contain fake timers in specs

What:
The raw output container is now a flex column, and the no-changes and
failure branches fill it with `flex-1` instead of `h-full`. The failure
block carries `font-sans` on its wrapper instead of on the summary span
alone. Both preview specs restore real timers in `afterEach` rather than
on the last line of the fake-timer test.

Why:
`h-full` resolves a percentage height against the parent's height, and the
container only sets `min-h-[180px]`, leaving its height `auto`. The
percentage collapsed to the content height, so `justify-center` had no
free space to work with: measured in Chromium, the child was 20px tall
with 173px of dead space under it, top-aligning the message in the 180px
band. Everything in the failure block except the summary line also
inherited `font-mono` from the container. In the specs,
`jest.useRealTimers()` sat after the final assertion, so a failing
assertion would leave fake timers installed for every later test in the
file.

Notes:
Verified in Chromium: the branch content is now 180px tall with symmetric
13px gaps. The diff branch is unaffected — its `pre` keeps its full height
inside the fixed-height container and still scrolls, and its bottom
padding is now honored, which flex scroll containers do and block ones
truncate.

---------

Co-authored-by: Rémi Bonnet <bonnet.rem@gmail.com>
Co-authored-by: Rémi Bonnet <rbonnet@qovery.com>
* feat(billing): grant full product access during free trial

Trial organizations no longer need a credit card to create managed
clusters. Billing screens now surface an "Activate my plan" CTA that
opens the Pylon ask-for-activation form, alongside the existing
self-service credit card management. New organizations are created on
the Business plan by default so trial access matches this scope.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(billing): display the org's real plan in the trial activation banner

Now that new organizations are created on the Business plan by
default, the billing details banner can read the actual plan again
instead of hardcoding "Business plan".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(billing): address cubic review findings on PR #2902

- Always show "Activate my plan" during an active trial in billing
  summary, even when a credit card is already on file — "Cancel free
  trial" now renders alongside it instead of replacing it, since
  activation still requires a Qovery rep regardless of the card.
- Align settings-billing-details' isInActiveFreeTrial with the same
  90-day upper bound used by useClusterCreationRestriction.
- Cover the "Activate my plan" click flow and the trial boundary in
  settings-billing-details tests.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(billing): mirror the 90-day trial cap in billing summary

The previous fix aligned settings-billing-details' trial check with
useClusterCreationRestriction's 90-day upper bound but left
settings-billing-summary unbounded, so the two pages disagreed again
for remaining_trial_day > 90.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* refactor(billing): extract the 90-day trial window into a shared util

The remainingTrialDay > 0 && <= 90 check was duplicated in four
places (both use-cluster-creation-restriction hooks, billing details,
billing summary) and had already drifted twice across review rounds.
Extracted TRIAL_MAX_DAY and isActiveFreeTrial() to
@qovery/shared/util-js as the single source of truth.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
@RemiBonnet
RemiBonnet merged commit c0c63ab into main Aug 26, 2026
7 checks passed
@RemiBonnet

Copy link
Copy Markdown
Member Author

🎉 This PR is included in version 1.343.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@codecov

codecov Bot commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 73.46939% with 39 lines in your changes missing coverage. Please review.
✅ Project coverage is 48.46%. Comparing base (720181b) to head (eaaeba1).
⚠️ Report is 26 commits behind head on main.

Files with missing lines Patch % Lines
.../src/lib/environments-table/environments-table.tsx 50.00% 10 Missing and 3 partials ⚠️
...-table/environment-section/environment-section.tsx 71.42% 3 Missing and 3 partials ⚠️
...re/src/lib/free-trial-banner/free-trial-banner.tsx 0.00% 4 Missing ⚠️
...hooks/use-stop-environment/use-stop-environment.ts 25.00% 1 Missing and 2 partials ⚠️
...on-restriction/use-cluster-creation-restriction.ts 0.00% 2 Missing ⚠️
...vironments-table/environments-table-action-bar.tsx 88.88% 0 Missing and 2 partials ⚠️
...on-restriction/use-cluster-creation-restriction.ts 0.00% 2 Missing ⚠️
...eature/src/lib/service-actions/service-actions.tsx 83.33% 1 Missing and 1 partial ⚠️
...rint-update-flow/blueprint-update-preview-step.tsx 86.66% 0 Missing and 2 partials ⚠️
...tings-billing-summary/settings-billing-summary.tsx 85.71% 1 Missing ⚠️
... and 2 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2904      +/-   ##
==========================================
- Coverage   49.29%   48.46%   -0.84%     
==========================================
  Files         849     1272     +423     
  Lines       21194    27590    +6396     
  Branches     6443     8114    +1671     
==========================================
+ Hits        10448    13372    +2924     
- Misses       8932    11952    +3020     
- Partials     1814     2266     +452     
Flag Coverage Δ
unittests 48.46% <73.46%> (-0.84%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants