Skip to content

v1.4.0-rc.11#132

Merged
s-b-e-n-s-o-n merged 34 commits intomainfrom
release/v1.4.0-rc.11
Mar 10, 2026
Merged

v1.4.0-rc.11#132
s-b-e-n-s-o-n merged 34 commits intomainfrom
release/v1.4.0-rc.11

Conversation

@s-b-e-n-s-o-n
Copy link
Contributor

Summary

  • Compose trigger: Docker Engine API — Replaced CLI shelling (docker compose / docker-compose) with direct Docker Engine API calls for container updates. Eliminates spawn docker ENOENT errors in environments without Docker CLI.
  • Compose self-update delegation — Self-update for compose-managed Drydock containers now delegates to the parent Docker trigger's orchestrator path (helper-container transition with health gates and rollback).
  • Manual update button fix — The update endpoint now searches for both docker and dockercompose trigger types, fixing "No docker trigger found" for compose-only users.
  • CI: qlty retry on timeout — Changed retry_on from error to any and increased timeout from 5 to 8 minutes.
  • CHANGELOG placement — Moves new entries from Unreleased to the 1.4.0 section.

Test plan

  • 215 compose trigger tests pass (including new Engine API tests)
  • 37 container-actions tests pass (including new compose trigger matching test)
  • Full app suite: 3972 tests pass
  • Biome clean
  • Lefthook pre-push: all green

🤖 Generated with Claude Code

s-b-e-n-s-o-n and others added 4 commits March 9, 2026 20:17
- Rewrite validateComposeConfiguration to parse YAML in-process instead
  of spawning docker compose config
- Rewrite updateContainerWithCompose to use Docker Engine API
  (pullImage + stopAndRemoveContainer + recreateContainer) instead of
  docker compose pull/up
- Delegate executeSelfUpdate to parent orchestrator for health gate and
  rollback safety
- Log deprecation for composeFileOnce batch mode (unavailable without CLI)
- Remove dead code: updateComposeServicesWithCompose, runComposeCommand,
  executeCommand, getContainerRunningState, execFile import, and
  COMPOSE_COMMAND_* constants
- Remove 18 dead tests and clean up spy references to removed methods
The updateContainer endpoint only searched for type 'docker' triggers,
missing dockercompose triggers entirely. Add triggerTypes option to
match the preview endpoint behavior.
retry_on was set to "error" which only retries on non-zero exit codes,
not on timeouts. Changed to "any" so the 5-minute timeout actually
triggers a retry. Also bumped timeout from 5 to 8 minutes since qlty
regularly takes longer in CI.
@vercel
Copy link

vercel bot commented Mar 10, 2026

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

Project Deployment Actions Updated (UTC)
drydock-website Ready Ready Preview, Comment Mar 10, 2026 6:47pm

@codecov
Copy link

codecov bot commented Mar 10, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

…mposeFileOnce

- Extract refreshComposeServiceWithDockerApi() as shared private helper
  called by both updateContainerWithCompose() and recreateContainer(),
  eliminating the recursive call chain
- Add ensureComposeRuntimeState() guard that throws when inspect data
  is missing State.Running
- Re-enable composeFileOnce batch mode: first container per service
  gets a full runtime refresh, subsequent containers for the same
  service skip the refresh via composeFileOnceApplied flag
- Add error-path tests for pullImage, stopAndRemoveContainer,
  recreateContainer failures, and malformed inspect data
Confirm dialog now awaits the async accept callback before closing,
showing a spinner and disabling all dismiss interactions while the
action runs. Previously the dialog closed immediately on confirm,
making the UI appear unresponsive during container actions.
…s actions

- Wire actionInProgress into disabled state for all container action buttons
  across full-page detail, side panel, and grouped views (table/card/list)
- Add aria-label attributes to full-page detail action buttons
- Show spinner icon replacing normal icon on active action button
- Add opacity-50 + cursor-not-allowed styling when disabled
- Add tests for disabled state and aria-labels
applyFilterSearchFromQuery already cleared dropdown filters (status,
registry, bouncer, server) but missed filterKind. When a user clicked
"Updates Available" on the dashboard (setting filterKind=any) then used
Ctrl+K to search for a container without updates, the persisted
filterKind filter hid the target container.
Dialog no longer blocks the UI while the action runs. The
actionInProgress disabled state on buttons provides visual feedback
instead.
Since the dialog now closes immediately on accept, the loading ref
and all loading-conditional template code are unreachable dead code.
- Rewrite confirm dialog changelog entry to reflect final behavior
  (dialog closes immediately, action buttons show spinner/disabled)
