|
- #!/usr/bin/env bash
- # SPDX-FileCopyrightText: 2026 Slavi Pantaleev
- #
- # SPDX-License-Identifier: AGPL-3.0-or-later
-
- set -euo pipefail
-
- repo_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
-
- # An optional image version lets maintainers reproduce failures before changing the pin.
- mapfile -t versions < <(
- sed -n "s/^ MATRIX_RENOVATE_VERSION: '\([^']*\)'$/\1/p" \
- "$repo_dir/.github/workflows/renovate.yml"
- )
- if (( ${#versions[@]} != 1 )) || [[ -z "${versions[0]}" ]]; then
- echo 'Could not resolve exactly one pinned Renovate version' >&2
- exit 1
- fi
- version="${1:-${versions[0]}}"
- image="ghcr.io/renovatebot/renovate:$version"
- log_file="$(mktemp)"
- trap 'rm -f -- "$log_file"' EXIT
-
- # Use the image's normal entrypoint for extraction, loading the real runtime.
- # No credentials or network are needed for validation and dependency extraction.
- docker_args=(
- --rm
- --network none
- --volume "$repo_dir:/workspace:ro"
- --workdir /workspace
- --env NODE_OPTIONS=--unhandled-rejections=strict
- )
-
- echo "Validating configuration with $image"
- docker run "${docker_args[@]}" \
- --entrypoint renovate-config-validator \
- "$image" --strict
-
- echo "Extracting dependencies with $image"
- docker run "${docker_args[@]}" \
- --env LOG_LEVEL=info \
- --env LOG_FORMAT=json \
- "$image" --platform=local --dry-run=extract \
- | tee "$log_file"
-
- # Exit status alone is insufficient: 44.64.0 crashed at startup but exited 0.
- # Require completion and useful results from every manager used by this repository.
- # The missing-token warning is expected: extraction needs no GitHub API access.
- if ! jq --slurp --exit-status '
- all(.[]; .level < 50)
- and any(.[]; .msg == "Repository finished" and .repository == "local")
- and any(.[];
- .msg == "Dependency extraction complete"
- and (.stats.managers as $managers
- | all(["ansible-galaxy", "dockerfile", "github-actions", "mise", "nix", "pip_requirements", "pre-commit", "regex"][];
- $managers[.].depCount > 0))
- )
- and any(.[];
- .msg == "Extracted dependencies"
- and any(.packageFiles["ansible-galaxy"][]?;
- .packageFile == "requirements.yml" and (.deps | length) > 0)
- and any(.packageFiles.regex[]?;
- (.packageFile | startswith("roles/custom/")) and (.deps | length) > 0)
- and any(.packageFiles.regex[]?;
- .packageFile == "molecule-shared/vars.yml" and (.deps | length) > 0)
- and any(.packageFiles.regex[]?.deps[]?;
- .depName == "matrix-renovate-runner" and .datasource == "docker")
- )
- ' "$log_file"; then
- echo 'Renovate did not complete dependency extraction successfully' >&2
- exit 1
- fi
-
- echo "Renovate $version passed configuration validation and dependency extraction"
|