Known Issues
Rough edges you will run into sooner or later. This page is intentionally short; ongoing work goes into the project’s issue tracker, not here.
TTL cleanup is not automatic
Cleanup-Environments must be triggered manually or wired to a Jenkins cron trigger. The library does not schedule it. If no one runs it, envs with expired TTL stay on disk and continue consuming runner capacity.
Workaround: add a time-based trigger (triggers { cron('H 4 * * *') }) to the Cleanup-Environments job, or schedule it via the multibranch / organisation folder pipeline that owns it.
Cycle detection warns but does not block
createEnvStep runs DFS cycle detection over the effective depends_on graph. On a cycle it prints a warning and continues; Compose itself refuses to start on circular depends_on.
Workaround: treat the warning as a build error. The small window where a cycle is desirable (because service_healthy breaks it) is rare — inspect the warning explicitly when it fires.
Agent capabilities not validated
deployEnvStep assumes every online non-master agent has:
-
Docker Engine reachable by the
jenkinsuser. -
Docker Compose V2 (
docker compose, notdocker-compose). -
/opt/qa-envs/(or the value ofQA_AGENT_ENVS_DIR) writable byjenkins. -
yq,ss,rsyncinstalled.
There is no pre-flight check. A missing tool produces a failure deep inside docker compose up -d or the port-scan step.
Workaround: include a one-liner check in agent provisioning (yq --version && docker compose version).
Active Choices fallback hides approval errors
Scripts that are not yet approved in Manage Jenkins → In-process Script Approval render the fallback HTML silently. There is no banner, no console message, no System Log line unless you filter on ScriptApproval.
Workaround: always check approval first when a panel suddenly shows the fallback.
Re-running a failed create leaves artifacts
If createEnvStep fails after meta.json is written (rare, but possible during a docker compose build crash), the env directory stays behind in state configured with status: failed. The name is then reserved and utils.validateEnvName(…, checkExists=true) rejects it.
Workaround: Manage-Environment → delete on the failed env, or remove ${MASTER_ENVS_DIR}/<env> manually.
DATA_FOLDER must be a relative path
Compose bind mounts expand ${DATA_FOLDER:-.} relative to the docker-compose.yml. Setting DATA_FOLDER=/opt/qa-envs/foo via the Active Choices form works but silently duplicates the absolute path for every bind mount and breaks on the runner if the master ever renders a path that does not exist there.
Workaround: leave DATA_FOLDER unset unless you have a specific reason. The default (the env’s own directory) is almost always right.
Concurrent manage-owners races are possible
atomicWriteMeta protects against torn reads, not against two admins submitting manage-owners at the same second. The last submission wins.
Workaround: manage-owners is low-frequency by nature; if it matters, coordinate on Slack or gate the action behind a Jenkins lock.