Use renovate to update go2rtc (#169508)

This commit is contained in:
Robert Resch
2026-05-19 10:10:17 +02:00
committed by GitHub
parent d2bb31d115
commit 3f49877ff1
6 changed files with 46 additions and 159 deletions
-1
View File
@@ -14,7 +14,6 @@ Dockerfile.dev linguist-language=Dockerfile
# Generated files # Generated files
CODEOWNERS linguist-generated=true CODEOWNERS linguist-generated=true
Dockerfile linguist-generated=true
homeassistant/generated/*.py linguist-generated=true homeassistant/generated/*.py linguist-generated=true
machine/* linguist-generated=true machine/* linguist-generated=true
mypy.ini linguist-generated=true mypy.ini linguist-generated=true
+26
View File
@@ -6,6 +6,7 @@
"pep621", "pep621",
"pip_requirements", "pip_requirements",
"pre-commit", "pre-commit",
"dockerfile",
"custom.regex", "custom.regex",
"homeassistant-manifest" "homeassistant-manifest"
], ],
@@ -21,6 +22,10 @@
] ]
}, },
"dockerfile": {
"managerFilePatterns": ["/^Dockerfile$/"]
},
"homeassistant-manifest": { "homeassistant-manifest": {
"managerFilePatterns": [ "managerFilePatterns": [
"/^homeassistant/components/[^/]+/manifest\\.json$/" "/^homeassistant/components/[^/]+/manifest\\.json$/"
@@ -35,6 +40,14 @@
"matchStrings": ["required-version = \">=(?<currentValue>[\\d.]+)\""], "matchStrings": ["required-version = \">=(?<currentValue>[\\d.]+)\""],
"depNameTemplate": "ruff", "depNameTemplate": "ruff",
"datasourceTemplate": "pypi" "datasourceTemplate": "pypi"
},
{
"customType": "regex",
"description": "Update go2rtc RECOMMENDED_VERSION in const.py alongside the Dockerfile pin",
"managerFilePatterns": ["/^homeassistant/components/go2rtc/const\\.py$/"],
"matchStrings": ["RECOMMENDED_VERSION = \"(?<currentValue>[\\d.]+)\""],
"depNameTemplate": "ghcr.io/alexxit/go2rtc",
"datasourceTemplate": "docker"
} }
], ],
@@ -184,6 +197,13 @@
"enabled": true, "enabled": true,
"labels": ["dependency"] "labels": ["dependency"]
}, },
{
"description": "Docker allowlist (ghcr.io exposes no release timestamps so the global cooldown needs to be bypassed)",
"matchPackageNames": ["ghcr.io/alexxit/go2rtc"],
"enabled": true,
"minimumReleaseAge": null,
"labels": ["dependency"]
},
{ {
"description": "Group ruff pre-commit hook with its PyPI twin into one PR", "description": "Group ruff pre-commit hook with its PyPI twin into one PR",
"matchPackageNames": ["astral-sh/ruff-pre-commit", "ruff"], "matchPackageNames": ["astral-sh/ruff-pre-commit", "ruff"],
@@ -213,6 +233,12 @@
"matchPackageNames": ["pylint", "astroid"], "matchPackageNames": ["pylint", "astroid"],
"groupName": "pylint", "groupName": "pylint",
"groupSlug": "pylint" "groupSlug": "pylint"
},
{
"description": "Group go2rtc Dockerfile pin with const.py RECOMMENDED_VERSION into one PR",
"matchPackageNames": ["ghcr.io/alexxit/go2rtc"],
"groupName": "go2rtc",
"groupSlug": "go2rtc"
} }
] ]
} }
+2 -2
View File
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile@sha256:2780b5c3bab67f1f76c781860de469442999ed1a0d7992a5efdf2cffc0e3d769 # syntax=docker/dockerfile@sha256:2780b5c3bab67f1f76c781860de469442999ed1a0d7992a5efdf2cffc0e3d769
# Automatically generated by hassfest. # Partly generated by hassfest.
# #
# To update, run python3 -m script.hassfest -p docker # To update, run python3 -m script.hassfest -p docker
ARG BUILD_FROM ARG BUILD_FROM
@@ -26,7 +26,7 @@ WORKDIR /usr/src
COPY rootfs / COPY rootfs /
# Add go2rtc binary # Add go2rtc binary
COPY --from=ghcr.io/alexxit/go2rtc@sha256:675c318b23c06fd862a61d262240c9a63436b4050d177ffc68a32710d9e05bae /usr/local/bin/go2rtc /bin/go2rtc COPY --from=ghcr.io/alexxit/go2rtc:1.9.14@sha256:675c318b23c06fd862a61d262240c9a63436b4050d177ffc68a32710d9e05bae /usr/local/bin/go2rtc /bin/go2rtc
## Setup Home Assistant Core dependencies ## Setup Home Assistant Core dependencies
COPY --parents requirements.txt homeassistant/package_constraints.txt homeassistant/ COPY --parents requirements.txt homeassistant/package_constraints.txt homeassistant/
+1 -2
View File
@@ -6,6 +6,5 @@ CONF_DEBUG_UI = "debug_ui"
DEBUG_UI_URL_MESSAGE = "Url and debug_ui cannot be set at the same time." DEBUG_UI_URL_MESSAGE = "Url and debug_ui cannot be set at the same time."
HA_MANAGED_API_PORT = 11984 HA_MANAGED_API_PORT = 11984
HA_MANAGED_URL = f"http://localhost:{HA_MANAGED_API_PORT}/" HA_MANAGED_URL = f"http://localhost:{HA_MANAGED_API_PORT}/"
# When changing this version, also update the corresponding SHA hash (_GO2RTC_SHA) # Kept in sync with the go2rtc image pinned in the root Dockerfile by Renovate.
# in script/hassfest/docker.py.
RECOMMENDED_VERSION = "1.9.14" RECOMMENDED_VERSION = "1.9.14"
+17 -68
View File
@@ -2,6 +2,7 @@
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
import re
from homeassistant import core from homeassistant import core
from homeassistant.util import executor, thread from homeassistant.util import executor, thread
@@ -13,70 +14,20 @@ _DOCKERFILE_SYNTAX_SHA = (
"2780b5c3bab67f1f76c781860de469442999ed1a0d7992a5efdf2cffc0e3d769" # 1.23.0 "2780b5c3bab67f1f76c781860de469442999ed1a0d7992a5efdf2cffc0e3d769" # 1.23.0
) )
_GO2RTC_SHA = ( _DOCKERFILE_SYNTAX_PATTERN = re.compile(r"# syntax=docker/dockerfile@sha256:[0-9a-f]+")
"675c318b23c06fd862a61d262240c9a63436b4050d177ffc68a32710d9e05bae" # 1.9.14 _DOCKERFILE_S6_GRACETIME_PATTERN = re.compile(r"S6_SERVICES_GRACETIME=\d+")
)
DOCKERFILE_TEMPLATE = r"""# syntax=docker/dockerfile@sha256:{dockerfile_syntax}
# Automatically generated by hassfest.
#
# To update, run python3 -m script.hassfest -p docker
ARG BUILD_FROM
FROM ${{BUILD_FROM}}
LABEL \ def _update_dockerfile(content: str, timeout: int) -> str:
io.hass.type="core" \ """Update the hassfest-managed parts of the Dockerfile."""
org.opencontainers.image.authors="The Home Assistant Authors" \ content = _DOCKERFILE_SYNTAX_PATTERN.sub(
org.opencontainers.image.description="Open-source home automation platform running on Python 3" \ f"# syntax=docker/dockerfile@sha256:{_DOCKERFILE_SYNTAX_SHA}",
org.opencontainers.image.documentation="https://www.home-assistant.io/docs/" \ content,
org.opencontainers.image.licenses="Apache-2.0" \ count=1,
org.opencontainers.image.title="Home Assistant" \ )
org.opencontainers.image.url="https://www.home-assistant.io/" return _DOCKERFILE_S6_GRACETIME_PATTERN.sub(
f"S6_SERVICES_GRACETIME={timeout}", content, count=1
# Synchronize with homeassistant/core.py:async_stop )
ENV \
S6_SERVICES_GRACETIME={timeout} \
UV_SYSTEM_PYTHON=true \
UV_NO_CACHE=true
WORKDIR /usr/src
# Home Assistant S6-Overlay
COPY rootfs /
# Add go2rtc binary
COPY --from=ghcr.io/alexxit/go2rtc@sha256:{go2rtc} /usr/local/bin/go2rtc /bin/go2rtc
## Setup Home Assistant Core dependencies
COPY --parents requirements.txt homeassistant/package_constraints.txt homeassistant/
RUN \
# Verify go2rtc can be executed
go2rtc --version \
# Install uv at the version pinned in the requirements file
&& pip3 install --no-cache-dir "uv==$(awk -F'==' '/^uv==/{{print $2}}' homeassistant/requirements.txt)" \
&& uv pip install \
--no-build \
-r homeassistant/requirements.txt
COPY requirements_all.txt home_assistant_frontend-* home_assistant_intents-* homeassistant/
RUN \
if ls homeassistant/home_assistant_*.whl 1> /dev/null 2>&1; then \
uv pip install homeassistant/home_assistant_*.whl; \
fi \
&& uv pip install \
--no-build \
-r homeassistant/requirements_all.txt
## Setup Home Assistant Core
COPY --parents LICENSE* README* homeassistant/ pyproject.toml homeassistant/
RUN \
uv pip install \
-e ./homeassistant \
&& python3 -m compileall \
homeassistant/homeassistant
WORKDIR /config
"""
@dataclass(frozen=True) @dataclass(frozen=True)
@@ -199,14 +150,12 @@ def _generate_files(config: Config) -> list[File]:
+ 10 + 10
) * 1000 ) * 1000
dockerfile_path = config.root / "Dockerfile"
files = [ files = [
File( File(
DOCKERFILE_TEMPLATE.format( _update_dockerfile(dockerfile_path.read_text(encoding="UTF-8"), timeout),
dockerfile_syntax=_DOCKERFILE_SYNTAX_SHA, dockerfile_path,
timeout=timeout,
go2rtc=_GO2RTC_SHA,
),
config.root / "Dockerfile",
), ),
File( File(
_HASSFEST_TEMPLATE.format( _HASSFEST_TEMPLATE.format(
@@ -1,86 +0,0 @@
"""Test that the go2rtc Docker image version matches or exceeds the recommended version.
This test ensures that the go2rtc Docker image SHA pinned in
script/hassfest/docker.py corresponds to a version that is equal to or
greater than the RECOMMENDED_VERSION defined in
homeassistant/components/go2rtc/const.py.
The test pulls the Docker image using the pinned SHA and runs the
`go2rtc --version` command inside the container to extract the version,
then compares it against RECOMMENDED_VERSION.
"""
import asyncio
import os
import re
from awesomeversion import AwesomeVersion
import pytest
from homeassistant.components.go2rtc.const import RECOMMENDED_VERSION
from script.hassfest.docker import _GO2RTC_SHA as DOCKER_SHA
async def _get_version_from_docker_sha() -> str:
"""Extract go2rtc version from Docker image using the pinned SHA."""
image = f"ghcr.io/alexxit/go2rtc@sha256:{DOCKER_SHA}"
pull_process = await asyncio.create_subprocess_exec(
"docker",
"pull",
image,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
_, pull_stderr = await pull_process.communicate()
if pull_process.returncode != 0:
raise RuntimeError(f"Failed to pull go2rtc image: {pull_stderr.decode()}")
# Run the container to get version
run_process = await asyncio.create_subprocess_exec(
"docker",
"run",
"--rm",
image,
"go2rtc",
"--version",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
run_stdout, run_stderr = await run_process.communicate()
if run_process.returncode != 0:
raise RuntimeError(f"Failed to run go2rtc --version: {run_stderr.decode()}")
# Parse version from output
# Expected output format: "go2rtc version 1.9.12 (commit) linux/amd64" or similar
output = run_stdout.decode().strip()
version_match = re.search(r"version\s+([\d.]+)", output)
if not version_match:
raise RuntimeError(f"Could not parse version from go2rtc output: {output}")
return version_match.group(1)
@pytest.mark.skipif(
not os.environ.get("CI"),
reason="This test requires Docker and only runs in CI",
)
async def test_docker_version_matches_recommended() -> None:
"""Test go2rtc Docker SHA version meets RECOMMENDED_VERSION."""
# Extract version from the actual Docker container
docker_version_str = await _get_version_from_docker_sha()
# Parse versions
docker_version = AwesomeVersion(docker_version_str)
recommended_version = AwesomeVersion(RECOMMENDED_VERSION)
# Assert that Docker version is equal to or greater than recommended version
assert docker_version >= recommended_version, (
f"go2rtc Docker version ({docker_version}) is less than "
f"RECOMMENDED_VERSION ({recommended_version}). "
"Please update _GO2RTC_SHA in script/hassfest/docker.py to a newer version"
)