Troubleshoot ibek#

An entity or argument is rejected#

Check the type: module.Entity against the support definitions used for that run. runtime generate2 discovers definitions in the image and config folder unless --definitions was supplied, which replaces discovery. IOC schemas are specific to their support definitions: a schema from another image may accept entities the running image cannot supply. See IOC YAML and Support YAML.

For rendering failures, check parameter spelling, definition order, and the available Jinja rendering and context. Missing environment variables fail when accessed directly through env; use env.get("NAME", "default") when a default is intentional.

No schema download, or an old schema appears#

A cached base schema is revalidated on every run and is also used when the fetch fails, including across fresh virtual environments. A Using cached schema ... could not revalidate it message means the download failed but the cache hid the failure. Run with a new IBEK_SCHEMA_CACHE directory to reproduce a first download; the complete recipe and cache key are in Paths and environment.

If the command reports that schema generation was skipped, check the image in values.yaml or compose.yml / compose.yaml, its explicit tag, and the repository’s ibek.ioc.schema.json release asset. A skip leaves an existing schema untouched and exits 0.

If the command exits 1 with Cannot refresh ... ioc.schema.json, the fetch failed and ibek has no cached copy for the image tag. The message includes the cause: check network access and TLS certificates, or retry after a server error or a 403 / 429 rate limit response. ibek ignores an invalid cache file and downloads the schema again.

Runtime protocols or templates are missing#

Put instance .proto, .protocol, .db, and .template files directly in config/. Run runtime place-files after runtime generate2, because generation clears its output directory. Confirm the image startup script’s search paths include /epics/runtime/protocol and /epics/runtime/db as appropriate. Generated ioc.subst still needs expansion by EPICS msi before the IOC loads the database.

A vendored pattern fails its integrity check#

Inspect the reported file and runtime-lock.yaml. ibek pattern restore replaces local edits from the recorded source; update records a newly selected version. Use deliberate DIRTY entries only when the divergence should be visible in version control. See Vendor runtime support.

Generation works but the IOC fails to start#

Inspect st.cmd and ioc.subst under /epics/runtime, then the IOC’s output. Successful rendering validates ibek inputs; it does not prove that an EPICS command, database template, shared library, or hardware endpoint is available. For image building, deployment, and operational debugging, use the epics-containers documentation.

Changing an Ansible recipe’s version did not change the sources#

The clone step reuses an existing /epics/support/<module> checkout without fetching or switching revisions. Changing version or passing ansible.sh -v only selects a revision for a new clone; the declared force_clone variable does not implement a refresh. Check the existing checkout’s Git revision and local changes. Use a fresh developer build to test the recipe from scratch, or deliberately switch the source checkout after preserving local work. See rebuilding support.

A module builds but its entities are not recognised#

Compilation and support-definition registration are separate steps. Confirm the recipe directory contains a top-level *.ibek.support.yaml file and that its link under /epics/ibek-defs resolves to the intended file. A build limited to --tags do_build skips runtime registration; rerun the full module recipe, then ansible.sh ioc to regenerate the combined schema.

At runtime, check that the selected image contains that definition. Explicit runtime generate2 --definitions arguments replace automatic discovery and must include all required files. If only editor completion is wrong, refresh the schema used by the editor; the local build schema and an image’s published release schema are separate artifacts. See building support and schema caching.

A dependency’s RELEASE path is wrong#

Inspect /epics/support/configure/RELEASE and the affected module’s configure/RELEASE.local link. The link should target the shared RELEASE; the dependency’s macro should point to its actual source directory. Check the dependency recipe’s macro and local_path, and build it before its consumer. Recipes do not resolve dependency order automatically.

Also inspect applicable architecture-specific configure/RELEASE.* files: upstream paths can override the container’s paths. The current role includes RELEASE.local last in the supported RELEASE files. After correcting the recipe or checkout, rerun the dependency and consumer builds rather than maintaining a separate hand-edited RELEASE configuration. See the recipe reference.