From 1550fd77b2e76959a35053c1187feb38726e0d70 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Fri, 4 Sep 2026 03:11:50 +0000 Subject: [PATCH] build: node 24 image, handover plugin, current CI action tags - Base image on node:24-alpine; install handover plugin from HNSDNS/handover at /opt/hsd/handover with a node_modules symlink (Node 24 refuses TS type stripping under node_modules; hsd loads plugins via loader: require(name)). - Publish hsd:latest on master pushes (latest tag was gated on non-master). - Bump workflow actions: checkout v7, setup-node v7, metadata-action v6, setup-qemu v4, setup-buildx v4, login-action v4, build-push-action v7, coveralls v2, actions-gh-pages v4; docs workflow to node 24. --- .github/workflows/build.yml | 14 +++++++------- .github/workflows/docker.yml | 16 ++++++++-------- .github/workflows/docs.yml | 8 ++++---- Dockerfile | 17 +++++++++++++++-- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f972564f8f..a2cfb7859d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,10 +8,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 24.x @@ -32,10 +32,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: 24.x @@ -47,7 +47,7 @@ jobs: run: npm run test-ci - name: Coverage - uses: coverallsapp/github-action@master + uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -60,10 +60,10 @@ jobs: node: [14.x, 16.x, 18.x, 20.x, 22.x, 24.x] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: ${{ matrix.node }} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d6fcfc09d7..6ed2f9bc4a 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -13,11 +13,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Docker meta id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v6 with: images: | ${{ secrets.DOCKERHUB_ACCOUNT }}/hsd @@ -26,32 +26,32 @@ jobs: type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} - type=raw,value=latest,enable=${{ github.ref != 'refs/heads/master' }} + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} type=edge flavor: | latest=false - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v4 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GHCR - uses: docker/login-action@v2 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v7 with: context: . push: true diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index da39bf549a..36ad5bacf0 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,15 +8,15 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: actions/setup-node@v7 with: - node-version: 16.x + node-version: 24.x - run: | npm install -g @hns-dev/bsdoc jsdoc -c jsdoc.json - name: Deploy - uses: peaceiris/actions-gh-pages@v3 + uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs/reference diff --git a/Dockerfile b/Dockerfile index 057597551f..88b99addd0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,29 @@ -FROM node:18-alpine AS base +FROM node:24-alpine AS base WORKDIR /opt/hsd RUN apk add --no-cache bash unbound-dev gmp-dev COPY package.json /opt/hsd # Install build dependencies and compile. FROM base AS build -RUN apk add --no-cache g++ gcc make python3 +RUN apk add --no-cache g++ gcc make python3 git RUN npm install --omit=dev +# handover plugin: HNSDNS/handover @ nsec-ds. Its peers resolve against +# hsd's node_modules. The sources are plain TypeScript relying on Node 24 +# type stripping, and Node won't strip types for .ts under a node_modules +# directory, so it can't go in /opt/hsd/node_modules directly. It lives next +# to hsd instead; the final stage symlinks it into node_modules so `loader: +# require` can resolve the module name `handover`, while realpath resolution +# keeps TS stripping happy. +RUN git clone --depth 1 https://github.com/HNSDNS/handover.git /opt/hsd/handover \ + && cd /opt/hsd/handover \ + && npm install --omit=dev + FROM base ENV PATH="${PATH}:/opt/hsd/bin:/opt/hsd/node_modules/.bin" COPY --from=build /opt/hsd/node_modules /opt/hsd/node_modules/ +COPY --from=build /opt/hsd/handover /opt/hsd/handover/ +RUN ln -s ../handover /opt/hsd/node_modules/handover COPY bin /opt/hsd/bin/ COPY lib /opt/hsd/lib/ ENTRYPOINT ["hsd"]