Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e3c09ac
docs(design): ddev-as-developer security inventory (ddev-as-user-issues)
steffenmaechtel Aug 22, 2026
645dee5
docs(design): plan real-ddev e2e suite with cached golden container
steffenmaechtel Aug 22, 2026
e770166
feat(e2e): camino fixture + bare-origin generator for e2e-ddev
steffenmaechtel Aug 22, 2026
47f2baa
feat(e2e): E2E_SKIP_BUILD knob in lib.sh
steffenmaechtel Aug 22, 2026
5d1e12c
feat(e2e): run-ddev.sh - real-ddev e2e runner with golden-image cache
steffenmaechtel Aug 22, 2026
2109c25
build(e2e): make e2e-ddev targets + CI chmod wiring
steffenmaechtel Aug 22, 2026
b16add5
fix(e2e): expand dd_build_oc args at construction time
steffenmaechtel Aug 22, 2026
253c6f5
fix(e2e): count hard build-path failures so --debug keeps the container
steffenmaechtel Aug 22, 2026
37af0d0
fix(e2e): do not clobber an inherited E2E_DEBUG in run-ddev.sh
steffenmaechtel Aug 22, 2026
f71a31c
fix(e2e): apache-fpm everywhere - nested userns cannot map uid 65534
steffenmaechtel Aug 22, 2026
9a2c3a8
fix(e2e): golden labels via docker commit --change LABEL
steffenmaechtel Aug 22, 2026
3409ddb
fix(e2e): DD0 daemon check retries; ddev version grep not head -1
steffenmaechtel Aug 22, 2026
50840be
fix(e2e): inner docker store on a named volume - commit drops whiteouts
steffenmaechtel Aug 22, 2026
f5155c6
fix(e2e): golden-image v2 - no inner store, images via save/load tar
steffenmaechtel Aug 22, 2026
47205a5
fix(e2e): docker save before stopping the inner daemon
steffenmaechtel Aug 22, 2026
bb8b71e
fix(e2e): OC_CWD through check() + DD5 grep + EPERM sweep scope
steffenmaechtel Aug 22, 2026
1ba5f16
fix(e2e): deterministic DD2 handover state + restart grep + sweep scope
steffenmaechtel Aug 22, 2026
eb448e3
fix(e2e): DD14 as tripwire pair - create-project root cause pinned
steffenmaechtel Aug 22, 2026
0136989
fix(e2e): remove a leftover container before docker run
steffenmaechtel Aug 22, 2026
a237bd0
fix(e2e): clean partial files before the DD14 retry
steffenmaechtel Aug 22, 2026
cbf8a1f
fix(e2e): DD3/DD6 pinned to real ddev v1.25.3 bootstrap behavior
steffenmaechtel Aug 22, 2026
53ed16b
fix(e2e): import-db takes --file, not --src
steffenmaechtel Aug 22, 2026
d5b8adb
feat(e2e): E2E_KEEP=1 fast-iteration knob + fixtures at /e2e-fixtures
steffenmaechtel Aug 22, 2026
30a9770
fix(e2e): DD11/DD12 wording + tracked config.yaml restore after tripwire
steffenmaechtel Aug 22, 2026
094633e
docs(design): reference checkouts for Finding-2 follow-up (ddev v1.25…
steffenmaechtel Aug 22, 2026
960e918
ci(e2e): manual dispatch workflow for the real-ddev suite
steffenmaechtel Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions .github/workflows/e2e-ddev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: e2e-ddev

# Real-ddev e2e suite (tests/e2e/run-ddev.sh, docs/design/ddev-e2e-test.md).
# MANUAL-ONLY for now: the maintainer validates runtime + duration on a real
# runner first; a weekly schedule is the planned phase-3 follow-up (the
# golden-image cache is a local-workspace concept — CI rebuilds warm every
# run, see design doc §6 R6).
#
# Not part of the PR merge gate (e2e.yml keeps that job): this suite
# downloads GBs of images and runs a real ddev project lifecycle.
on:
workflow_dispatch:
inputs:
site_tier:
description: 'Also run the real-site tier (camino fixture, DD10-DD12)'
required: false
default: false
type: boolean
ddev_version:
description: 'Pin a ddev version (e.g. v1.25.3); empty = latest release'
required: false
default: ''
type: string

permissions:
contents: read

concurrency:
group: e2e-ddev-${{ github.ref }}
cancel-in-progress: true

jobs:
e2e-ddev:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v7
- name: Resolve opencode version
id: version
run: |
echo "OC_VERSION=$(curl -fsSL --retry 5 --retry-delay 10 --retry-all-errors --max-time 30 https://api.github.com/repos/anomalyco/opencode/releases/latest | sed -n 's/.*"tag_name": *"v\([^"]*\)".*/\1/p')" >> "$GITHUB_OUTPUT"
- name: Cache opencode binaries + installer (per version, shared with the other e2e jobs)
uses: actions/cache@v6
with:
path: tests/e2e/cache
key: opencode-e2e-latest${{ steps.version.outputs.OC_VERSION }}
restore-keys: |
opencode-e2e-latest-
- name: Run real-ddev E2E test
env:
E2E_DDEV_SITE: ${{ inputs.site_tier == true && 'camino' || '' }}
DDEV_VERSION: ${{ inputs.ddev_version }}
run: |
chmod +x ./tests/e2e/run.sh ./tests/e2e/run-docker-rootless.sh ./tests/e2e/run-ddev.sh ./tests/e2e/lib.sh ./tests/check-host.sh ./tests/test-wrapper-validation.sh ./tests/test-jsonc-parser.sh ./tests/test-git-config.sh ./tests/test-container-backend.sh ./tests/test-bypass-guard.sh ./tests/test-ddev-as-opencode.sh ./tests/test-ddev-migrate.sh ./tests/test-ddev-hosts.sh ./tests/test-mkcert-reuse.sh ./tests/test-wsl-exposure.sh ./tests/test-ui.sh ./tests/test-docs.sh ./tests/test-kit-cli.sh ./tests/test-project-paths.sh ./tests/test-workflows.sh ./tests/test-install-args.sh ./tests/test-kit-files.sh ./tests/test-uninstall.sh ./tests/test-status.sh ./tests/test-update-flags.sh ./tests/test-fs-baseline.sh \
./files/config.sh ./files/update.sh ./files/install.sh ./files/uninstall.sh ./files/status.sh \
./files/opencode-permissions-kit-lib/wrapper ./files/opencode-permissions-kit-lib/kit ./files/opencode-permissions-kit-lib/log.sh ./files/opencode-permissions-kit-lib/ui.sh ./files/opencode-permissions-kit-lib/shell-warn.sh ./files/opencode-permissions-kit-lib/setup-container-backend.sh ./files/opencode-permissions-kit-lib/bin/socket-check.sh ./files/opencode-permissions-kit-lib/ddev-as-opencode.sh ./files/opencode-permissions-kit-lib/ddev-handover.sh ./files/opencode-permissions-kit-lib/ddev-migrate.sh ./files/opencode-permissions-kit-lib/ddev-hosts.sh ./files/opencode-permissions-kit-lib/fs-baseline.sh ./files/opencode-permissions-kit-lib/bin/ddev-as-opencode
./tests/e2e/run-ddev.sh
- name: Summary
if: always()
env:
E2E_DDEV_SITE: ${{ inputs.site_tier == true && 'camino' || '' }}
DDEV_VERSION: ${{ inputs.ddev_version }}
run: |
echo "### ddev-e2e (run-ddev.sh)" >> "$GITHUB_STEP_SUMMARY"
echo "- site tier: ${E2E_DDEV_SITE:-none}" >> "$GITHUB_STEP_SUMMARY"
echo "- ddev: ${DDEV_VERSION:-latest}" >> "$GITHUB_STEP_SUMMARY"
4 changes: 2 additions & 2 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:
opencode-e2e-old${{ steps.old.outputs.OLD_VERSION }}-
- name: Run E2E test
run: |
chmod +x ./tests/e2e/run.sh ./tests/e2e/run-docker-rootless.sh ./tests/e2e/lib.sh ./tests/check-host.sh ./tests/test-wrapper-validation.sh ./tests/test-jsonc-parser.sh ./tests/test-git-config.sh ./tests/test-container-backend.sh ./tests/test-bypass-guard.sh ./tests/test-ddev-as-opencode.sh ./tests/test-ddev-migrate.sh ./tests/test-ddev-hosts.sh ./tests/test-mkcert-reuse.sh ./tests/test-wsl-exposure.sh ./tests/test-ui.sh ./tests/test-docs.sh ./tests/test-kit-cli.sh ./tests/test-project-paths.sh ./tests/test-workflows.sh ./tests/test-install-args.sh ./tests/test-kit-files.sh ./tests/test-uninstall.sh ./tests/test-status.sh ./tests/test-update-flags.sh ./tests/test-fs-baseline.sh \
chmod +x ./tests/e2e/run.sh ./tests/e2e/run-docker-rootless.sh ./tests/e2e/run-ddev.sh ./tests/e2e/lib.sh ./tests/check-host.sh ./tests/test-wrapper-validation.sh ./tests/test-jsonc-parser.sh ./tests/test-git-config.sh ./tests/test-container-backend.sh ./tests/test-bypass-guard.sh ./tests/test-ddev-as-opencode.sh ./tests/test-ddev-migrate.sh ./tests/test-ddev-hosts.sh ./tests/test-mkcert-reuse.sh ./tests/test-wsl-exposure.sh ./tests/test-ui.sh ./tests/test-docs.sh ./tests/test-kit-cli.sh ./tests/test-project-paths.sh ./tests/test-workflows.sh ./tests/test-install-args.sh ./tests/test-kit-files.sh ./tests/test-uninstall.sh ./tests/test-status.sh ./tests/test-update-flags.sh ./tests/test-fs-baseline.sh \
./files/config.sh ./files/update.sh ./files/install.sh ./files/uninstall.sh ./files/status.sh \
./files/opencode-permissions-kit-lib/wrapper ./files/opencode-permissions-kit-lib/kit ./files/opencode-permissions-kit-lib/log.sh ./files/opencode-permissions-kit-lib/ui.sh ./files/opencode-permissions-kit-lib/shell-warn.sh ./files/opencode-permissions-kit-lib/setup-container-backend.sh ./files/opencode-permissions-kit-lib/bin/socket-check.sh ./files/opencode-permissions-kit-lib/ddev-as-opencode.sh ./files/opencode-permissions-kit-lib/ddev-handover.sh ./files/opencode-permissions-kit-lib/ddev-migrate.sh ./files/opencode-permissions-kit-lib/ddev-hosts.sh ./files/opencode-permissions-kit-lib/fs-baseline.sh ./files/opencode-permissions-kit-lib/bin/ddev-as-opencode
./tests/e2e/run.sh
Expand Down Expand Up @@ -83,7 +83,7 @@ jobs:
opencode-e2e-old${{ steps.old.outputs.OLD_VERSION }}-
- name: Run docker-rootless E2E test
run: |
chmod +x ./tests/e2e/run.sh ./tests/e2e/run-docker-rootless.sh ./tests/e2e/lib.sh ./tests/check-host.sh ./tests/test-update-flags.sh \
chmod +x ./tests/e2e/run.sh ./tests/e2e/run-docker-rootless.sh ./tests/e2e/run-ddev.sh ./tests/e2e/lib.sh ./tests/check-host.sh ./tests/test-update-flags.sh \
./tests/test-wrapper-validation.sh ./tests/test-jsonc-parser.sh ./tests/test-git-config.sh ./tests/test-container-backend.sh ./tests/test-bypass-guard.sh ./tests/test-ddev-as-opencode.sh ./tests/test-ddev-migrate.sh ./tests/test-ddev-hosts.sh ./tests/test-mkcert-reuse.sh ./tests/test-wsl-exposure.sh ./tests/test-ui.sh ./tests/test-docs.sh ./tests/test-kit-cli.sh ./tests/test-project-paths.sh ./tests/test-workflows.sh ./tests/test-install-args.sh ./tests/test-kit-files.sh ./tests/test-uninstall.sh ./tests/test-status.sh ./tests/test-fs-baseline.sh \
./files/config.sh ./files/update.sh ./files/install.sh ./files/uninstall.sh ./files/status.sh \
./files/opencode-permissions-kit-lib/wrapper ./files/opencode-permissions-kit-lib/kit ./files/opencode-permissions-kit-lib/log.sh ./files/opencode-permissions-kit-lib/ui.sh ./files/opencode-permissions-kit-lib/shell-warn.sh ./files/opencode-permissions-kit-lib/setup-container-backend.sh ./files/opencode-permissions-kit-lib/bin/socket-check.sh ./files/opencode-permissions-kit-lib/ddev-as-opencode.sh ./files/opencode-permissions-kit-lib/ddev-handover.sh ./files/opencode-permissions-kit-lib/ddev-migrate.sh ./files/opencode-permissions-kit-lib/ddev-hosts.sh ./files/opencode-permissions-kit-lib/fs-baseline.sh ./files/opencode-permissions-kit-lib/bin/ddev-as-opencode
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
- name: Check version consistency
run: make check-version
- name: Make scripts executable
run: chmod +x ./tests/test-ui.sh ./tests/test-wrapper-validation.sh ./tests/test-jsonc-parser.sh ./tests/test-git-config.sh ./tests/test-container-backend.sh ./tests/test-bypass-guard.sh ./tests/test-ddev-as-opencode.sh ./tests/test-ddev-migrate.sh ./tests/test-ddev-hosts.sh ./tests/test-mkcert-reuse.sh ./tests/test-wsl-exposure.sh ./tests/test-docs.sh ./tests/test-kit-cli.sh ./tests/test-project-paths.sh ./tests/test-workflows.sh ./tests/test-install-args.sh ./tests/test-kit-files.sh ./tests/test-uninstall.sh ./tests/test-status.sh ./tests/test-update-flags.sh ./tests/test-fs-baseline.sh ./tests/check-host.sh ./tests/e2e/run.sh ./tests/e2e/run-docker-rootless.sh ./tests/e2e/lib.sh ./files/config.sh ./files/update.sh ./files/install.sh ./files/uninstall.sh ./files/status.sh ./files/opencode-permissions-kit-lib/wrapper ./files/opencode-permissions-kit-lib/kit ./files/opencode-permissions-kit-lib/log.sh ./files/opencode-permissions-kit-lib/ui.sh ./files/opencode-permissions-kit-lib/shell-warn.sh ./files/opencode-permissions-kit-lib/setup-container-backend.sh ./files/opencode-permissions-kit-lib/bin/socket-check.sh ./files/opencode-permissions-kit-lib/ddev-as-opencode.sh ./files/opencode-permissions-kit-lib/ddev-handover.sh ./files/opencode-permissions-kit-lib/ddev-migrate.sh ./files/opencode-permissions-kit-lib/ddev-hosts.sh ./files/opencode-permissions-kit-lib/fs-baseline.sh ./files/opencode-permissions-kit-lib/bin/ddev-as-opencode
run: chmod +x ./tests/test-ui.sh ./tests/test-wrapper-validation.sh ./tests/test-jsonc-parser.sh ./tests/test-git-config.sh ./tests/test-container-backend.sh ./tests/test-bypass-guard.sh ./tests/test-ddev-as-opencode.sh ./tests/test-ddev-migrate.sh ./tests/test-ddev-hosts.sh ./tests/test-mkcert-reuse.sh ./tests/test-wsl-exposure.sh ./tests/test-docs.sh ./tests/test-kit-cli.sh ./tests/test-project-paths.sh ./tests/test-workflows.sh ./tests/test-install-args.sh ./tests/test-kit-files.sh ./tests/test-uninstall.sh ./tests/test-status.sh ./tests/test-update-flags.sh ./tests/test-fs-baseline.sh ./tests/check-host.sh ./tests/e2e/run.sh ./tests/e2e/run-docker-rootless.sh ./tests/e2e/run-ddev.sh ./tests/e2e/lib.sh ./files/config.sh ./files/update.sh ./files/install.sh ./files/uninstall.sh ./files/status.sh ./files/opencode-permissions-kit-lib/wrapper ./files/opencode-permissions-kit-lib/kit ./files/opencode-permissions-kit-lib/log.sh ./files/opencode-permissions-kit-lib/ui.sh ./files/opencode-permissions-kit-lib/shell-warn.sh ./files/opencode-permissions-kit-lib/setup-container-backend.sh ./files/opencode-permissions-kit-lib/bin/socket-check.sh ./files/opencode-permissions-kit-lib/ddev-as-opencode.sh ./files/opencode-permissions-kit-lib/ddev-handover.sh ./files/opencode-permissions-kit-lib/ddev-migrate.sh ./files/opencode-permissions-kit-lib/ddev-hosts.sh ./files/opencode-permissions-kit-lib/fs-baseline.sh ./files/opencode-permissions-kit-lib/bin/ddev-as-opencode
- name: Install shellcheck
run: sudo apt-get update -qq && sudo apt-get install -y shellcheck
- name: Check contributor host tools
Expand Down
11 changes: 10 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: help test lint check-host test-wrapper test-fs-baseline test-parser test-git-config test-container-backend test-bypass-guard test-ddev-as-opencode test-ddev-migrate test-ddev-hosts test-mkcert-reuse test-wsl-exposure test-ui test-kit-cli test-project-paths test-workflows test-docs test-install-args test-kit-files test-uninstall test-status test-update-flags e2e e2e-rootless e2e-all install-dev clean version check-version
.PHONY: help test lint check-host test-wrapper test-fs-baseline test-parser test-git-config test-container-backend test-bypass-guard test-ddev-as-opencode test-ddev-migrate test-ddev-hosts test-mkcert-reuse test-wsl-exposure test-ui test-kit-cli test-project-paths test-workflows test-docs test-install-args test-kit-files test-uninstall test-status test-update-flags e2e e2e-rootless e2e-ddev e2e-ddev-fresh e2e-all install-dev clean version check-version

# Scripts checked by `make lint` (everything shipped in files/).
SHELLCHECK_FILES = files/install.sh files/config.sh files/update.sh files/status.sh files/uninstall.sh files/umask.sh \
Expand Down Expand Up @@ -49,6 +49,9 @@ help:
@echo " make e2e Run end-to-end test (Docker required)"
@echo " make e2e-rootless Run docker-rootless daemon end-to-end test (Docker + systemd-in-container required; skips if unavailable)"
@echo " make e2e-rootless ARGS=--debug Same, keep the container on failure + dump daemon logs"
@echo " make e2e-ddev Run the real-ddev e2e suite (golden-image cache; first run builds it, see docs/design/ddev-e2e-test.md)"
@echo " make e2e-ddev ARGS='--fresh' Force a golden-image rebuild (new ddev version, recipe bump)"
@echo " make e2e-ddev-fresh Same as e2e-ddev ARGS=--fresh"
@echo " make e2e-all Run both e2e suites"
@echo " make install-dev Quick dev install (skip prompts)"
@echo " make clean Uninstall"
Expand Down Expand Up @@ -130,6 +133,12 @@ e2e:
e2e-rootless:
@sh ./tests/e2e/run-docker-rootless.sh $(if $(ARGS),$(ARGS))

e2e-ddev:
@sh ./tests/e2e/run-ddev.sh $(if $(ARGS),$(ARGS))

e2e-ddev-fresh:
@sh ./tests/e2e/run-ddev.sh --fresh

e2e-all: e2e e2e-rootless

install-dev:
Expand Down
Loading
Loading