From 7c174336ffc9da237998ec4d9d20d1c2a83fc5fb Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Tue, 17 Sep 2024 04:32:46 -0500 Subject: [PATCH 01/14] Initial proof of concept (#257) Signed-off-by: eternal-flame-AD --- docker/Dockerfile | 93 +++++++++++++++++++++++++++++++++++---- docker/Dockerfile.arm64 | 5 --- docker/Dockerfile.armv7 | 5 --- docker/Dockerfile.riscv64 | 5 --- 4 files changed, 84 insertions(+), 24 deletions(-) delete mode 100644 docker/Dockerfile.arm64 delete mode 100644 docker/Dockerfile.armv7 delete mode 100644 docker/Dockerfile.riscv64 diff --git a/docker/Dockerfile b/docker/Dockerfile index 70c98926..522e4059 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,12 +1,87 @@ -FROM amd64/debian:stable-slim -ENV GOTIFY_SERVER_PORT="80" +ARG DEBIAN=stable + +# --- JS Builder --- + +FROM debian:${DEBIAN} AS js-builder + +ARG BUILD_JS=1 +ARG NODE_OPTIONS +ENV DEBIAN_FRONTEND=noninteractive + +COPY . /src/gotify + +RUN if [ "$BUILD_JS" = "1" ]; then \ + apt-get update && apt-get install -yq --no-install-recommends \ + curl \ + git \ + nodejs \ + npm && \ + \ + NODE_OPTIONS_DEFAULT=$(if node --help | grep -q -- "--openssl-legacy-provider"; then echo --openssl-legacy-provider; fi) && \ + export NODE_OPTIONS=${NODE_OPTIONS:-$NODE_OPTIONS_DEFAULT} && \ + echo "Using NODE_OPTIONS=$NODE_OPTIONS" && \ + cd /src/gotify/ui && \ + \ + npm install -g yarn && \ + \ + yarn install && \ + yarn build && \ + \ + cp -r /src/gotify/ui/build /target; \ + \ + else \ + mkdir -p /target; \ + fi + +# --- Go Builder --- + +FROM debian:${DEBIAN} AS builder + +ARG BUILD_JS=1 +ARG GO_BUILD_FLAGS=-mod=readonly -a -installsuffix cgo +ENV DEBIAN_FRONTEND=noninteractive + +ADD https://raw.githubusercontent.com/travis-ci/gimme/master/gimme /usr/local/bin/gimme + +RUN chmod +x /usr/local/bin/gimme # compatiblity + +RUN apt-get update && apt-get install -yq --no-install-recommends \ + build-essential \ + ca-certificates \ + curl \ + git + +COPY . /src/gotify +COPY --from=js-builder /target /ui-build + +RUN if [ "$BUILD_JS" = "1" ]; then \ + cp -r --update /ui-build /src/gotify/ui/build; \ + fi + +RUN cd /src/gotify && \ + read -r GIMME_GO_VERSION < GO_VERSION && \ + echo "Using Go version: $GIMME_GO_VERSION" && \ + gimme ${GIMME_GO_VERSION} && \ + mkdir -p /target/app && \ + bash -c ". ~/.gimme/envs/go${GIMME_GO_VERSION}.env && go build ${GO_BUILD_FLAGS} -o /target/app/gotify-app" + +FROM debian:${DEBIAN}-slim + +# build-time configurable port +ARG GOTIFY_SERVER_EXPOSE=80 +ENV GOTIFY_SERVER_PORT=$GOTIFY_SERVER_EXPOSE + WORKDIR /app -RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -yq \ - tzdata \ - curl \ - ca-certificates \ - && rm -rf /var/lib/apt/lists/* -ADD gotify-app /app/ + +RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -yq --no-install-recommends \ + tzdata \ + curl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + HEALTHCHECK --interval=30s --timeout=5s --start-period=5s CMD curl --fail http://localhost:$GOTIFY_SERVER_PORT/health || exit 1 -EXPOSE 80 +EXPOSE $GOTIFY_SERVER_EXPOSE + +COPY --from=builder /target / + ENTRYPOINT ["./gotify-app"] diff --git a/docker/Dockerfile.arm64 b/docker/Dockerfile.arm64 deleted file mode 100644 index 240448a9..00000000 --- a/docker/Dockerfile.arm64 +++ /dev/null @@ -1,5 +0,0 @@ -FROM arm64v8/debian -WORKDIR /app -ADD gotify-app /app/ -EXPOSE 80 -ENTRYPOINT ["./gotify-app"] \ No newline at end of file diff --git a/docker/Dockerfile.armv7 b/docker/Dockerfile.armv7 deleted file mode 100644 index 8d91d0ae..00000000 --- a/docker/Dockerfile.armv7 +++ /dev/null @@ -1,5 +0,0 @@ -FROM arm32v7/debian:stable-slim -WORKDIR /app -ADD gotify-app /app/ -EXPOSE 80 -ENTRYPOINT ["./gotify-app"] diff --git a/docker/Dockerfile.riscv64 b/docker/Dockerfile.riscv64 deleted file mode 100644 index 5044a10f..00000000 --- a/docker/Dockerfile.riscv64 +++ /dev/null @@ -1,5 +0,0 @@ -FROM riscv64/debian:sid-slim -WORKDIR /app -ADD gotify-app /app/ -EXPOSE 80 -ENTRYPOINT ["./gotify-app"] From decd4638c3f36c676e0a3d7c40a657a50d75dfd2 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Tue, 15 Oct 2024 16:40:31 -0500 Subject: [PATCH 02/14] Add tests to image build process Signed-off-by: eternal-flame-AD --- docker/Dockerfile | 20 ++++++++++++++------ test/filepath_test.go | 8 +++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 522e4059..16ac7a3a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -ARG DEBIAN=stable +ARG DEBIAN=stable-slim # --- JS Builder --- @@ -38,6 +38,7 @@ RUN if [ "$BUILD_JS" = "1" ]; then \ FROM debian:${DEBIAN} AS builder ARG BUILD_JS=1 +ARG RUN_TESTS=1 ARG GO_BUILD_FLAGS=-mod=readonly -a -installsuffix cgo ENV DEBIAN_FRONTEND=noninteractive @@ -63,12 +64,13 @@ RUN cd /src/gotify && \ echo "Using Go version: $GIMME_GO_VERSION" && \ gimme ${GIMME_GO_VERSION} && \ mkdir -p /target/app && \ - bash -c ". ~/.gimme/envs/go${GIMME_GO_VERSION}.env && go build ${GO_BUILD_FLAGS} -o /target/app/gotify-app" + bash -c ". ~/.gimme/envs/go${GIMME_GO_VERSION}.env && go test -v ./... && go build ${GO_BUILD_FLAGS} -o /target/app/gotify-app" -FROM debian:${DEBIAN}-slim +FROM debian:${DEBIAN} -# build-time configurable port +# build-time configurables ARG GOTIFY_SERVER_EXPOSE=80 +ARG GOTIFY_UID=0 ENV GOTIFY_SERVER_PORT=$GOTIFY_SERVER_EXPOSE WORKDIR /app @@ -76,8 +78,14 @@ WORKDIR /app RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -yq --no-install-recommends \ tzdata \ curl \ - ca-certificates \ - && rm -rf /var/lib/apt/lists/* + ca-certificates && \ + rm -rf /var/lib/apt/lists/* && \ + if [ "$GOTIFY_UID" != "0" ]; then \ + useradd -u $GOTIFY_UID -r gotify && \ + chown gotify:gotify /app; \ + fi + +USER $GOTIFY_UID HEALTHCHECK --interval=30s --timeout=5s --start-period=5s CMD curl --fail http://localhost:$GOTIFY_SERVER_PORT/health || exit 1 EXPOSE $GOTIFY_SERVER_EXPOSE diff --git a/test/filepath_test.go b/test/filepath_test.go index d6efbb98..fbf19937 100644 --- a/test/filepath_test.go +++ b/test/filepath_test.go @@ -32,9 +32,11 @@ func TestWithWd(t *testing.T) { }) assert.Nil(t, os.Mkdir(tmpDir.Path(), 0o644)) - assert.Panics(t, func() { - WithWd(tmpDir.Path(), func(string) {}) - }) + if os.Getuid() != 0 { // root is not subject to this check + assert.Panics(t, func() { + WithWd(tmpDir.Path(), func(string) {}) + }) + } assert.Nil(t, os.Remove(tmpDir.Path())) assert.Nil(t, os.Mkdir(tmpDir.Path(), 0o755)) From 721aecf90bae96f8aee2102c0e14a40597960f8f Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Tue, 15 Oct 2024 19:35:03 -0500 Subject: [PATCH 03/14] Merge in gotify/build image Signed-off-by: eternal-flame-AD --- Makefile | 44 ++++++++++++++++++++++---------------------- docker/Dockerfile | 24 +++++++++--------------- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/Makefile b/Makefile index 3c49a8dd..e7f11a45 100644 --- a/Makefile +++ b/Makefile @@ -63,19 +63,33 @@ package-zip: extract-licenses zip -ur $$BUILD.zip ${LICENSE_DIR}; \ done -build-docker-amd64: require-version - cp ${BUILD_DIR}/gotify-linux-amd64 ./docker/gotify-app - cd ${DOCKER_DIR} && \ - docker build \ +build-docker-multiarch: require-version + docker buildx build --sbom=true \ -t gotify/server:latest \ -t gotify/server:${VERSION} \ -t gotify/server:$(shell echo $(VERSION) | cut -d '.' -f -2) \ -t gotify/server:$(shell echo $(VERSION) | cut -d '.' -f -1) \ - -t ghcr.io/gotify/server:latest \ + -t ghcr.io/gotify/server:latest \ -t ghcr.io/gotify/server:${VERSION} \ -t ghcr.io/gotify/server:$(shell echo $(VERSION) | cut -d '.' -f -2) \ - -t ghcr.io/gotify/server:$(shell echo $(VERSION) | cut -d '.' -f -1) . - rm ${DOCKER_DIR}gotify-app + -t ghcr.io/gotify/server:$(shell echo $(VERSION) | cut -d '.' -f -1) \ + -t gotify/server-arm64:latest \ + -t gotify/server-arm64:${VERSION} \ + -t gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -2) \ + -t gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -1) \ + -t ghcr.io/gotify/server-arm64:latest \ + -t ghcr.io/gotify/server-arm64:${VERSION} \ + -t ghcr.io/gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -2) \ + -t ghcr.io/gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -1) \ + --build-arg GO_VERSION=$(shell cat GO_VERSION) \ + --platform linux/amd64,linux/arm64,linux/386 \ + -f docker/Dockerfile . + +build-docker-amd64: build-docker-multiarch + +build-docker-i386: build-docker-multiarch + +build-docker-arm64: build-docker-multiarch build-docker-arm-7: require-version cp ${BUILD_DIR}/gotify-linux-arm-7 ./docker/gotify-app @@ -91,20 +105,6 @@ build-docker-arm-7: require-version -t ghcr.io/gotify/server-arm7:$(shell echo $(VERSION) | cut -d '.' -f -1) . rm ${DOCKER_DIR}gotify-app -build-docker-arm64: require-version - cp ${BUILD_DIR}/gotify-linux-arm64 ./docker/gotify-app - cd ${DOCKER_DIR} && \ - docker build -f Dockerfile.arm64 \ - -t gotify/server-arm64:latest \ - -t gotify/server-arm64:${VERSION} \ - -t gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -2) \ - -t gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -1) \ - -t ghcr.io/gotify/server-arm64:latest \ - -t ghcr.io/gotify/server-arm64:${VERSION} \ - -t ghcr.io/gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -2) \ - -t ghcr.io/gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -1) . - rm ${DOCKER_DIR}gotify-app - build-docker-riscv64: require-version cp ${BUILD_DIR}/gotify-linux-riscv64 ./docker/gotify-app cd ${DOCKER_DIR} && \ @@ -119,7 +119,7 @@ build-docker-riscv64: require-version -t ghcr.io/gotify/server-riscv64:$(shell echo $(VERSION) | cut -d '.' -f -1) . rm ${DOCKER_DIR}gotify-app -build-docker: build-docker-amd64 build-docker-arm-7 build-docker-arm64 build-docker-riscv64 +build-docker: build-docker-multiarch build-docker-arm-7 build-docker-riscv64 build-js: (cd ui && NODE_OPTIONS="${NODE_OPTIONS}" yarn build) diff --git a/docker/Dockerfile b/docker/Dockerfile index 16ac7a3a..4c57f448 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,10 +1,12 @@ ARG DEBIAN=stable-slim +# supprress warnung about invalid variable expansion +ARG GO_VERSION=PLEASE_PROVIDE_GO_VERSION # --- JS Builder --- -FROM debian:${DEBIAN} AS js-builder +FROM --platform=${BUILDPLATFORM} debian:${DEBIAN} AS js-builder -ARG BUILD_JS=1 +ARG BUILD_JS=0 ARG NODE_OPTIONS ENV DEBIAN_FRONTEND=noninteractive @@ -35,21 +37,15 @@ RUN if [ "$BUILD_JS" = "1" ]; then \ # --- Go Builder --- -FROM debian:${DEBIAN} AS builder +FROM --platform=${BUILDPLATFORM} gotify/build:${GO_VERSION}-${TARGETPLATFORM/\//-} AS builder -ARG BUILD_JS=1 -ARG RUN_TESTS=1 +ARG BUILD_JS=0 +ARG RUN_TESTS=0 ARG GO_BUILD_FLAGS=-mod=readonly -a -installsuffix cgo ENV DEBIAN_FRONTEND=noninteractive -ADD https://raw.githubusercontent.com/travis-ci/gimme/master/gimme /usr/local/bin/gimme - -RUN chmod +x /usr/local/bin/gimme # compatiblity - RUN apt-get update && apt-get install -yq --no-install-recommends \ - build-essential \ ca-certificates \ - curl \ git COPY . /src/gotify @@ -60,11 +56,9 @@ RUN if [ "$BUILD_JS" = "1" ]; then \ fi RUN cd /src/gotify && \ - read -r GIMME_GO_VERSION < GO_VERSION && \ - echo "Using Go version: $GIMME_GO_VERSION" && \ - gimme ${GIMME_GO_VERSION} && \ mkdir -p /target/app && \ - bash -c ". ~/.gimme/envs/go${GIMME_GO_VERSION}.env && go test -v ./... && go build ${GO_BUILD_FLAGS} -o /target/app/gotify-app" + [ "$RUN_TESTS" = "1" ] && go test -v ./... || true && \ + go build ${GO_BUILD_FLAGS} -o /target/app/gotify-app FROM debian:${DEBIAN} From 3a1f880633bdd14ea36ee75e054d9c652df77346 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Tue, 15 Oct 2024 23:49:20 -0500 Subject: [PATCH 04/14] Fix build pipeline Signed-off-by: eternal-flame-AD --- .github/workflows/build.yml | 3 +++ Makefile | 42 +++++++++++++++---------------------- docker/Dockerfile | 25 +++++++++++++++++----- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 503fb8e4..425c0ef9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,9 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} - if: startsWith(github.ref, 'refs/tags/v') run: echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV + - if: startsWith(github.ref, 'refs/tags/v') + name: Set up QEMU + uses: docker/setup-qemu-action@v2 - if: startsWith(github.ref, 'refs/tags/v') run: | export LD_FLAGS="-w -s -X main.Version=$VERSION -X main.BuildDate=$(date "+%F-%T") -X main.Commit=$(git rev-parse --verify HEAD) -X main.Mode=prod" diff --git a/Makefile b/Makefile index e7f11a45..55611368 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ DOCKER_BUILD_IMAGE=gotify/build DOCKER_WORKDIR=/proj DOCKER_RUN=docker run --rm -v "$$PWD/.:${DOCKER_WORKDIR}" -v "`go env GOPATH`/pkg/mod/.:/go/pkg/mod:ro" -w ${DOCKER_WORKDIR} DOCKER_GO_BUILD=go build -mod=readonly -a -installsuffix cgo -ldflags "$$LD_FLAGS" +DOCKER_TEST_LEVEL ?= 1 # should be unnecessary but good for a last-line of defense NODE_OPTIONS=$(shell if node --help | grep -q -- "--openssl-legacy-provider"; then echo --openssl-legacy-provider; fi) test: test-coverage test-js @@ -64,7 +65,8 @@ package-zip: extract-licenses done build-docker-multiarch: require-version - docker buildx build --sbom=true \ + docker buildx build --sbom=true --provenance=true \ + --output type=local,dest=container-out \ -t gotify/server:latest \ -t gotify/server:${VERSION} \ -t gotify/server:$(shell echo $(VERSION) | cut -d '.' -f -2) \ @@ -81,20 +83,6 @@ build-docker-multiarch: require-version -t ghcr.io/gotify/server-arm64:${VERSION} \ -t ghcr.io/gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -2) \ -t ghcr.io/gotify/server-arm64:$(shell echo $(VERSION) | cut -d '.' -f -1) \ - --build-arg GO_VERSION=$(shell cat GO_VERSION) \ - --platform linux/amd64,linux/arm64,linux/386 \ - -f docker/Dockerfile . - -build-docker-amd64: build-docker-multiarch - -build-docker-i386: build-docker-multiarch - -build-docker-arm64: build-docker-multiarch - -build-docker-arm-7: require-version - cp ${BUILD_DIR}/gotify-linux-arm-7 ./docker/gotify-app - cd ${DOCKER_DIR} && \ - docker build -f Dockerfile.armv7 \ -t gotify/server-arm7:latest \ -t gotify/server-arm7:${VERSION} \ -t gotify/server-arm7:$(shell echo $(VERSION) | cut -d '.' -f -2) \ @@ -102,13 +90,7 @@ build-docker-arm-7: require-version -t ghcr.io/gotify/server-arm7:latest \ -t ghcr.io/gotify/server-arm7:${VERSION} \ -t ghcr.io/gotify/server-arm7:$(shell echo $(VERSION) | cut -d '.' -f -2) \ - -t ghcr.io/gotify/server-arm7:$(shell echo $(VERSION) | cut -d '.' -f -1) . - rm ${DOCKER_DIR}gotify-app - -build-docker-riscv64: require-version - cp ${BUILD_DIR}/gotify-linux-riscv64 ./docker/gotify-app - cd ${DOCKER_DIR} && \ - docker build -f Dockerfile.riscv64 \ + -t ghcr.io/gotify/server-arm7:$(shell echo $(VERSION) | cut -d '.' -f -1) \ -t gotify/server-riscv64:latest \ -t gotify/server-riscv64:${VERSION} \ -t gotify/server-riscv64:$(shell echo $(VERSION) | cut -d '.' -f -2) \ @@ -116,10 +98,20 @@ build-docker-riscv64: require-version -t ghcr.io/gotify/server-riscv64:latest \ -t ghcr.io/gotify/server-riscv64:${VERSION} \ -t ghcr.io/gotify/server-riscv64:$(shell echo $(VERSION) | cut -d '.' -f -2) \ - -t ghcr.io/gotify/server-riscv64:$(shell echo $(VERSION) | cut -d '.' -f -1) . - rm ${DOCKER_DIR}gotify-app + -t ghcr.io/gotify/server-riscv64:$(shell echo $(VERSION) | cut -d '.' -f -1) \ + --build-arg RUN_TESTS=$(DOCKER_TEST_LEVEL) \ + --build-arg GO_VERSION=$(shell cat GO_VERSION) \ + --platform linux/amd64,linux/arm64,linux/386,linux/arm/v7,linux/riscv64 \ + -f docker/Dockerfile . + +# Backwards compatibility +build-docker-amd64: build-docker-multiarch +build-docker-i386: build-docker-multiarch +build-docker-arm64: build-docker-multiarch +build-docker-arm-7: build-docker-multiarch +build-docker-riscv64: build-docker-multiarch -build-docker: build-docker-multiarch build-docker-arm-7 build-docker-riscv64 +build-docker: build-docker-multiarch build-js: (cd ui && NODE_OPTIONS="${NODE_OPTIONS}" yarn build) diff --git a/docker/Dockerfile b/docker/Dockerfile index 4c57f448..99afaec3 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,7 +1,18 @@ -ARG DEBIAN=stable-slim -# supprress warnung about invalid variable expansion +ARG BUILDKIT_SBOM_SCAN_CONTEXT=true +ARG DEBIAN_STABLE_ARCH=stable-slim +ARG DEBIAN_EXPERIMENTAL_ARCH=sid-slim +# suppress warnung about invalid variable expansion ARG GO_VERSION=PLEASE_PROVIDE_GO_VERSION +# Hack to normalize platform to match the chosed build image +# Get the gotify/build image tag +ARG __TARGETPLATFORM_DASHES=${TARGETPLATFORM/\//-} +ARG __TARGETPLATFORM_GO_NOTATION=${__TARGETPLATFORM_DASHES/arm\/v7/arm-7} +# Set the unstable tag if the target platform is not stable +ARG __TARGETPLATFORM_IS_STABLE=${TARGETPLATFORM/linux\/riscv64/} +ARG __DEBIAN_HAS_STABLE_TAG=${__TARGETPLATFORM_IS_STABLE/?*/${DEBIAN}} # if the last variable is not empty, set it to the debian stable tag +ARG DEBIAN=${__DEBIAN_HAS_STABLE_TAG:-${DEBIAN_EXPERIMENTAL_ARCH}} # else set it to the debian experimental tag + # --- JS Builder --- FROM --platform=${BUILDPLATFORM} debian:${DEBIAN} AS js-builder @@ -37,10 +48,12 @@ RUN if [ "$BUILD_JS" = "1" ]; then \ # --- Go Builder --- -FROM --platform=${BUILDPLATFORM} gotify/build:${GO_VERSION}-${TARGETPLATFORM/\//-} AS builder +FROM --platform=${BUILDPLATFORM} gotify/build:${GO_VERSION}-${__TARGETPLATFORM_GO_NOTATION} AS builder +ARG BUILDPLATFORM +ARG TARGETPLATFORM ARG BUILD_JS=0 -ARG RUN_TESTS=0 +ARG RUN_TESTS=0 # 0=never, 1=native only ARG GO_BUILD_FLAGS=-mod=readonly -a -installsuffix cgo ENV DEBIAN_FRONTEND=noninteractive @@ -57,7 +70,9 @@ RUN if [ "$BUILD_JS" = "1" ]; then \ RUN cd /src/gotify && \ mkdir -p /target/app && \ - [ "$RUN_TESTS" = "1" ] && go test -v ./... || true && \ + if [ "$RUN_TESTS" = "1" ] && [ "$BUILDPLATFORM" = "$TARGETPLATFORM" ]; then \ + go test -v ./...; \ + fi && \ go build ${GO_BUILD_FLAGS} -o /target/app/gotify-app FROM debian:${DEBIAN} From 037ce55621972820cf6727e8aaf18ae6409acf93 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Tue, 15 Oct 2024 23:56:32 -0500 Subject: [PATCH 05/14] fixup! Fix build pipeline --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 55611368..5f54351b 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,6 @@ package-zip: extract-licenses build-docker-multiarch: require-version docker buildx build --sbom=true --provenance=true \ - --output type=local,dest=container-out \ -t gotify/server:latest \ -t gotify/server:${VERSION} \ -t gotify/server:$(shell echo $(VERSION) | cut -d '.' -f -2) \ From 377ef3c77cadb9f22a7268b96258fab862628dfc Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Wed, 16 Oct 2024 00:12:52 -0500 Subject: [PATCH 06/14] Use registry output for Github Actions Signed-off-by: eternal-flame-AD --- .github/workflows/build.yml | 40 ++++++++++++++++++------------------- Makefile | 1 + docker/Dockerfile | 2 +- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 425c0ef9..d22fc6fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,9 +28,6 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} - if: startsWith(github.ref, 'refs/tags/v') run: echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV - - if: startsWith(github.ref, 'refs/tags/v') - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - if: startsWith(github.ref, 'refs/tags/v') run: | export LD_FLAGS="-w -s -X main.Version=$VERSION -X main.BuildDate=$(date "+%F-%T") -X main.Commit=$(git rev-parse --verify HEAD) -X main.Mode=prod" @@ -38,23 +35,26 @@ jobs: sudo chown -R $UID build make package-zip ls -lath build - make build-docker - docker image ls - echo "$DOCKER_PASS" | docker login --username "$DOCKER_USER" --password-stdin - echo "$DOCKER_GHCR_PASS" | docker login ghcr.io --username "$DOCKER_GHCR_USER" --password-stdin - docker push --all-tags gotify/server - docker push --all-tags gotify/server-arm7 - docker push --all-tags gotify/server-arm64 - docker push --all-tags gotify/server-riscv64 - docker push --all-tags ghcr.io/gotify/server - docker push --all-tags ghcr.io/gotify/server-arm7 - docker push --all-tags ghcr.io/gotify/server-arm64 - docker push --all-tags ghcr.io/gotify/server-riscv64 - env: - DOCKER_USER: ${{ secrets.DOCKER_USER }} - DOCKER_PASS: ${{ secrets.DOCKER_PASS }} - DOCKER_GHCR_USER: ${{ secrets.DOCKER_GHCR_USER }} - DOCKER_GHCR_PASS: ${{ secrets.DOCKER_GHCR_PASS }} + - if: startsWith(github.ref, 'refs/tags/v') + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - if: startsWith(github.ref, 'refs/tags/v') + name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - if: startsWith(github.ref, 'refs/tags/v') + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + - if: startsWith(github.ref, 'refs/tags/v') + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ secrets.DOCKER_GHCR_USER }} + password: ${{ secrets.DOCKER_GHCR_PASS }} + - if: startsWith(github.ref, 'refs/tags/v') + run: | + make DOCKER_BUILD_PUSH=true build-docker - if: startsWith(github.ref, 'refs/tags/v') uses: svenstaro/upload-release-action@v2 with: diff --git a/Makefile b/Makefile index 5f54351b..0d812734 100644 --- a/Makefile +++ b/Makefile @@ -66,6 +66,7 @@ package-zip: extract-licenses build-docker-multiarch: require-version docker buildx build --sbom=true --provenance=true \ + $(if $(DOCKER_BUILD_PUSH),--push) \ -t gotify/server:latest \ -t gotify/server:${VERSION} \ -t gotify/server:$(shell echo $(VERSION) | cut -d '.' -f -2) \ diff --git a/docker/Dockerfile b/docker/Dockerfile index 99afaec3..1069d520 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -10,7 +10,7 @@ ARG __TARGETPLATFORM_DASHES=${TARGETPLATFORM/\//-} ARG __TARGETPLATFORM_GO_NOTATION=${__TARGETPLATFORM_DASHES/arm\/v7/arm-7} # Set the unstable tag if the target platform is not stable ARG __TARGETPLATFORM_IS_STABLE=${TARGETPLATFORM/linux\/riscv64/} -ARG __DEBIAN_HAS_STABLE_TAG=${__TARGETPLATFORM_IS_STABLE/?*/${DEBIAN}} # if the last variable is not empty, set it to the debian stable tag +ARG __DEBIAN_HAS_STABLE_TAG=${__TARGETPLATFORM_IS_STABLE/?*/${DEBIAN_STABLE_ARCH}} # if the last variable is not empty, set it to the debian stable tag ARG DEBIAN=${__DEBIAN_HAS_STABLE_TAG:-${DEBIAN_EXPERIMENTAL_ARCH}} # else set it to the debian experimental tag # --- JS Builder --- From 6a2803a64e1b614f5bc630c965dfc630fdabea28 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Fri, 18 Oct 2024 18:37:12 -0500 Subject: [PATCH 07/14] Address go build suggestions Signed-off-by: eternal-flame-AD --- .github/workflows/build.yml | 2 ++ Makefile | 23 ++++++++++++++--------- docker/Dockerfile | 13 +++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d22fc6fa..dde9c0cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,6 +31,8 @@ jobs: - if: startsWith(github.ref, 'refs/tags/v') run: | export LD_FLAGS="-w -s -X main.Version=$VERSION -X main.BuildDate=$(date "+%F-%T") -X main.Commit=$(git rev-parse --verify HEAD) -X main.Mode=prod" + echo "LD_FLAGS=$LD_FLAGS" >> $GITHUB_ENV + make build sudo chown -R $UID build make package-zip diff --git a/Makefile b/Makefile index 0d812734..d4b7f3bf 100644 --- a/Makefile +++ b/Makefile @@ -5,9 +5,9 @@ SHELL := /bin/bash GO_VERSION=`cat GO_VERSION` DOCKER_BUILD_IMAGE=gotify/build DOCKER_WORKDIR=/proj -DOCKER_RUN=docker run --rm -v "$$PWD/.:${DOCKER_WORKDIR}" -v "`go env GOPATH`/pkg/mod/.:/go/pkg/mod:ro" -w ${DOCKER_WORKDIR} +DOCKER_RUN=docker run --rm -e LD_FLAGS="$$LD_FLAGS" -v "$$PWD/.:${DOCKER_WORKDIR}" -v "`go env GOPATH`/pkg/mod/.:/go/pkg/mod:ro" -w ${DOCKER_WORKDIR} DOCKER_GO_BUILD=go build -mod=readonly -a -installsuffix cgo -ldflags "$$LD_FLAGS" -DOCKER_TEST_LEVEL ?= 1 # should be unnecessary but good for a last-line of defense +DOCKER_TEST_LEVEL ?= 0 # Optionally run a test during docker build NODE_OPTIONS=$(shell if node --help | grep -q -- "--openssl-legacy-provider"; then echo --openssl-legacy-provider; fi) test: test-coverage test-js @@ -101,6 +101,7 @@ build-docker-multiarch: require-version -t ghcr.io/gotify/server-riscv64:$(shell echo $(VERSION) | cut -d '.' -f -1) \ --build-arg RUN_TESTS=$(DOCKER_TEST_LEVEL) \ --build-arg GO_VERSION=$(shell cat GO_VERSION) \ + --build-arg LD_FLAGS="$$LD_FLAGS" \ --platform linux/amd64,linux/arm64,linux/386,linux/arm/v7,linux/riscv64 \ -f docker/Dockerfile . @@ -113,29 +114,33 @@ build-docker-riscv64: build-docker-multiarch build-docker: build-docker-multiarch +_build_within_docker: OUTPUT = gotify-app +_build_within_docker: + ${DOCKER_GO_BUILD} -o ${OUTPUT} + build-js: (cd ui && NODE_OPTIONS="${NODE_OPTIONS}" yarn build) build-linux-amd64: - ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-amd64 ${DOCKER_GO_BUILD} -o ${BUILD_DIR}/gotify-linux-amd64 ${DOCKER_WORKDIR} + ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-amd64 make _build_within_docker OUTPUT=${BUILD_DIR}/gotify-linux-amd64 build-linux-386: - ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-386 ${DOCKER_GO_BUILD} -o ${BUILD_DIR}/gotify-linux-386 ${DOCKER_WORKDIR} + ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-386 make _build_within_docker OUTPUT=${BUILD_DIR}/gotify-linux-386 build-linux-arm-7: - ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-arm-7 ${DOCKER_GO_BUILD} -o ${BUILD_DIR}/gotify-linux-arm-7 ${DOCKER_WORKDIR} + ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-arm-7 make _build_within_docker OUTPUT=${BUILD_DIR}/gotify-linux-arm-7 build-linux-arm64: - ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-arm64 ${DOCKER_GO_BUILD} -o ${BUILD_DIR}/gotify-linux-arm64 ${DOCKER_WORKDIR} + ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-arm64 make _build_within_docker OUTPUT=${BUILD_DIR}/gotify-linux-arm64 build-linux-riscv64: - ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-riscv64 ${DOCKER_GO_BUILD} -o ${BUILD_DIR}/gotify-linux-riscv64 ${DOCKER_WORKDIR} + ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-linux-riscv64 make _build_within_docker OUTPUT=${BUILD_DIR}/gotify-linux-riscv64 build-windows-amd64: - ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-windows-amd64 ${DOCKER_GO_BUILD} -o ${BUILD_DIR}/gotify-windows-amd64.exe ${DOCKER_WORKDIR} + ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-windows-amd64 make _build_within_docker OUTPUT=${BUILD_DIR}/gotify-windows-amd64.exe build-windows-386: - ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-windows-386 ${DOCKER_GO_BUILD} -o ${BUILD_DIR}/gotify-windows-386.exe ${DOCKER_WORKDIR} + ${DOCKER_RUN} ${DOCKER_BUILD_IMAGE}:$(GO_VERSION)-windows-386 make _build_within_docker OUTPUT=${BUILD_DIR}/gotify-windows-386.exe build: build-linux-arm-7 build-linux-amd64 build-linux-386 build-linux-arm64 build-linux-riscv64 build-windows-amd64 build-windows-386 diff --git a/docker/Dockerfile b/docker/Dockerfile index 1069d520..411abd8e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -54,7 +54,7 @@ ARG BUILDPLATFORM ARG TARGETPLATFORM ARG BUILD_JS=0 ARG RUN_TESTS=0 # 0=never, 1=native only -ARG GO_BUILD_FLAGS=-mod=readonly -a -installsuffix cgo +ARG LD_FLAGS="" ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -yq --no-install-recommends \ @@ -73,13 +73,12 @@ RUN cd /src/gotify && \ if [ "$RUN_TESTS" = "1" ] && [ "$BUILDPLATFORM" = "$TARGETPLATFORM" ]; then \ go test -v ./...; \ fi && \ - go build ${GO_BUILD_FLAGS} -o /target/app/gotify-app + LD_FLAGS=${LD_FLAGS} make OUTPUT=/target/gotify-app _build_within_docker FROM debian:${DEBIAN} # build-time configurables ARG GOTIFY_SERVER_EXPOSE=80 -ARG GOTIFY_UID=0 ENV GOTIFY_SERVER_PORT=$GOTIFY_SERVER_EXPOSE WORKDIR /app @@ -88,13 +87,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install - tzdata \ curl \ ca-certificates && \ - rm -rf /var/lib/apt/lists/* && \ - if [ "$GOTIFY_UID" != "0" ]; then \ - useradd -u $GOTIFY_UID -r gotify && \ - chown gotify:gotify /app; \ - fi - -USER $GOTIFY_UID + rm -rf /var/lib/apt/lists/* HEALTHCHECK --interval=30s --timeout=5s --start-period=5s CMD curl --fail http://localhost:$GOTIFY_SERVER_PORT/health || exit 1 EXPOSE $GOTIFY_SERVER_EXPOSE From f833d203e3062d45de786e64c5645bb11020764b Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Fri, 18 Oct 2024 18:47:17 -0500 Subject: [PATCH 08/14] Switch to using official node Docker image Signed-off-by: eternal-flame-AD --- docker/Dockerfile | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 411abd8e..38c50679 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -15,21 +15,14 @@ ARG DEBIAN=${__DEBIAN_HAS_STABLE_TAG:-${DEBIAN_EXPERIMENTAL_ARCH}} # else set it # --- JS Builder --- -FROM --platform=${BUILDPLATFORM} debian:${DEBIAN} AS js-builder +FROM --platform=${BUILDPLATFORM} node:23 AS js-builder ARG BUILD_JS=0 ARG NODE_OPTIONS -ENV DEBIAN_FRONTEND=noninteractive COPY . /src/gotify RUN if [ "$BUILD_JS" = "1" ]; then \ - apt-get update && apt-get install -yq --no-install-recommends \ - curl \ - git \ - nodejs \ - npm && \ - \ NODE_OPTIONS_DEFAULT=$(if node --help | grep -q -- "--openssl-legacy-provider"; then echo --openssl-legacy-provider; fi) && \ export NODE_OPTIONS=${NODE_OPTIONS:-$NODE_OPTIONS_DEFAULT} && \ echo "Using NODE_OPTIONS=$NODE_OPTIONS" && \ From 02f22121dfd8219eddefb1fc45934afa725d4a75 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Fri, 18 Oct 2024 19:00:33 -0500 Subject: [PATCH 09/14] Unify debian editions to sid Signed-off-by: eternal-flame-AD --- docker/Dockerfile | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 38c50679..a6697ca3 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,17 +1,12 @@ ARG BUILDKIT_SBOM_SCAN_CONTEXT=true -ARG DEBIAN_STABLE_ARCH=stable-slim -ARG DEBIAN_EXPERIMENTAL_ARCH=sid-slim # suppress warnung about invalid variable expansion ARG GO_VERSION=PLEASE_PROVIDE_GO_VERSION +ARG DEBIAN=sid-slim # Hack to normalize platform to match the chosed build image # Get the gotify/build image tag ARG __TARGETPLATFORM_DASHES=${TARGETPLATFORM/\//-} ARG __TARGETPLATFORM_GO_NOTATION=${__TARGETPLATFORM_DASHES/arm\/v7/arm-7} -# Set the unstable tag if the target platform is not stable -ARG __TARGETPLATFORM_IS_STABLE=${TARGETPLATFORM/linux\/riscv64/} -ARG __DEBIAN_HAS_STABLE_TAG=${__TARGETPLATFORM_IS_STABLE/?*/${DEBIAN_STABLE_ARCH}} # if the last variable is not empty, set it to the debian stable tag -ARG DEBIAN=${__DEBIAN_HAS_STABLE_TAG:-${DEBIAN_EXPERIMENTAL_ARCH}} # else set it to the debian experimental tag # --- JS Builder --- @@ -66,7 +61,7 @@ RUN cd /src/gotify && \ if [ "$RUN_TESTS" = "1" ] && [ "$BUILDPLATFORM" = "$TARGETPLATFORM" ]; then \ go test -v ./...; \ fi && \ - LD_FLAGS=${LD_FLAGS} make OUTPUT=/target/gotify-app _build_within_docker + LD_FLAGS=${LD_FLAGS} make OUTPUT=/target/app/gotify-app _build_within_docker FROM debian:${DEBIAN} From a5e9fb4384370b318b3339e996d8ad767c016430 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Fri, 18 Oct 2024 19:12:32 -0500 Subject: [PATCH 10/14] Remove unused makefile recipes Signed-off-by: eternal-flame-AD --- Makefile | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Makefile b/Makefile index d4b7f3bf..dd7b3740 100644 --- a/Makefile +++ b/Makefile @@ -105,13 +105,6 @@ build-docker-multiarch: require-version --platform linux/amd64,linux/arm64,linux/386,linux/arm/v7,linux/riscv64 \ -f docker/Dockerfile . -# Backwards compatibility -build-docker-amd64: build-docker-multiarch -build-docker-i386: build-docker-multiarch -build-docker-arm64: build-docker-multiarch -build-docker-arm-7: build-docker-multiarch -build-docker-riscv64: build-docker-multiarch - build-docker: build-docker-multiarch _build_within_docker: OUTPUT = gotify-app From 486f7fa5b8ff04ee37c0bcce6b0912e51127d294 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Sat, 19 Oct 2024 13:32:52 -0500 Subject: [PATCH 11/14] Address suggestions Signed-off-by: eternal-flame-AD --- docker/Dockerfile | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index a6697ca3..76b90a4a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -13,25 +13,15 @@ ARG __TARGETPLATFORM_GO_NOTATION=${__TARGETPLATFORM_DASHES/arm\/v7/arm-7} FROM --platform=${BUILDPLATFORM} node:23 AS js-builder ARG BUILD_JS=0 -ARG NODE_OPTIONS -COPY . /src/gotify +COPY ./Makefile /src/gotify/Makefile +COPY ./ui /src/gotify/ui RUN if [ "$BUILD_JS" = "1" ]; then \ - NODE_OPTIONS_DEFAULT=$(if node --help | grep -q -- "--openssl-legacy-provider"; then echo --openssl-legacy-provider; fi) && \ - export NODE_OPTIONS=${NODE_OPTIONS:-$NODE_OPTIONS_DEFAULT} && \ - echo "Using NODE_OPTIONS=$NODE_OPTIONS" && \ - cd /src/gotify/ui && \ - \ - npm install -g yarn && \ - \ - yarn install && \ - yarn build && \ - \ - cp -r /src/gotify/ui/build /target; \ - \ + (cd /src/gotify/ui && yarn install) && \ + (cd /src/gotify && make build-js) \ else \ - mkdir -p /target; \ + mkdir -p /src/gotify/ui/build; \ fi # --- Go Builder --- @@ -50,14 +40,13 @@ RUN apt-get update && apt-get install -yq --no-install-recommends \ git COPY . /src/gotify -COPY --from=js-builder /target /ui-build +COPY --from=js-builder /src/gotify/ui/build /ui-build RUN if [ "$BUILD_JS" = "1" ]; then \ cp -r --update /ui-build /src/gotify/ui/build; \ fi RUN cd /src/gotify && \ - mkdir -p /target/app && \ if [ "$RUN_TESTS" = "1" ] && [ "$BUILDPLATFORM" = "$TARGETPLATFORM" ]; then \ go test -v ./...; \ fi && \ From eeb29844cd6fecf61afe3255735a65c63c9df16d Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Sat, 19 Oct 2024 13:51:57 -0500 Subject: [PATCH 12/14] Add .dockerignore Signed-off-by: eternal-flame-AD --- .dockerignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..aa757340 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +vendor/ +.idea/ +build/ +licenses/ +coverage.txt +data/ +images/ +.git/ From 0bbf37aa04e587cf7855a5ea92fbf1e49097d286 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Sun, 20 Oct 2024 11:27:23 -0500 Subject: [PATCH 13/14] Cosmetic fixes Signed-off-by: eternal-flame-AD --- .github/workflows/build.yml | 2 +- docker/Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dde9c0cf..e34c2896 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,7 +56,7 @@ jobs: password: ${{ secrets.DOCKER_GHCR_PASS }} - if: startsWith(github.ref, 'refs/tags/v') run: | - make DOCKER_BUILD_PUSH=true build-docker + make DOCKER_BUILD_PUSH=true build-docker - if: startsWith(github.ref, 'refs/tags/v') uses: svenstaro/upload-release-action@v2 with: diff --git a/docker/Dockerfile b/docker/Dockerfile index 76b90a4a..bc9a1967 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ ARG BUILDKIT_SBOM_SCAN_CONTEXT=true -# suppress warnung about invalid variable expansion +# Suppress warning about invalid variable expansion ARG GO_VERSION=PLEASE_PROVIDE_GO_VERSION ARG DEBIAN=sid-slim @@ -54,7 +54,7 @@ RUN cd /src/gotify && \ FROM debian:${DEBIAN} -# build-time configurables +# Build-time configurables ARG GOTIFY_SERVER_EXPOSE=80 ENV GOTIFY_SERVER_PORT=$GOTIFY_SERVER_EXPOSE From c427fdeb5c6be20365c5cc3bfde646d0600abb4f Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Tue, 22 Oct 2024 14:45:27 -0500 Subject: [PATCH 14/14] add node_modules to dockerignore Signed-off-by: eternal-flame-AD --- .dockerignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.dockerignore b/.dockerignore index aa757340..b3dae9c3 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,3 +6,4 @@ coverage.txt data/ images/ .git/ +*/node_modules/