From 391bc40483930151b725978f3f95b32e9741fcc4 Mon Sep 17 00:00:00 2001 From: Camil Blanaru Date: Tue, 21 Jan 2025 14:59:25 +0100 Subject: [PATCH] Use dedicated image for preview theme --- .github/workflows/build-and-push.yml | 55 ++++++++++++++++++++++++--- Dockerfile.preview | 56 ++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 Dockerfile.preview diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml index f262ff55..bb80c0c0 100644 --- a/.github/workflows/build-and-push.yml +++ b/.github/workflows/build-and-push.yml @@ -8,16 +8,16 @@ on: jobs: build: name: Build docker image - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: '1' - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} @@ -25,7 +25,7 @@ jobs: - name: Login to Amazon ECR id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 + uses: aws-actions/amazon-ecr-login@v2 - name: Generate build ID id: prep @@ -42,7 +42,7 @@ jobs: - name: Build, tag, and push image to Amazon ECR id: build-image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true tags: ${{ steps.login-ecr.outputs.registry }}/theme-nextjs-lena:${{ steps.prep.outputs.BUILD_ID }} @@ -51,3 +51,48 @@ jobs: "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" "NEXT_PUBLIC_SENTRY_DSN=${{ secrets.NEXT_PUBLIC_SENTRY_DSN }}" + build-preview: + name: Build docker image for preview + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: '1' + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: eu-west-1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v2 + + - name: Generate build ID + id: prep + run: | + branch=${GITHUB_REF##*/} + sha=${GITHUB_SHA::8} + ts=$(date +%s) + echo "::set-output name=BUILD_ID::${branch}-${sha}-${ts}" + + - uses: docker/setup-buildx-action@v1 + id: buildx + with: + install: true + + - name: Build, tag, and push image to Amazon ECR + id: build-image + uses: docker/build-push-action@v6 + with: + push: true + file: Dockerfile.preview + tags: ${{ steps.login-ecr.outputs.registry }}/preview-lena:${{ steps.prep.outputs.BUILD_ID }} + secrets: | + "NEXT_PUBLIC_HCAPTCHA_SITEKEY=${{ secrets.NEXT_PUBLIC_HCAPTCHA_SITEKEY }}" + "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" + "NEXT_PUBLIC_SENTRY_DSN=${{ secrets.NEXT_PUBLIC_SENTRY_DSN }}" diff --git a/Dockerfile.preview b/Dockerfile.preview new file mode 100644 index 00000000..b44af252 --- /dev/null +++ b/Dockerfile.preview @@ -0,0 +1,56 @@ +# Install dependencies only when needed +FROM node:20-alpine AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci + +# Rebuild the source code only when needed +FROM node:20-alpine AS builder +WORKDIR /app +COPY . . +COPY --from=deps /app/node_modules ./node_modules + +RUN --mount=type=secret,id=NEXT_PUBLIC_HCAPTCHA_SITEKEY \ + --mount=type=secret,id=SENTRY_AUTH_TOKEN \ + --mount=type=secret,id=NEXT_PUBLIC_SENTRY_DSN \ + export NEXT_PUBLIC_HCAPTCHA_SITEKEY=$(cat /run/secrets/NEXT_PUBLIC_HCAPTCHA_SITEKEY) && \ + export SENTRY_AUTH_TOKEN=$(cat /run/secrets/SENTRY_AUTH_TOKEN) && \ + export NEXT_PUBLIC_SENTRY_DSN=$(cat /run/secrets/NEXT_PUBLIC_SENTRY_DSN) && \ + export NEXT_PUBLIC_UPLOADCARE_PUBLIC_KEY=97775dfb0ac5a6446bce && \ + export NEXT_PUBLIC_UPLOADCARE_CUSTOM_CDN_DOMAIN=cdn.uc.assets.prezly.com && \ + export SENTRY_ORG="prezly" && \ + export SENTRY_PROJECT="themes-nextjs" && \ + export PREZLY_MODE="preview" && \ + npm run build + +# Production image, copy all the files and run next +FROM node:20-alpine AS runner +WORKDIR /app + +ENV NODE_ENV=production \ + NEXT_PUBLIC_UPLOADCARE_PUBLIC_KEY=97775dfb0ac5a6446bce \ + NEXT_PUBLIC_UPLOADCARE_CUSTOM_CDN_DOMAIN=cdn.uc.assets.prezly.com \ + NODE_OPTIONS='-r next-logger' +# You only need to copy next.config.js if you are NOT using the default configuration +# COPY --from=builder /app/next.config.js ./ +COPY --from=builder /app/ . + +RUN apk update \ + && apk upgrade \ + && rm -rf /var/cache/apk/* + +RUN addgroup -g 1001 -S nodejs +RUN adduser -S nextjs -u 1001 +RUN chown -R nextjs:nodejs /app/.next +USER nextjs + +EXPOSE 3000 + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry. +# RUN npx next telemetry disable + +CMD ["node_modules/.bin/next", "start"]