Harden image and fail CI on fixable vulnerabilities, update Node 22 docker image
Build, Scan & Publish Image / build-scan-push (release) Successful in 12m30s

This commit is contained in:
mdaleo404 committed 2026-10-09 09:27:08 +01:00
1 parent 23e1527b82
commit f2b457d4d2
2 files changed
+20 -8

No files matched your search

+8 -7
View File
@@ -1,9 +1,10 @@
name: Build, Scan & Publish Image name: Build, Scan & Publish Image
# Publishing a Gitea release (for example with tag 2026.09.25) builds the image, # Publishing a Gitea release (for example with tag 2026.09.25) builds the image,
# scans it with Grype (report only), and pushes it to this repository's registry. # scans it with Grype (fails on fixable HIGH/CRITICAL findings), and pushes it to
# A release pushes the release tag plus "latest" (non-prereleases only). # this repository's registry. A release pushes the release tag plus "latest"
# A manual run builds and pushes only the tag supplied in the input. # (non-prereleases only). A manual run builds and pushes only the tag supplied
# in the input.
on: on:
release: release:
types: [published] types: [published]
@@ -118,9 +119,8 @@ jobs:
tar -xzf "${FILE}" tar -xzf "${FILE}"
mv grype /usr/local/bin/ mv grype /usr/local/bin/
- name: Scan image with Grype (report only) - name: Scan image with Grype
id: grype id: grype
continue-on-error: true
run: | run: |
grype "${IMAGE_REF}" -o json > grype.json grype "${IMAGE_REF}" -o json > grype.json
@@ -140,7 +140,7 @@ jobs:
| "\(.artifact.name)@\(.artifact.version) -> \(.vulnerability.id) [\(.vulnerability.severity)] | fixed: \(.vulnerability.fix.versions[0])" | "\(.artifact.name)@\(.artifact.version) -> \(.vulnerability.id) [\(.vulnerability.severity)] | fixed: \(.vulnerability.fix.versions[0])"
' grype.json ' grype.json
# Report fixable HIGH/CRITICAL without failing the build. # Fail the build on fixable HIGH/CRITICAL vulnerabilities.
COUNT=$(jq ' COUNT=$(jq '
[ [
.matches[] .matches[]
@@ -159,7 +159,8 @@ jobs:
' grype.json) ' grype.json)
echo "Fixable HIGH/CRITICAL count: ${COUNT}" echo "Fixable HIGH/CRITICAL count: ${COUNT}"
if [ "$COUNT" != "0" ]; then if [ "$COUNT" != "0" ]; then
echo "::warning::Grype found ${COUNT} fixable HIGH/CRITICAL vulnerabilities." echo "::error::Grype found ${COUNT} fixable HIGH/CRITICAL vulnerabilities."
exit 1
fi fi
- name: Push image - name: Push image
+12 -1
View File
@@ -1,4 +1,4 @@
FROM node:22-trixie-slim@sha256:b26b04c123d9ff8ab646ceb18b9d75a1173acf64b9a401094b906d27b29338d4 FROM node:22-trixie-slim@sha256:154ba2f4d6fec323d28e4f4bb86bba4677f1223391a1979cf521304e03a98dfa
# kovi does not vendor or copy Calibre code. The container installs Debian's # kovi does not vendor or copy Calibre code. The container installs Debian's
# unmodified Calibre package and calls its fetch-ebook-metadata CLI as a separate # unmodified Calibre package and calls its fetch-ebook-metadata CLI as a separate
@@ -9,6 +9,17 @@ RUN apt-get update \
&& apt-get install -y --no-install-recommends calibre ca-certificates \ && apt-get install -y --no-install-recommends calibre ca-certificates \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Remove npm/Corepack so their bundled dependency trees are not shipped in the
# runtime image and flagged by image scanners.
RUN rm -rf /usr/local/lib/node_modules/npm \
/usr/local/lib/node_modules/corepack \
/usr/local/bin/npm \
/usr/local/bin/npx \
/usr/local/bin/corepack \
/usr/local/bin/yarn \
/usr/local/bin/yarnpkg \
/usr/local/bin/pnpm
WORKDIR /app WORKDIR /app
COPY package.json server.mjs ./ COPY package.json server.mjs ./
COPY lib ./lib COPY lib ./lib