From 95246090920588223f6db4c81634ceedc4162a8d Mon Sep 17 00:00:00 2001 From: Krzysztof Durek <21038648+kdurek@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:32:33 +0200 Subject: [PATCH 1/3] ci: split workflows to separate files --- .github/workflows/pull-request.yml | 34 ++++------------------------- .github/workflows/push.yml | 35 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/push.yml diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 27805973..97fffc7f 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -1,17 +1,16 @@ name: Pull request + on: pull_request: branches: - main - canary - push: - branches: - - main - - canary +env: + HUSKY: 0 + jobs: build-app: - if: github.event_name == 'pull_request' runs-on: ubuntu-latest strategy: matrix: @@ -45,28 +44,3 @@ jobs: - name: Run Tests run: pnpm run test - - build-and-push-docker-on-push: - if: github.event_name == 'push' - runs-on: ubuntu-latest - steps: - - name: Check out the code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Prepare .env file - run: | - cp .env.production.example .env.production - - - name: Build and push Docker image using custom script - run: | - chmod +x ./docker/push.sh - ./docker/push.sh ${{ github.ref_name == 'canary' && 'canary' || '' }} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml new file mode 100644 index 00000000..1534e6d2 --- /dev/null +++ b/.github/workflows/push.yml @@ -0,0 +1,35 @@ +name: Push + +on: + push: + branches: + - main + - canary + +env: + HUSKY: 0 + +jobs: + build-and-push-docker-on-push: + runs-on: ubuntu-latest + steps: + - name: Check out the code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Prepare .env file + run: | + cp .env.production.example .env.production + + - name: Build and push Docker image using custom script + run: | + chmod +x ./docker/push.sh + ./docker/push.sh ${{ github.ref_name == 'canary' && 'canary' || '' }} From 35652c5c53ffbada150c51a203a044f796aa6a3b Mon Sep 17 00:00:00 2001 From: Krzysztof Durek <21038648+kdurek@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:33:21 +0200 Subject: [PATCH 2/3] build: split build into multiple stages for caching --- Dockerfile | 70 ++++++++++++++++++++++++++++++++-------------------- package.json | 1 + 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6d3e5875..8075325c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,48 +1,65 @@ -# Etapa 1: Prepare image for building FROM node:18-slim AS base -# Install dependencies +# Disable husky +ENV HUSKY=0 + +# Set pnpm home ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable && apt-get update && apt-get install -y python3 make g++ git && rm -rf /var/lib/apt/lists/* +# Enable corepack +RUN corepack enable + +# Set workdir WORKDIR /app +FROM base AS base-deps +# Install dependencies only for production +RUN apt-get update && apt-get install -y python3 make g++ git && rm -rf /var/lib/apt/lists/* + +# Copy install script for husky +COPY .husky/install.mjs ./.husky/install.mjs + # Copy package.json and pnpm-lock.yaml COPY package.json pnpm-lock.yaml ./ +FROM base-deps AS prod-deps + +# Set production +ENV NODE_ENV=production + +# Install dependencies only for production +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile + +FROM base-deps AS build + # Install dependencies only for building RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile # Copy the rest of the source code COPY . . -# Build the application -RUN pnpm run build +# Build the application +RUN pnpm build -# Stage 2: Prepare image for production -FROM node:18-slim AS production +FROM base AS production + +# Set production +ENV NODE_ENV=production # Install dependencies only for production -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable && apt-get update && apt-get install -y curl && apt-get install -y apache2-utils && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y curl apache2-utils && rm -rf /var/lib/apt/lists/* -WORKDIR /app - -# Copy the rest of the source code -COPY --from=base /app/.next ./.next -COPY --from=base /app/dist ./dist -COPY --from=base /app/next.config.mjs ./next.config.mjs -COPY --from=base /app/public ./public -COPY --from=base /app/package.json ./package.json -COPY --from=base /app/drizzle ./drizzle -COPY --from=base /app/.env.production ./.env -COPY --from=base /app/components.json ./components.json - -# Install dependencies only for production -COPY package.json pnpm-lock.yaml ./ -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile +# Copy the rest of the source code +COPY --from=build /app/.next ./.next +COPY --from=build /app/dist ./dist +COPY --from=build /app/next.config.mjs ./next.config.mjs +COPY --from=build /app/public ./public +COPY --from=build /app/package.json ./package.json +COPY --from=build /app/drizzle ./drizzle +COPY --from=build /app/.env.production ./.env +COPY --from=build /app/components.json ./components.json +COPY --from=prod-deps /app/node_modules ./node_modules # Install docker RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && rm get-docker.sh @@ -54,11 +71,10 @@ RUN curl -sSL https://nixpacks.com/install.sh -o install.sh \ && ./install.sh \ && pnpm install -g tsx - # Install buildpacks RUN curl -sSL "https://github.com/buildpacks/pack/releases/download/v0.32.1/pack-v0.32.1-linux.tgz" | tar -C /usr/local/bin/ --no-same-owner -xzv pack # Expose port EXPOSE 3000 -CMD ["pnpm", "start"] \ No newline at end of file +CMD ["pnpm", "start"] diff --git a/package.json b/package.json index 354d85af..32db5718 100644 --- a/package.json +++ b/package.json @@ -157,6 +157,7 @@ "ct3aMetadata": { "initVersion": "7.25.2" }, + "packageManager": "pnpm@8.15.4", "engines": { "node": "^18.18.0", "pnpm": ">=8.15.4" From 1befdb76e77d883049c24eb7a55aa79a0ffd20d9 Mon Sep 17 00:00:00 2001 From: Krzysztof Durek <21038648+kdurek@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:38:49 +0200 Subject: [PATCH 3/3] ci: pnpm gets version from package.json packageManager field --- .github/workflows/pull-request.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 97fffc7f..81910e63 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -21,8 +21,6 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v4 - with: - version: 8 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4