# Local Test Harness All verification runs locally inside Docker containers so your workstation matches the eventual Gitea Actions runner exactly. ## CI-equivalent container - `docker/ci-runner/Dockerfile` builds the image `knel/cloudron-ci`, derived from the same base the Gitea runner will use. - `scripts/ci_local.sh` orchestrates tasks inside that container. Run `BUILD=1 ./scripts/ci_local.sh lint` the first time to build the image. - Tasks: - `lint` → `make lint` + `make status` + `git diff docs/APP_STATUS.md` - `packager-smoke` → builds `docker/packager` and runs `cloudron --help` - `all` (default) → runs both. The script mounts `/var/run/docker.sock` so Docker CLI calls inside the container reuse the host daemon. ## Git hooks Use `scripts/hooks/install_hooks.sh` to install local hooks: ```bash ./scripts/hooks/install_hooks.sh ``` - `pre-commit` runs `./scripts/ci_local.sh lint`. - `post-commit` refreshes `docs/APP_STATUS.md` (non-fatal). - `pre-push` runs the packager smoke test. Set `SKIP_CI_HOOKS=1` when you need to bypass the hooks temporarily. ## Alignment with Gitea Actions The `.gitea/workflows/ci.yml` workflow wraps the same `scripts/ci_local.sh` entrypoint and is currently manual-only (`workflow_dispatch`). Enable push/PR triggers once a runner is provisioned.