diff --git a/.github/workflows/production-deployment.yml b/.github/workflows/production-deployment.yml index 2db3074fb..8531be876 100644 --- a/.github/workflows/production-deployment.yml +++ b/.github/workflows/production-deployment.yml @@ -1,6 +1,7 @@ name: Production Deployment on: + workflow_dispatch: push: branches: - main @@ -8,7 +9,33 @@ on: - .github/workflows/** jobs: + build_and_push: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - 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: Build and push + uses: docker/build-push-action@v6 + with: + file: docker/prod/Dockerfile + push: true + tags: hngdevops/nextjs-boilerplate:prod + deploy_to_production: + needs: build_and_push if: github.event.repository.fork == false runs-on: ubuntu-latest @@ -24,4 +51,5 @@ jobs: username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} script: | - ./deploy_prod.sh next + cd hng_boilerplate_nextjs + ./scripts/prod_deploy.sh diff --git a/.github/workflows/staging-deployment.yml b/.github/workflows/staging-deployment.yml index ed32fb66f..481e00222 100644 --- a/.github/workflows/staging-deployment.yml +++ b/.github/workflows/staging-deployment.yml @@ -1,6 +1,7 @@ name: Staging Deployment on: + workflow_dispatch: push: branches: - staging @@ -8,7 +9,33 @@ on: - .github/workflows/** jobs: + build_and_push: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - 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: Build and push + uses: docker/build-push-action@v6 + with: + file: docker/staging/Dockerfile + push: true + tags: hngdevops/nextjs-boilerplate:staging + deploy_to_staging: + needs: build_and_push if: github.event.repository.fork == false runs-on: ubuntu-latest @@ -24,4 +51,5 @@ jobs: username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} script: | - ./deploy_staging.sh next + cd hng_boilerplate_nextjs + ./scripts/staging_deploy.sh diff --git a/.github/workflows/team-deployment.yml b/.github/workflows/team-deployment.yml index dd04d55d7..0227383d5 100644 --- a/.github/workflows/team-deployment.yml +++ b/.github/workflows/team-deployment.yml @@ -25,6 +25,25 @@ jobs: script: | cd hng_boilerplate_nextjs ./scripts/team_deploy.sh kimiko-golang ${{ vars.PORT }} + + kimiko-csharp: + if: github.event.repository.fork == false + runs-on: ubuntu-latest + + environment: + name: "kimiko-csharp" + url: ${{ vars.URL }} + + steps: + - name: Deploy to kimiko-csharp environment + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + script: | + cd hng_boilerplate_nextjs + ./scripts/team_deploy.sh kimiko-csharp ${{ vars.PORT }} cyborgs-java: if: github.event.repository.fork == false diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 1804005e9..74067e5bb 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -1,4 +1,4 @@ -Use the official Node.js image based on Alpine Linux for a smaller image size +# Use the official Node.js image based on Alpine Linux for a smaller image size FROM node:20-alpine AS base FROM base AS deps @@ -24,6 +24,7 @@ COPY . . # Build the application RUN corepack enable pnpm && pnpm run build + # Production image, copy all the files and run next FROM base AS runner WORKDIR /app @@ -52,4 +53,4 @@ ENV PORT 3000 # server.js is created by next build from the standalone output # https://nextjs.org/docs/pages/api-reference/next-config-js/output -CMD HOSTNAME="0.0.0.0" node server.js \ No newline at end of file +CMD HOSTNAME="0.0.0.0" node server.js diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index 9fa19856a..38660d65b 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -1,12 +1,11 @@ services: - next-prod-frontend-1: - build: - context: ../../ - dockerfile: docker/prod/Dockerfile + frontend: + image: hngdevops/nextjs-boilerplate:prod ports: - 3000:3000 - restart: always + volumes: + - ../../.env:/app/.env # next-prod-frontend-2: # build: diff --git a/docker/staging/Dockerfile b/docker/staging/Dockerfile index 1804005e9..74067e5bb 100644 --- a/docker/staging/Dockerfile +++ b/docker/staging/Dockerfile @@ -1,4 +1,4 @@ -Use the official Node.js image based on Alpine Linux for a smaller image size +# Use the official Node.js image based on Alpine Linux for a smaller image size FROM node:20-alpine AS base FROM base AS deps @@ -24,6 +24,7 @@ COPY . . # Build the application RUN corepack enable pnpm && pnpm run build + # Production image, copy all the files and run next FROM base AS runner WORKDIR /app @@ -52,4 +53,4 @@ ENV PORT 3000 # server.js is created by next build from the standalone output # https://nextjs.org/docs/pages/api-reference/next-config-js/output -CMD HOSTNAME="0.0.0.0" node server.js \ No newline at end of file +CMD HOSTNAME="0.0.0.0" node server.js diff --git a/docker/staging/docker-compose.yml b/docker/staging/docker-compose.yml index 96ed1f242..d279c3648 100644 --- a/docker/staging/docker-compose.yml +++ b/docker/staging/docker-compose.yml @@ -1,12 +1,11 @@ services: - next-staging-frontend-1: - build: - context: ../../ - dockerfile: docker/staging/Dockerfile + frontend: + image: hngdevops/nextjs-boilerplate:staging ports: - 3200:3000 - restart: always + volumes: + - ../../.env:/app/.env # next-staging-frontend-2: # build: diff --git a/scripts/prod_deploy.sh b/scripts/prod_deploy.sh index e192db8c1..38ab8d1a1 100755 --- a/scripts/prod_deploy.sh +++ b/scripts/prod_deploy.sh @@ -1,22 +1,8 @@ #!/bin/bash -if [ "$#" -ne 1 ]; then - echo "Usage: $0 {next|remix}" - exit 1 -fi +set -e -if [ "$1" == "next" ]; then - cd /home/nextjs/prod/hng_boilerplate_nextjs - git pull origin main - docker compose -f docker/prod/docker-compose.yml build - docker compose -f docker/prod/docker-compose.yml up -d -elif [ "$1" == "remix" ]; then - cd /home/remixjs/prod/hng_boilerplate_remix - git pull origin main - docker compose -f docker/prod/docker-compose.yml build - docker compose -f docker/prod/docker-compose.yml up -d -else - echo "Invalid argument. Use 'next' or 'remix'." - echo "Usage: $0 {next|remix}" - exit 1 -fi +cd "$(git rev-parse --show-toplevel)" +git pull origin main +docker pull hngdevops/nextjs-boilerplate:prod +docker compose --project-name prod-nextjs -f docker/prod/docker-compose.yml up -d diff --git a/scripts/staging_deploy.sh b/scripts/staging_deploy.sh index cc2ba3194..9a5f36ef3 100755 --- a/scripts/staging_deploy.sh +++ b/scripts/staging_deploy.sh @@ -1,22 +1,8 @@ #!/bin/bash -if [ "$#" -ne 1 ]; then - echo "Usage: $0 {next|remix}" - exit 1 -fi +set -e -if [ "$1" == "next" ]; then - cd /home/nextjs/staging/hng_boilerplate_nextjs - git pull origin staging - docker compose -f docker/staging/docker-compose.yml build - docker compose -f docker/staging/docker-compose.yml up -d -elif [ "$1" == "remix" ]; then - cd /home/remixjs/staging/hng_boilerplate_remix - git pull origin staging - docker compose -f docker/staging/docker-compose.yml build - docker compose -f docker/staging/docker-compose.yml up -d -else - echo "Invalid argument. Use 'next' or 'remix'." - echo "Usage: $0 {next|remix}" - exit 1 -fi +cd "$(git rev-parse --show-toplevel)" +git pull origin staging +docker pull hngdevops/nextjs-boilerplate:staging +docker compose --project-name staging-nextjs -f docker/staging/docker-compose.yml up -d