diff --git a/scripts/ci/smoke.sh b/scripts/ci/smoke.sh index 4a45b005..80dc0e84 100755 --- a/scripts/ci/smoke.sh +++ b/scripts/ci/smoke.sh @@ -24,7 +24,18 @@ done if [ -n "${SKILL_ID:-}" ]; then command -v ovos-skill-launcher > /dev/null python -c "import ovos_workshop, ovos_bus_client" - echo "skill ${SKILL_ID}: launcher and workshop present" + # The launcher finds the skill by the id its package registers. An id no package + # registers makes the container exit at start ("unknown skill_id") and restart + # forever: six skill images did, on both channels, after their skills were renamed. + python - "$SKILL_ID" << 'REGISTERED' +import sys +from importlib.metadata import entry_points +wanted = sys.argv[1] +ids = sorted({ep.name for group in ("opm.skill", "ovos.plugin.skill") for ep in entry_points(group=group)}) +if wanted not in ids: + sys.exit(f"skill {wanted}: no installed package registers it; registered: {', '.join(ids) or 'none'}") +REGISTERED + echo "skill ${SKILL_ID}: launcher and workshop present, and its package registers that id" fi if [ -n "${SMOKE_BIN:-}" ]; then command -v "$SMOKE_BIN" > /dev/null diff --git a/skills/skill-alerts/Dockerfile b/skills/skill-alerts/Dockerfile index 37157b55..39a05287 100644 --- a/skills/skill-alerts/Dockerfile +++ b/skills/skill-alerts/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="ovos-skill-alerts.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-alerts.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-camera/Dockerfile b/skills/skill-camera/Dockerfile index 793664e2..799a4068 100644 --- a/skills/skill-camera/Dockerfile +++ b/skills/skill-camera/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="ovos-skill-camera.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-camera.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-date-time/Dockerfile b/skills/skill-date-time/Dockerfile index ec825ce8..b6a15534 100644 --- a/skills/skill-date-time/Dockerfile +++ b/skills/skill-date-time/Dockerfile @@ -42,4 +42,5 @@ ENV SKILL_ID="ovos-skill-date-time.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-date-time.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-duckduckgo/Dockerfile b/skills/skill-duckduckgo/Dockerfile index 4a415561..494614c9 100644 --- a/skills/skill-duckduckgo/Dockerfile +++ b/skills/skill-duckduckgo/Dockerfile @@ -41,4 +41,5 @@ ENV SKILL_ID="ovos-skill-ddg.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-ddg.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-easter-eggs/Dockerfile b/skills/skill-easter-eggs/Dockerfile index ec8b39f8..9ab2f463 100644 --- a/skills/skill-easter-eggs/Dockerfile +++ b/skills/skill-easter-eggs/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="skill-easter-eggs.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "skill-easter-eggs.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-fallback-unknown/Dockerfile b/skills/skill-fallback-unknown/Dockerfile index d0200f6e..5414507e 100644 --- a/skills/skill-fallback-unknown/Dockerfile +++ b/skills/skill-fallback-unknown/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="ovos-skill-fallback-unknown.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-fallback-unknown.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-ggwave/Dockerfile b/skills/skill-ggwave/Dockerfile index 552d9489..73996325 100644 --- a/skills/skill-ggwave/Dockerfile +++ b/skills/skill-ggwave/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="ovos-skill-ggwave.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-ggwave.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-hello-world/Dockerfile b/skills/skill-hello-world/Dockerfile index 3d9bd7c7..88703216 100644 --- a/skills/skill-hello-world/Dockerfile +++ b/skills/skill-hello-world/Dockerfile @@ -33,11 +33,12 @@ ADD --chmod=0644 https://raw.githubusercontent.com/OpenVoiceOS/ovos-releases/${O RUN --mount=type=cache,target=/home/ovos/.cache/uv,uid=1000,gid=1000,sharing=locked \ uv pip install ovos-skill-hello-world -c /tmp/constraints.txt -ENV SKILL_ID="skill-ovos-hello-world.openvoiceos" +ENV SKILL_ID="ovos-skill-hello-world.openvoiceos" # A loaded skill answers mycroft..is_ready (ovos-workshop ProcessStatus); the start period # covers waiting for ovos-core to become ready before the skill loads. HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "skill-ovos-hello-world.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-homeassistant/Dockerfile b/skills/skill-homeassistant/Dockerfile index 7f41b931..40711b3d 100644 --- a/skills/skill-homeassistant/Dockerfile +++ b/skills/skill-homeassistant/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="skill-homeassistant.oscillatelabsllc" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "skill-homeassistant.oscillatelabsllc"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-homescreen/Dockerfile b/skills/skill-homescreen/Dockerfile index a19935ac..c98ab359 100644 --- a/skills/skill-homescreen/Dockerfile +++ b/skills/skill-homescreen/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="skill-ovos-homescreen.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "skill-ovos-homescreen.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-jokes/Dockerfile b/skills/skill-jokes/Dockerfile index 9ef29800..a385767c 100644 --- a/skills/skill-jokes/Dockerfile +++ b/skills/skill-jokes/Dockerfile @@ -33,11 +33,12 @@ ADD --chmod=0644 https://raw.githubusercontent.com/OpenVoiceOS/ovos-releases/${O RUN --mount=type=cache,target=/home/ovos/.cache/uv,uid=1000,gid=1000,sharing=locked \ uv pip install ovos-skill-icanhazdadjokes -c /tmp/constraints.txt -ENV SKILL_ID="skill-ovos-icanhazdadjokes.openvoiceos" +ENV SKILL_ID="ovos-skill-icanhazdadjokes.openvoiceos" # A loaded skill answers mycroft..is_ready (ovos-workshop ProcessStatus); the start period # covers waiting for ovos-core to become ready before the skill loads. HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "skill-ovos-icanhazdadjokes.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-parrot/Dockerfile b/skills/skill-parrot/Dockerfile index f2de74f0..cf4ca58d 100644 --- a/skills/skill-parrot/Dockerfile +++ b/skills/skill-parrot/Dockerfile @@ -33,11 +33,12 @@ ADD --chmod=0644 https://raw.githubusercontent.com/OpenVoiceOS/ovos-releases/${O RUN --mount=type=cache,target=/home/ovos/.cache/uv,uid=1000,gid=1000,sharing=locked \ uv pip install ovos-skill-parrot -c /tmp/constraints.txt -ENV SKILL_ID="skill-ovos-parrot.openvoiceos" +ENV SKILL_ID="ovos-skill-parrot.openvoiceos" # A loaded skill answers mycroft..is_ready (ovos-workshop ProcessStatus); the start period # covers waiting for ovos-core to become ready before the skill loads. HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "skill-ovos-parrot.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-personal/Dockerfile b/skills/skill-personal/Dockerfile index 6ae7d232..10f7f142 100644 --- a/skills/skill-personal/Dockerfile +++ b/skills/skill-personal/Dockerfile @@ -33,11 +33,12 @@ ADD --chmod=0644 https://raw.githubusercontent.com/OpenVoiceOS/ovos-releases/${O RUN --mount=type=cache,target=/home/ovos/.cache/uv,uid=1000,gid=1000,sharing=locked \ uv pip install ovos-skill-personal -c /tmp/constraints.txt -ENV SKILL_ID="ovos-skill-personal.OpenVoiceOS" +ENV SKILL_ID="ovos-skill-personal.openvoiceos" # A loaded skill answers mycroft..is_ready (ovos-workshop ProcessStatus); the start period # covers waiting for ovos-core to become ready before the skill loads. HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-personal.OpenVoiceOS"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-randomness/Dockerfile b/skills/skill-randomness/Dockerfile index 7e465b92..fd1c9385 100644 --- a/skills/skill-randomness/Dockerfile +++ b/skills/skill-randomness/Dockerfile @@ -33,11 +33,12 @@ ADD --chmod=0644 https://raw.githubusercontent.com/OpenVoiceOS/ovos-releases/${O RUN --mount=type=cache,target=/home/ovos/.cache/uv,uid=1000,gid=1000,sharing=locked \ uv pip install ovos-skill-randomness -c /tmp/constraints.txt -ENV SKILL_ID="ovos-skill-randomness.openvoiceos" +ENV SKILL_ID="skill-ovos-randomness.openvoiceos" # A loaded skill answers mycroft..is_ready (ovos-workshop ProcessStatus); the start period # covers waiting for ovos-core to become ready before the skill loads. HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-randomness.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-tunein/Dockerfile b/skills/skill-tunein/Dockerfile index a9a7d7ca..ec6a5a1e 100644 --- a/skills/skill-tunein/Dockerfile +++ b/skills/skill-tunein/Dockerfile @@ -41,4 +41,5 @@ ENV SKILL_ID="skill-ovos-tunein.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "skill-ovos-tunein.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-volume/Dockerfile b/skills/skill-volume/Dockerfile index 9af7f2a8..17e2190d 100644 --- a/skills/skill-volume/Dockerfile +++ b/skills/skill-volume/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="ovos-skill-volume.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-volume.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-weather/Dockerfile b/skills/skill-weather/Dockerfile index 2a0f7a79..40697f94 100644 --- a/skills/skill-weather/Dockerfile +++ b/skills/skill-weather/Dockerfile @@ -55,4 +55,5 @@ ENV SKILL_ID="ovos-skill-weather.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-weather.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-wikihow/Dockerfile b/skills/skill-wikihow/Dockerfile index da755a6a..ae863db7 100644 --- a/skills/skill-wikihow/Dockerfile +++ b/skills/skill-wikihow/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="ovos-skill-wikihow.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-wikihow.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-wikipedia/Dockerfile b/skills/skill-wikipedia/Dockerfile index 5121608c..1f4d027e 100644 --- a/skills/skill-wikipedia/Dockerfile +++ b/skills/skill-wikipedia/Dockerfile @@ -34,11 +34,12 @@ ADD --chmod=0644 https://raw.githubusercontent.com/OpenVoiceOS/ovos-releases/${O RUN --mount=type=cache,target=/home/ovos/.cache/uv,uid=1000,gid=1000,sharing=locked \ uv pip install ovos-skill-wikipedia -c /tmp/constraints.txt -ENV SKILL_ID="skill-ovos-wikipedia.openvoiceos" +ENV SKILL_ID="ovos-skill-wikipedia.openvoiceos" # A loaded skill answers mycroft..is_ready (ovos-workshop ProcessStatus); the start period # covers waiting for ovos-core to become ready before the skill loads. HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "skill-ovos-wikipedia.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-wolfie/Dockerfile b/skills/skill-wolfie/Dockerfile index da12eb9f..c85bafdd 100644 --- a/skills/skill-wolfie/Dockerfile +++ b/skills/skill-wolfie/Dockerfile @@ -41,4 +41,5 @@ ENV SKILL_ID="ovos-skill-wolfie.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-wolfie.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID" diff --git a/skills/skill-wordnet/Dockerfile b/skills/skill-wordnet/Dockerfile index 6b2239ab..a353ac6b 100644 --- a/skills/skill-wordnet/Dockerfile +++ b/skills/skill-wordnet/Dockerfile @@ -40,4 +40,5 @@ ENV SKILL_ID="ovos-skill-wordnet.openvoiceos" HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=180s \ CMD ovos-hc -s "$SKILL_ID" || exit 1 -CMD ["ovos-skill-launcher", "ovos-skill-wordnet.openvoiceos"] +# Shell form, so the launcher gets the id SKILL_ID holds; exec keeps it PID 1. +CMD exec ovos-skill-launcher "$SKILL_ID"