From bb7bffec6312da4d333b2ea3f23b8be75d4ecf29 Mon Sep 17 00:00:00 2001 From: Bruno Alla Date: Thu, 9 Jan 2025 21:13:55 +0000 Subject: [PATCH] Add script to automatically keep node version up-to-date --- scripts/node_version.py | 55 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 scripts/node_version.py diff --git a/scripts/node_version.py b/scripts/node_version.py new file mode 100644 index 000000000..6264f8ee6 --- /dev/null +++ b/scripts/node_version.py @@ -0,0 +1,55 @@ +import json +from pathlib import Path + +ROOT = Path(__file__).parent.parent +TEMPLATED_ROOT = ROOT / "{{cookiecutter.project_slug}}" +DOCKERFILE = TEMPLATED_ROOT / "compose" / "local" / "node" / "Dockerfile" +PACKAGE_JSON = TEMPLATED_ROOT / "package.json" +CI_YML = ROOT / ".github" / "workflows" / "ci.yml" + + +def main(): + new_version = get_version_from_dockerfile() + old_version = get_version_from_package_json() + if old_version != new_version: + update_package_json_version(old_version, new_version) + update_ci_node_version(old_version, new_version) + + +def get_version_from_dockerfile(): + # Extract version out of base image name: + # FROM docker.io/node:22.13-bookworm-slim + # -> 22.13 + with DOCKERFILE.open("r") as f: + for line in f: + if "FROM docker.io/node:" in line: + _, _, docker_tag = line.partition(":") + version_str, _, _ = docker_tag.partition("-") + return version_str + + +def get_version_from_package_json(): + package_json = json.loads(PACKAGE_JSON.read_text()) + return package_json["engines"]["node"] + + +def update_package_json_version(old_version, new_version): + package_json_text = PACKAGE_JSON.read_text() + package_json_text = package_json_text.replace( + f'"node": "{old_version}"', + f'"node": "{new_version}"', + ) + PACKAGE_JSON.write_text(package_json_text) + + +def update_ci_node_version(old_version, new_version): + yml_content = CI_YML.read_text() + yml_content = yml_content.replace( + f'node-version: "{old_version}"', + f'node-version: "{new_version}"', + ) + CI_YML.write_text(yml_content) + + +if __name__ == "__main__": + main()