From 295acff54890965ecba8e81dcfdb0df9e16fb5d0 Mon Sep 17 00:00:00 2001 From: kjuulh Date: Sat, 20 Aug 2022 23:39:36 +0200 Subject: [PATCH] added drone --- .cuddle/tmp/build_release.Dockerfile | 60 ++++++++++++++++ .../tmp/build_release.Dockerfile.dockerignore | 4 ++ .drone.yml | 68 +++++++++++++++++++ cuddle.yaml | 12 ++++ next.config.js | 1 + scripts/build_release.sh | 17 +++++ scripts/deploy_release.sh | 10 +++ scripts/render_templates.sh | 11 +++ scripts/setup_ssh.sh | 24 +++++++ scripts/start_deployment.sh | 17 +++++ templates/build_release.Dockerfile | 60 ++++++++++++++++ .../build_release.Dockerfile.dockerignore | 4 ++ .../docker-compose.deploy_release.yml.tmpl | 9 +++ 13 files changed, 297 insertions(+) create mode 100644 .cuddle/tmp/build_release.Dockerfile create mode 100644 .cuddle/tmp/build_release.Dockerfile.dockerignore create mode 100644 .drone.yml create mode 100755 scripts/build_release.sh create mode 100755 scripts/deploy_release.sh create mode 100755 scripts/render_templates.sh create mode 100755 scripts/setup_ssh.sh create mode 100755 scripts/start_deployment.sh create mode 100644 templates/build_release.Dockerfile create mode 100644 templates/build_release.Dockerfile.dockerignore create mode 100644 templates/docker-compose.deploy_release.yml.tmpl diff --git a/.cuddle/tmp/build_release.Dockerfile b/.cuddle/tmp/build_release.Dockerfile new file mode 100644 index 0000000..6d15a20 --- /dev/null +++ b/.cuddle/tmp/build_release.Dockerfile @@ -0,0 +1,60 @@ +# Install dependencies only when needed +FROM node:16-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 + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +# Rebuild the source code only when needed +FROM node:16-alpine AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# 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 during the build. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN yarn build + +# If using npm comment out above and use below instead +# RUN npm run build + +# Production image, copy all the files and run next +FROM node:16-alpine AS runner +WORKDIR /app + +ENV NODE_ENV production +# Uncomment the following line in case you want to disable telemetry during runtime. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# 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/public ./public +COPY --from=builder /app/package.json ./package.json + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 + +CMD ["node", "server.js"] diff --git a/.cuddle/tmp/build_release.Dockerfile.dockerignore b/.cuddle/tmp/build_release.Dockerfile.dockerignore new file mode 100644 index 0000000..b1442a3 --- /dev/null +++ b/.cuddle/tmp/build_release.Dockerfile.dockerignore @@ -0,0 +1,4 @@ +.next/ +.git/ +.cuddle/ +node_modules/ diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..809bc87 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,68 @@ +kind: pipeline +name: default +type: docker + +steps: + - name: load_secret + image: debian:buster-slim + volumes: + - name: ssh + path: /root/.ssh/ + environment: + SSH_KEY: + from_secret: gitea_id_ed25519 + commands: + - mkdir -p $HOME/.ssh/ + - echo "$SSH_KEY" | base64 -d > $HOME/.ssh/id_ed25519 + + - name: build + image: kasperhermansen/cuddle:latest + pull: always + volumes: + - name: ssh + path: /root/.ssh/ + - name: dockersock + path: /var/run + commands: + - apk add bash git + - cuddle_cli x setup_ssh + - cuddle_cli x render_templates + - cuddle_cli x start_deployment + - cuddle_cli x build_release + - cuddle_cli x deploy_release + environment: + DOCKER_BUILDKIT: 1 + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password + SSH_KEY: + from_secret: gitea_id_ed25519 + depends_on: + - "load_secret" + + - name: send telegram notification + image: appleboy/drone-telegram + settings: + token: + from_secret: telegram_token + to: 2129601481 + format: markdown + depends_on: + - build + when: + status: [failure, success] + +services: +- name: docker + image: docker:dind + privileged: true + volumes: + - name: dockersock + path: /var/run +volumes: + - name: ssh + temp: {} + - name: dockersock + temp: {} + diff --git a/cuddle.yaml b/cuddle.yaml index f8a4fad..ca44f17 100644 --- a/cuddle.yaml +++ b/cuddle.yaml @@ -4,9 +4,21 @@ base: false vars: service: "cibus-frontend" + registry: kasperhermansen + port: 3001:3001 scripts: generate_graphql: type: shell download: type: shell + build_release: + type: shell + setup_ssh: + type: shell + deploy_release: + type: shell + start_deployment: + type: shell + render_templates: + type: shell diff --git a/next.config.js b/next.config.js index 8b61df4..da7c4ce 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,5 @@ /** @type {import('next').NextConfig} */ module.exports = { reactStrictMode: true, + output: 'standalone' } diff --git a/scripts/build_release.sh b/scripts/build_release.sh new file mode 100755 index 0000000..c488b1a --- /dev/null +++ b/scripts/build_release.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e + +tag="$REGISTRY/$SERVICE:${COMMIT_SHA:0:10}" + +if [[ -n $DEBUG ]] +then + echo "debug:" + echo " REGISTRY: $REGISTRY" + echo " SERVICE: $SERVICE" + echo " COMMIT_SHA: $COMMIT_SHA" + echo " TMP: $TMP" +fi + +DOCKER_BUILDKIT=1 docker build -t "$tag" -f "$TMP/build_release.Dockerfile" . + diff --git a/scripts/deploy_release.sh b/scripts/deploy_release.sh new file mode 100755 index 0000000..250eac4 --- /dev/null +++ b/scripts/deploy_release.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -e + +echo "deploying image" +deploymentrepo="$TMP/deployments" + +cd $deploymentrepo + +git add . && git commit -m "Added release $SERVICE: ${COMMIT_SHA:0:10}" && git pull && git push diff --git a/scripts/render_templates.sh b/scripts/render_templates.sh new file mode 100755 index 0000000..31317d1 --- /dev/null +++ b/scripts/render_templates.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -e + +tag="$REGISTRY/$SERVICE:${COMMIT_SHA:0:10}" +deploymentrepo="$TMP/deployments" + +CUDDLE_FETCH_POLICY=never cuddle_cli render_template \ + --template-file "$TMP/docker-compose.deploy_release.yml.tmpl" \ + --dest "$deploymentrepo/$SERVICE/docker-compose.yml" \ + --extra-var "image=$tag" diff --git a/scripts/setup_ssh.sh b/scripts/setup_ssh.sh new file mode 100755 index 0000000..ae86915 --- /dev/null +++ b/scripts/setup_ssh.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +set -e + +if [ ! -d ~/.ssh ]; then + mkdir -p ~/.ssh + chmod 700 ~/.ssh +fi + +if [ -n "$SSH_KEY" ]; then + SSH_KEY_ID="$HOME/.ssh/id_ed25519" + echo $SSH_KEY | base64 -d > $SSH_KEY_ID + + chmod 600 $SSH_KEY_ID + + cat >$HOME/.ssh/config <