From 388e744ab26588c57fe51ebcf9367cae543be7f6 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Fri, 24 Jul 2026 16:48:28 -0400 Subject: [PATCH] update nodejs --- Dockerfile | 6 +++--- bin/update | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) create mode 100755 bin/update diff --git a/Dockerfile b/Dockerfile index 9bf4719..d6f17dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -106,12 +106,12 @@ RUN echo 'end: minimal' FROM minimal AS final -ARG NODE=24.15.0 -ARG NODE_SHA256=44836872d9aec49f1e6b52a9a922872db9a2b02d235a616a5681b6a85fec8d89 +ARG NODE=v24.18.0 +ARG NODE_SHA256=783130984963db7ba9cbd01089eaf2c2efb055c7c1693c943174b967b3050cb8 ENV PATH=/opt/node/bin:$PATH RUN : \ && echo 'lang: node' \ - && curl --silent --location --output /tmp/node.tar.gz "https://nodejs.org/dist/v${NODE}/node-v${NODE}-linux-x64.tar.gz" \ + && curl --silent --location --output /tmp/node.tar.gz "https://nodejs.org/dist/${NODE}/node-${NODE}-linux-x64.tar.gz" \ && echo "${NODE_SHA256} /tmp/node.tar.gz" | sha256sum --check \ && mkdir /opt/node \ && tar --strip-components 1 --directory /opt/node -xf /tmp/node.tar.gz \ diff --git a/bin/update b/bin/update new file mode 100755 index 0000000..503a762 --- /dev/null +++ b/bin/update @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import hashlib +import json +import os.path +import urllib.request + +_HERE = os.path.join(os.path.dirname(__file__), '..') + + +def _replace_args(**kwargs: str) -> None: + fname = os.path.join(_HERE, 'Dockerfile') + + with open(fname) as f: + lines = list(f) + + for i, line in enumerate(lines): + if line.startswith('ARG '): + before, _, after = line.rstrip().partition('=') + varname = before.removeprefix('ARG ') + if varname in kwargs: + val = kwargs.pop(varname) + if after == val: + print(f'{varname}: up to date!') + else: + print(f'{varname}: {after} => {val}') + lines[i] = f'ARG {varname}={val}\n' + + if kwargs: + raise AssertionError(f'unmatched: {sorted(kwargs)}') + + with open(fname, 'w') as f: + f.writelines(lines) + + +def _update_node() -> int: + req = urllib.request.urlopen('https://nodejs.org/dist/index.json') + resp = json.load(req) + + target = next(d for d in resp if d['lts']) + node = target['version'] + + url = f'https://nodejs.org/dist/{node}/node-{node}-linux-x64.tar.gz' + req = urllib.request.urlopen(url) + h = hashlib.file_digest(req, 'sha256') + + _replace_args(NODE=node, NODE_SHA256=h.hexdigest()) + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument('target', choices=('node',)) + args = parser.parse_args() + + return {'node': _update_node}[args.target]() + + +if __name__ == '__main__': + raise SystemExit(main())