diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..21fb9fb --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,43 @@ +name: publish + +on: [push] +env: + IMAGE_NAME: mailpress + +jobs: + # Push image to GitHub Packages. + # See also https://docs.docker.com/docker-hub/builds/ + publish-container: + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + + steps: + - uses: actions/checkout@v4 + + - name: Build image + run: docker build . --file Dockerfile --tag $IMAGE_NAME + + - name: Log into registry + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + - name: Push image + run: | + IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME + + # Change all uppercase to lowercase + IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') + # Strip git ref prefix from version + VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') + # Strip "v" prefix from tag name + [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') + # Use Docker `latest` tag convention + [ "$VERSION" == "main" ] && VERSION=latest + echo IMAGE_ID=$IMAGE_ID + echo VERSION=$VERSION + docker tag $IMAGE_NAME $IMAGE_ID:$VERSION + docker push $IMAGE_ID:$VERSION + +# SPDX-License-Identifier: (EUPL-1.2) +# Copyright © 2024 cronit KG diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..659a6d8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +# Use the official Node.js 20 image as the base +FROM node:20-alpine as base + +LABEL description="Offical docker image for Pylon services (Node.js)" +LABEL org.opencontainers.image.source="https://github.com/getcronit/pylon" +LABEL maintainer="office@cronit.io" + +WORKDIR /usr/src/pylon + +# install dependencies into a temp directory +# this will cache them and speed up future builds +FROM base AS install +RUN mkdir -p /temp/dev +COPY package.json package-lock.json /temp/dev/ +RUN cd /temp/dev && npm ci + +# install with --production (exclude devDependencies) +RUN mkdir -p /temp/prod +COPY package.json package-lock.json /temp/prod/ +RUN cd /temp/prod && npm ci --only=production + +# copy node_modules from temp directory +# then copy all (non-ignored) project files into the image +FROM install AS prerelease +COPY --from=install /temp/dev/node_modules node_modules +COPY . . + +# [optional] tests & build +ENV NODE_ENV=production + +# Create .pylon folder (mkdir) +RUN mkdir -p .pylon +# RUN npm test +RUN npm run pylon build + +# copy production dependencies and source code into final image +FROM base AS release +COPY --from=install /temp/prod/node_modules node_modules +COPY --from=prerelease /usr/src/pylon/.pylon .pylon +COPY --from=prerelease /usr/src/pylon/package.json . + +# run the app +USER node +EXPOSE 3000/tcp +ENTRYPOINT [ "node", "/usr/src/pylon/.pylon/index.js" ] \ No newline at end of file