- Add missing changelog entry for Ctrl+K filter state fix
- Update README compose feature to say "Docker Engine API" not "docker-compose"
Remove getContainerIcon, getServerIcon, getLogIcon, getRegistryIcon,
getTriggerIcon, getWatcherIcon, getAgentIcon, getAuditIcon,
getAuthenticationIcon, and bouncerColor — all exported but never
imported anywhere in the codebase.
- Delete ui/babel.config.js — Babel is not a dependency (Vite handles builds)
- Remove "doc" script from app/package.json — references non-existent .docsify
- Remove "!website" from biome.json includes — no website/ directory exists
The compose trigger was refactored to use the Docker Engine API directly.
The CLI environment sanitizer and its allowlists are no longer needed.
AggregatedSecurityImage, AggregatedSecuritySummary,
AggregatedSecurityVulnerability, and SecurityVulnerabilityOverview
are used internally but never imported by other files.
Normalize sh:, hl:, and si: colon prefixes to dash format (sh-, hl-,
si-) so both separator styles work in Docker labels. Users naturally
use colon notation since it's the common convention in icon systems
like Iconify.

Fixes: #127
Change DEFAULT_TRIGGER_TYPES from ['docker'] to ['docker', 'dockercompose']
so rollbackContainer and webhook update endpoints find compose triggers.
The updateContainer and previewContainer endpoints already had this fix.
The si: prefix was leaking into API requests as si-si:nextcloud causing
slug validation failures. Extract normalizeIconPrefix to image-icon
service with recursive unwrapping of nested prefixes.
When a container is recreated externally (Portainer, docker compose up),
the old store entry becomes stale. Add name refresh during watch cycles,
stale same-name entry cleanup on new container discovery, and debounced
watch on rename events for race condition handling.
Implement native include/exclude filtering for MQTT payloads operating
on flattened keys. Include mode keeps only listed keys; exclude mode
removes them. Both take precedence over legacy EXCLUDE and HASS_ATTRIBUTES
preset. Also fix handleContainerEvent bypassing mustTrigger() check.
Use openid-client customFetch with undici.Agent to inject TLS settings
per-provider. CAFILE loads a PEM CA certificate for private/self-signed
CAs. INSECURE disables certificate verification (dev only, warns).
Document CAFILE/INSECURE options for OIDC auth and HASS_FILTER_INCLUDE/
HASS_FILTER_EXCLUDE options for MQTT trigger with precedence order and
examples.
Add tests for MQTT default attributes fallback, filterContainerInclude
symbol key preservation, pruneOldContainers missing watcher key, custom
displayName preservation on name change, and hook env allowlisted
prefixes parameter.
Snyk deps and code scans consume the 200/month org quota on every push.
Move to CI-only (release workflow) where they gate the actual release.
- Add eclipse-mosquitto:2 service with anonymous access for MQTT E2E testing
- Configure DD_TRIGGER_MQTT_QA with HASS mode and FILTER_INCLUDE
- Add dd.display.icon labels: si:si:nginx (nested), si:redis (colon), si-traefikproxy (dash)
- Drydock depends_on mosquitto healthcheck before starting
Detail views (full-page, side panel, tab content) were missing bouncer
awareness — clicking Update on a security-blocked container silently
failed with a 500 error. Now blocked containers show a red "Blocked"
button with lock icon that opens the force-update confirmation dialog.
Also adds an error banner to full-page detail for action failures.
Allows update flow testing without requiring signed images.
Rejects pushes when the working tree has untracked files, uncommitted
changes, or stashed changes. Runs at priority 0 before all other checks.

Prevents qlty from hanging on interactive "Format these files?" prompts
when untracked files are present, and catches the common case where
local tests pass against uncommitted changes that CI will never see.
@s-b-e-n-s-o-n s-b-e-n-s-o-n merged commit f395f44 into main Mar 10, 2026
16 checks passed
@s-b-e-n-s-o-n s-b-e-n-s-o-n deleted the release/v1.4.0-rc.11 branch March 12, 2026 13:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants