From e4fa83dd745b4a3f6360ada77bd24984801738a6 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:29:53 -0800 Subject: [PATCH 01/50] Use BC Sans in app --- app/client/src/App.css | 8 ++++++-- app/client/src/App.js | 2 ++ app/client/src/pages/Login.js | 3 --- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/client/src/App.css b/app/client/src/App.css index 40ef6a2..27cd020 100644 --- a/app/client/src/App.css +++ b/app/client/src/App.css @@ -1,11 +1,15 @@ +body, +html { + font-family: var(--typography-font-families-bc-sans, "Arial", sans-serif); +} + .App { text-align: left; - transition: background-color 0.3s, color 0.3s; + transition: background-color 0.3s, color 0.3s; background-color: #ffffff; color: #000000; } - .bcds-header { justify-content: normal !important; } diff --git a/app/client/src/App.js b/app/client/src/App.js index 9e93c40..211d89a 100644 --- a/app/client/src/App.js +++ b/app/client/src/App.js @@ -4,6 +4,8 @@ import Login from "./pages/Login"; import FormList from "./pages/FormList"; import NotAuthorized from "./pages/NotAuthorized"; import { useSSO } from "@bcgov/citz-imb-sso-react"; +import "@bcgov/bc-sans/css/BC_Sans.css"; +import "./App.css" const App = () => { const { isAuthenticated, hasRoles } = useSSO(); diff --git a/app/client/src/pages/Login.js b/app/client/src/pages/Login.js index da61935..ff31675 100644 --- a/app/client/src/pages/Login.js +++ b/app/client/src/pages/Login.js @@ -10,9 +10,6 @@ const Login = () => { if (isAuthenticated) { return ; } - console.log("REACT_APP_SSO_URL:", process.env.REACT_APP_SSO_URL); - console.log("Type of URL:", typeof process.env.REACT_APP_SSO_URL); - console.log("Value of URL:", process.env.REACT_APP_SSO_URL); return (
From 4588bc8634d7d0773b19207f99115df4bcebd74f Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:39:41 -0800 Subject: [PATCH 02/50] Change to use a single .env file --- README.md | 4 ++-- docker-compose.yaml | 4 +--- dockerfile | 5 +++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8374b76..3129a15 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,13 @@ cd template-respository ## Configuration -Copy and rename `.env.example` file to `.env` both in the root and in /app/client: +Copy and rename `.env.example` file to `.env` both in the root: ``` Copy-Item .env.example .env ``` -Update variables in `.env` files with your credentials and congifurations. +Update variables in `.env` file with your credentials and congifurations. ## Docker Deployment diff --git a/docker-compose.yaml b/docker-compose.yaml index 3c5dd76..280b88a 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -9,8 +9,6 @@ services: - db volumes: - .:/usr/src/app - environment: - - NODE_ENV=production restart: always command: > sh -c "npx knex migrate:latest && node index.js" @@ -24,7 +22,7 @@ services: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} ports: - - "5434:5432" + - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data diff --git a/dockerfile b/dockerfile index 2382e74..5e6491a 100644 --- a/dockerfile +++ b/dockerfile @@ -2,6 +2,8 @@ FROM node:16 WORKDIR /usr/app +COPY ./.env ./.env + # Express App COPY ./app/src/package*.json ./src/ RUN npm install --prefix ./src @@ -16,8 +18,8 @@ COPY ./app/client/package-lock.json ./package-lock.json RUN npm install COPY ./app/client/ . -RUN npm run build +RUN cp ../.env .env && npm run build WORKDIR /usr/app/src @@ -26,4 +28,3 @@ ENV APP_PORT=${APP_PORT} EXPOSE ${APP_PORT} CMD ["sh", "-c", "npx knex migrate:latest && node index.js"] - From 235b8d0f3efdb4108660fd95c0b44f45b27eca11 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 11:03:33 -0800 Subject: [PATCH 03/50] Created Helm charts --- helm/Chart.yaml | 6 ++++++ helm/templates/deployment.yaml | 29 +++++++++++++++++++++++++++++ helm/templates/network-policy.yaml | 13 +++++++++++++ helm/templates/service.yaml | 13 +++++++++++++ helm/values.yaml | 21 +++++++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 helm/Chart.yaml create mode 100644 helm/templates/deployment.yaml create mode 100644 helm/templates/network-policy.yaml create mode 100644 helm/templates/service.yaml create mode 100644 helm/values.yaml diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 0000000..c5d25e6 --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: template-repository +description: Helm chart for Template Repository application +type: application +version: 0.1.0 + diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml new file mode 100644 index 0000000..88ede42 --- /dev/null +++ b/helm/templates/deployment.yaml @@ -0,0 +1,29 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "template-repository.name" . }} + labels: + {{- include "template-repository.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ include "template-repository.name" . }} + template: + metadata: + labels: + app: {{ include "template-repository.name" . }} + spec: + containers: + - name: app + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: {{ .Values.app.port }} + resources: + requests: + memory: {{ .Values.resources.requests.memory }} + cpu: {{ .Values.resources.requests.cpu }} + limits: + memory: {{ .Values.resources.limits.memory }} + cpu: {{ .Values.resources.limits.cpu }} diff --git a/helm/templates/network-policy.yaml b/helm/templates/network-policy.yaml new file mode 100644 index 0000000..9c61a14 --- /dev/null +++ b/helm/templates/network-policy.yaml @@ -0,0 +1,13 @@ +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: allow-from-openshift-ingress +spec: + ingress: + - from: + - namespaceSelector: + matchLabels: + network.openshift.io/policy-group: ingress + podSelector: {} + policyTypes: + - Ingress \ No newline at end of file diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml new file mode 100644 index 0000000..c801586 --- /dev/null +++ b/helm/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "template-repository.name" . }} + labels: + {{- include "template-repository.labels" . | nindent 4 }} +spec: + type: ClusterIP + ports: + - port: {{ .Values.app.port }} + targetPort: {{ .Values.app.port }} + selector: + app: {{ include "template-repository.name" . }} diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 0000000..f7584fa --- /dev/null +++ b/helm/values.yaml @@ -0,0 +1,21 @@ +replicaCount: 2 + +image: + repository: ghcr.io/bcgov/template-repository + tag: latest + pullPolicy: Always + +app: + port: 3000 + +ingress: + enabled: true + hostname: template-repository.local + +resources: + requests: + memory: "256Mi" + cpu: "500m" + limits: + memory: "512Mi" + cpu: "1" From 01ca18c284d786c39545ea9e5910f791c37989ae Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 11:38:03 -0800 Subject: [PATCH 04/50] Updated Helm charts --- output.yaml | Bin 0 -> 3282 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 output.yaml diff --git a/output.yaml b/output.yaml new file mode 100644 index 0000000000000000000000000000000000000000..658adcc7c105628a0b1489ac85dcc63841617ba6 GIT binary patch literal 3282 zcmd6pTW`}q5QXO%iT_}Q=cE@@g!+bBB#@v)wCXEz)7+FRc9JSW{B__vyV>|sCvg## zkmbbo&gIO^*_r+Qt7*Dk+6#MSkzL!&mX=t@x^~X{g8zxlZEUf7ZnDxEIJ9X<*C;Jp%LVAzA6pRVB=lC3g!`uD9 z${6nvs{v7DJ%=;08&>ntMD~?0&AGdC-coSZz;{tTwt?1jl6Xg!_1#zj;Oe8XFnOHJs$Xsbjg`DYcz~aY5{=^$4yg zUp_bMn$<2^7-F%H=E&ZXwU(>i5t%q~ag2DMQeoxos^Gbu^Q+uV+-i)hY80cPuMt-9Edqc28*EHmv|{%sp6;A(dO%0I#Tv9KG7u_}uWyq|DQ8R2sv^bs zL%yYPPwyzl5!ny>xvfgx?#*U*l#wfkAHiCz!}D=F1#<%Tw9~sa*<8g`#h%%z&(89G z%ld1`tvYXYm3>#)-=$^cF^luP=>qO8kr9%F+_ww$Qb(_X(*vG;K5uW^h(LXG%QvrkuyF9$Lkj%L=>yJ9GT>50g>Mh&Gd4 zRo`F9x}B?T#pSWQe~P_x_k;)>-Mzbl#8c4t9B8uSXGXBpfkEO^bl6YZl6iE!P5Z$$#$~d@z%%p3Lcj8mGztadF~vx`}3aqfMNl{GpeW`%K=Go|ToyIo#J-$`-VDR|jTgIrmrg#V+l= zedE63B(^Jx;A=&+>ZtzY*PwG~e%|v%^WC5Gc4yR|EV48Bp`1wmyYr?>9g-GC?THD9 sbZ+;%_srhdXOJC=tV1kIr*r1|{ba9(STN!KJ5* Date: Fri, 20 Dec 2024 11:38:07 -0800 Subject: [PATCH 05/50] updated helm charts --- helm/Chart.yaml | 4 ++-- helm/templates/deployment.yaml | 11 +++++++---- helm/templates/service.yaml | 6 +++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index c5d25e6..52bdbb0 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 name: template-repository -description: Helm chart for Template Repository application +description: Helm chart for Template Repository application without helpers file type: application version: 0.1.0 - +appVersion: "1.0.0" diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml index 88ede42..86536c5 100644 --- a/helm/templates/deployment.yaml +++ b/helm/templates/deployment.yaml @@ -1,18 +1,18 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ include "template-repository.name" . }} + name: {{ .Release.Name }} labels: - {{- include "template-repository.labels" . | nindent 4 }} + app: {{ .Release.Name }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: - app: {{ include "template-repository.name" . }} + app: {{ .Release.Name }} template: metadata: labels: - app: {{ include "template-repository.name" . }} + app: {{ .Release.Name }} spec: containers: - name: app @@ -20,6 +20,9 @@ spec: imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - containerPort: {{ .Values.app.port }} + env: + - name: NODE_ENV + value: "production" resources: requests: memory: {{ .Values.resources.requests.memory }} diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml index c801586..f66e8c9 100644 --- a/helm/templates/service.yaml +++ b/helm/templates/service.yaml @@ -1,13 +1,13 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "template-repository.name" . }} + name: {{ .Release.Name }} labels: - {{- include "template-repository.labels" . | nindent 4 }} + app: {{ .Release.Name }} spec: type: ClusterIP ports: - port: {{ .Values.app.port }} targetPort: {{ .Values.app.port }} selector: - app: {{ include "template-repository.name" . }} + app: {{ .Release.Name }} From 67749695942dabb64a28207ffbafc0d858d0681f Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 11:54:10 -0800 Subject: [PATCH 06/50] Helm chart will use dockerfile --- helm/values.yaml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/helm/values.yaml b/helm/values.yaml index f7584fa..274b6a8 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -5,6 +5,33 @@ image: tag: latest pullPolicy: Always +deploy: + replicas: 1 + applicationProperties: + enabled: false + mountPath: /deployments/config/ + properties: '## Properties go here' + livenessProbe: + httpGet: + path: / + port: 3000 + readinessProbe: + httpGet: + path: / + port: 3000 + ports: + - name: http + port: 3000 + protocol: TCP + targetPort: 3000 + route: + enabled: true + targetPort: http + tls: + enabled: true + insecureEdgeTerminationPolicy: Redirect + termination: edge + serviceType: ClusterIP app: port: 3000 From 6ea308dd2752112e4387cfbc9bc84ad0af0ac79b Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:06:12 -0800 Subject: [PATCH 07/50] dockerfile for openshift --- dockerfile-openshift | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dockerfile-openshift diff --git a/dockerfile-openshift b/dockerfile-openshift new file mode 100644 index 0000000..53ef224 --- /dev/null +++ b/dockerfile-openshift @@ -0,0 +1,30 @@ +FROM node:16 + +WORKDIR /usr/app + +# Express App +COPY ./app/src/package*.json ./src/ +RUN npm install --prefix ./src + +COPY ./app/src ./src + +# React App +WORKDIR /usr/app/client + +COPY ./app/client/package*.json ./package.json +COPY ./app/client/package-lock.json ./package-lock.json +RUN npm install + +COPY ./app/client/ . + +RUN npm run build + +WORKDIR /usr/app/src + +# Environment Variables +ARG APP_PORT +ENV APP_PORT=${APP_PORT} +EXPOSE ${APP_PORT} + +# Migrate the database and start the Node.js server +CMD ["sh", "-c", "npx knex migrate:latest && node index.js"] From a0c5927b95943a01869fa7fc227790916f5a176c Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:31:36 -0800 Subject: [PATCH 08/50] Updated node version --- dockerfile | 2 +- dockerfile-openshift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerfile b/dockerfile index 5e6491a..e9cc1c1 100644 --- a/dockerfile +++ b/dockerfile @@ -1,4 +1,4 @@ -FROM node:16 +FROM node:18 WORKDIR /usr/app diff --git a/dockerfile-openshift b/dockerfile-openshift index 53ef224..05595ea 100644 --- a/dockerfile-openshift +++ b/dockerfile-openshift @@ -1,4 +1,4 @@ -FROM node:16 +FROM node:18 WORKDIR /usr/app From 703c3a2549ac3ec95630ad0fc7e32c9313fd50c0 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:46:58 -0800 Subject: [PATCH 09/50] Create deployment-dev.yml --- .github/workflows/deployment-dev.yml | 72 ++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 .github/workflows/deployment-dev.yml diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml new file mode 100644 index 0000000..b152efc --- /dev/null +++ b/.github/workflows/deployment-dev.yml @@ -0,0 +1,72 @@ +name: Build and Deploy to DEV + +on: + push: + branches: + - dev + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build_and_push: + runs-on: ubuntu-latest + + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + outputs: + image_tag: ${{ steps.meta.outputs.tags }} + + deploy_dev: + needs: build_and_push + runs-on: ubuntu-latest + + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Install oc CLI + uses: redhat-actions/oc-installer@v1 + + - name: Authenticate with OpenShift (DEV) + uses: redhat-actions/oc-login@v1 + with: + openshift_server_url: ${{ secrets.OPENSHIFT_SERVER }} + namespace: ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} + openshift_token: ${{ secrets.OPENSHIFT_DEV_TOKEN }} + insecure_skip_tls_verify: true + + - name: Deploy with Helm + run: | + helm upgrade --install template-repository ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }} + + - name: Trigger OpenShift Rollout + run: | + oc rollout restart deployment/template-repository -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} From ecff46c52dae3a9a54733251d89c4975c960deb7 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:53:26 -0800 Subject: [PATCH 10/50] added postgres helm charts --- .env.example | 5 +++ helm/Chart.yaml | 6 --- helm/app/Chart.yaml | 7 ++++ helm/app/templates/deployment.yaml | 37 +++++++++++++++++ helm/app/templates/service.yaml | 11 ++++++ helm/app/values.yaml | 10 +++++ helm/postgresql/Chart.yaml | 3 ++ helm/postgresql/templates/deployment.yaml | 24 ++++++++++++ helm/postgresql/templates/service.yaml | 11 ++++++ helm/postgresql/values.yaml | 8 ++++ helm/templates/deployment.yaml | 2 +- helm/templates/network-policy.yaml | 13 ------ helm/templates/service.yaml | 13 ------ helm/values.yaml | 48 ----------------------- 14 files changed, 117 insertions(+), 81 deletions(-) delete mode 100644 helm/Chart.yaml create mode 100644 helm/app/Chart.yaml create mode 100644 helm/app/templates/deployment.yaml create mode 100644 helm/app/templates/service.yaml create mode 100644 helm/app/values.yaml create mode 100644 helm/postgresql/Chart.yaml create mode 100644 helm/postgresql/templates/deployment.yaml create mode 100644 helm/postgresql/templates/service.yaml create mode 100644 helm/postgresql/values.yaml delete mode 100644 helm/templates/network-policy.yaml delete mode 100644 helm/templates/service.yaml delete mode 100644 helm/values.yaml diff --git a/.env.example b/.env.example index 520e1c4..6c2783c 100644 --- a/.env.example +++ b/.env.example @@ -2,6 +2,11 @@ FRONTEND_URL=http://localhost:3000 BACKEND_URL=http://localhost:3000 APP_PORT=3000 +REACT_APP_ENV=dev +REACT_APP_SSO_URL=http://localhost:3000 +REACT_APP_KILN_PREVIEW_URL=http://localhost:4173/preview +REACT_APP_KILN_URL=http://localhost:4173 + POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_DB=form_templates diff --git a/helm/Chart.yaml b/helm/Chart.yaml deleted file mode 100644 index 52bdbb0..0000000 --- a/helm/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -name: template-repository -description: Helm chart for Template Repository application without helpers file -type: application -version: 0.1.0 -appVersion: "1.0.0" diff --git a/helm/app/Chart.yaml b/helm/app/Chart.yaml new file mode 100644 index 0000000..b2c0386 --- /dev/null +++ b/helm/app/Chart.yaml @@ -0,0 +1,7 @@ +apiVersion: v2 +name: app +version: 0.1.0 +dependencies: + - name: postgresql + version: 0.1.0 + repository: file://../postgresql diff --git a/helm/app/templates/deployment.yaml b/helm/app/templates/deployment.yaml new file mode 100644 index 0000000..12a48e8 --- /dev/null +++ b/helm/app/templates/deployment.yaml @@ -0,0 +1,37 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-app +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-app + template: + metadata: + labels: + app: {{ .Release.Name }}-app + spec: + containers: + - name: app + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + ports: + - containerPort: {{ .Values.env.APP_PORT }} + envFrom: + - configMapRef: + name: {{ .Values.configMapName }} + - secretRef: + name: {{ .Values.secretName }} + volumeMounts: + - name: env-volume + mountPath: /usr/app/.env + subPath: .env + command: + - sh + - -c + - | + cp /usr/app/.env ../client/.env && npm run build && npx knex migrate:latest && node index.js + volumes: + - name: env-volume + configMap: + name: {{ .Values.configMapName }} diff --git a/helm/app/templates/service.yaml b/helm/app/templates/service.yaml new file mode 100644 index 0000000..48a18a0 --- /dev/null +++ b/helm/app/templates/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-app +spec: + type: ClusterIP + ports: + - port: 3000 + targetPort: 3000 + selector: + app: {{ .Release.Name }}-app diff --git a/helm/app/values.yaml b/helm/app/values.yaml new file mode 100644 index 0000000..b32a471 --- /dev/null +++ b/helm/app/values.yaml @@ -0,0 +1,10 @@ +configMapName: template-repo-config +secretName: template-repo-app-secrets + +image: + repository: my-app-image + tag: latest + +env: + APP_PORT: 3000 + REACT_APP_ENV: dev diff --git a/helm/postgresql/Chart.yaml b/helm/postgresql/Chart.yaml new file mode 100644 index 0000000..a02b4f6 --- /dev/null +++ b/helm/postgresql/Chart.yaml @@ -0,0 +1,3 @@ +apiVersion: v2 +name: postgresql +version: 0.1.0 diff --git a/helm/postgresql/templates/deployment.yaml b/helm/postgresql/templates/deployment.yaml new file mode 100644 index 0000000..8e9b19f --- /dev/null +++ b/helm/postgresql/templates/deployment.yaml @@ -0,0 +1,24 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-postgresql +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-postgresql + template: + metadata: + labels: + app: {{ .Release.Name }}-postgresql + spec: + containers: + - name: postgresql + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + env: + - name: POSTGRES_USER + value: {{ .Values.postgresql.username }} + - name: POSTGRES_PASSWORD + value: {{ .Values.postgresql.password }} + - name: POSTGRES_DB + value: {{ .Values.postgresql.database }} diff --git a/helm/postgresql/templates/service.yaml b/helm/postgresql/templates/service.yaml new file mode 100644 index 0000000..21e5863 --- /dev/null +++ b/helm/postgresql/templates/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-postgresql +spec: + type: ClusterIP + ports: + - port: 5432 + targetPort: 5432 + selector: + app: {{ .Release.Name }}-postgresql diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml new file mode 100644 index 0000000..bd4d73b --- /dev/null +++ b/helm/postgresql/values.yaml @@ -0,0 +1,8 @@ +image: + repository: postgres + tag: 13 + +postgresql: + username: postgres + password: postgres + database: form_templates diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml index 86536c5..a8f727e 100644 --- a/helm/templates/deployment.yaml +++ b/helm/templates/deployment.yaml @@ -22,7 +22,7 @@ spec: - containerPort: {{ .Values.app.port }} env: - name: NODE_ENV - value: "production" + value: "dev" resources: requests: memory: {{ .Values.resources.requests.memory }} diff --git a/helm/templates/network-policy.yaml b/helm/templates/network-policy.yaml deleted file mode 100644 index 9c61a14..0000000 --- a/helm/templates/network-policy.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: allow-from-openshift-ingress -spec: - ingress: - - from: - - namespaceSelector: - matchLabels: - network.openshift.io/policy-group: ingress - podSelector: {} - policyTypes: - - Ingress \ No newline at end of file diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml deleted file mode 100644 index f66e8c9..0000000 --- a/helm/templates/service.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Release.Name }} - labels: - app: {{ .Release.Name }} -spec: - type: ClusterIP - ports: - - port: {{ .Values.app.port }} - targetPort: {{ .Values.app.port }} - selector: - app: {{ .Release.Name }} diff --git a/helm/values.yaml b/helm/values.yaml deleted file mode 100644 index 274b6a8..0000000 --- a/helm/values.yaml +++ /dev/null @@ -1,48 +0,0 @@ -replicaCount: 2 - -image: - repository: ghcr.io/bcgov/template-repository - tag: latest - pullPolicy: Always - -deploy: - replicas: 1 - applicationProperties: - enabled: false - mountPath: /deployments/config/ - properties: '## Properties go here' - livenessProbe: - httpGet: - path: / - port: 3000 - readinessProbe: - httpGet: - path: / - port: 3000 - ports: - - name: http - port: 3000 - protocol: TCP - targetPort: 3000 - route: - enabled: true - targetPort: http - tls: - enabled: true - insecureEdgeTerminationPolicy: Redirect - termination: edge - serviceType: ClusterIP -app: - port: 3000 - -ingress: - enabled: true - hostname: template-repository.local - -resources: - requests: - memory: "256Mi" - cpu: "500m" - limits: - memory: "512Mi" - cpu: "1" From cfe4f36fe29227e32864a3d46ec081c92057e443 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:57:37 -0800 Subject: [PATCH 11/50] added github action --- .github/workflows/deployment-dev.yml | 72 ++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 .github/workflows/deployment-dev.yml diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml new file mode 100644 index 0000000..b152efc --- /dev/null +++ b/.github/workflows/deployment-dev.yml @@ -0,0 +1,72 @@ +name: Build and Deploy to DEV + +on: + push: + branches: + - dev + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build_and_push: + runs-on: ubuntu-latest + + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + outputs: + image_tag: ${{ steps.meta.outputs.tags }} + + deploy_dev: + needs: build_and_push + runs-on: ubuntu-latest + + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Install oc CLI + uses: redhat-actions/oc-installer@v1 + + - name: Authenticate with OpenShift (DEV) + uses: redhat-actions/oc-login@v1 + with: + openshift_server_url: ${{ secrets.OPENSHIFT_SERVER }} + namespace: ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} + openshift_token: ${{ secrets.OPENSHIFT_DEV_TOKEN }} + insecure_skip_tls_verify: true + + - name: Deploy with Helm + run: | + helm upgrade --install template-repository ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }} + + - name: Trigger OpenShift Rollout + run: | + oc rollout restart deployment/template-repository -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} From 99b584a0da8cb7abab2928b74ec4151981ec1943 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:04:07 -0800 Subject: [PATCH 12/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index b152efc..d6e2f64 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -40,6 +40,8 @@ jobs: push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + build-args: | + APP_PORT=${{ secrets.APP_PORT }} outputs: image_tag: ${{ steps.meta.outputs.tags }} From 58a3ebe04ee187012e314e4823524377fc03633f Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:05:47 -0800 Subject: [PATCH 13/50] updated dockerfiles for Github Actions --- dockerfile | 8 +++----- dockerfile-openshift => dockerfile-local | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) rename dockerfile-openshift => dockerfile-local (82%) diff --git a/dockerfile b/dockerfile index e9cc1c1..416bc66 100644 --- a/dockerfile +++ b/dockerfile @@ -2,15 +2,13 @@ FROM node:18 WORKDIR /usr/app -COPY ./.env ./.env - -# Express App +#Express app COPY ./app/src/package*.json ./src/ RUN npm install --prefix ./src COPY ./app/src ./src -# React App +#React app WORKDIR /usr/app/client COPY ./app/client/package*.json ./package.json @@ -19,7 +17,7 @@ RUN npm install COPY ./app/client/ . -RUN cp ../.env .env && npm run build +RUN npm run build WORKDIR /usr/app/src diff --git a/dockerfile-openshift b/dockerfile-local similarity index 82% rename from dockerfile-openshift rename to dockerfile-local index 05595ea..e9cc1c1 100644 --- a/dockerfile-openshift +++ b/dockerfile-local @@ -2,6 +2,8 @@ FROM node:18 WORKDIR /usr/app +COPY ./.env ./.env + # Express App COPY ./app/src/package*.json ./src/ RUN npm install --prefix ./src @@ -17,14 +19,12 @@ RUN npm install COPY ./app/client/ . -RUN npm run build +RUN cp ../.env .env && npm run build WORKDIR /usr/app/src -# Environment Variables ARG APP_PORT ENV APP_PORT=${APP_PORT} EXPOSE ${APP_PORT} -# Migrate the database and start the Node.js server CMD ["sh", "-c", "npx knex migrate:latest && node index.js"] From 8564a5a658a0f818c470e7f276b6e23183e8f7f3 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:15:13 -0800 Subject: [PATCH 14/50] Added postgres dependency --- helm/app/Chart.lock | 6 ++++++ helm/app/charts/postgresql-0.1.0.tgz | Bin 0 -> 630 bytes 2 files changed, 6 insertions(+) create mode 100644 helm/app/Chart.lock create mode 100644 helm/app/charts/postgresql-0.1.0.tgz diff --git a/helm/app/Chart.lock b/helm/app/Chart.lock new file mode 100644 index 0000000..fe24a76 --- /dev/null +++ b/helm/app/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: postgresql + repository: file://../postgresql + version: 0.1.0 +digest: sha256:7e4ef9dc694d5152e394135dfcaf1fa9fe6fc369f1a094f5586df6409e833cb5 +generated: "2024-12-20T14:13:21.3268297-08:00" diff --git a/helm/app/charts/postgresql-0.1.0.tgz b/helm/app/charts/postgresql-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8bdf521fe9c357ffb4c6e6ca7743b9a8f65775d8 GIT binary patch literal 630 zcmV-+0*U<}iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PI&yZ<|06^%;r(Fv>k-0UM;fwQ*Ecsv66*=`ot%se`(Fbazc< zMf~>)9Lz@}ktnX+58eeaW4|5nyf@=4ReCK+eHRy(_b9cs#aK)Z3&t4prqk-m80%jd zoB0!a>bthm;*miy5abcf^6w(tnO(L+Upez>xkO=JfUNIkQp!$3PV0nz(5INXk+b=~QkT11RGf z*BoruG)$vumg*ZDMY3xcWi&&jex!2MjjmAR9V+7RHI?zLrZ^L*%iO8o!2gYw{`bGh z#fmbKZevOgvknaC-*)`I{=Jz!9rb?V~bE+BKFCUDjvw0_LCUUsStcDs}Cm=hYpD+0=Dv7tkozq!*odZ(cmh!%zKIM~oOT;?Kv= Q00030{}>7az5o^g06WPo>i_@% literal 0 HcmV?d00001 From 94e0d1c08f090501c13855b5a8925da2674150a1 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:27:14 -0800 Subject: [PATCH 15/50] Update app image name in helm chart --- helm/app/values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/app/values.yaml b/helm/app/values.yaml index b32a471..ae21ba1 100644 --- a/helm/app/values.yaml +++ b/helm/app/values.yaml @@ -2,8 +2,8 @@ configMapName: template-repo-config secretName: template-repo-app-secrets image: - repository: my-app-image - tag: latest + repository: ghcr.io/bcgov/template-repository + tag: dev env: APP_PORT: 3000 From 8284674db16038afb7c65c2139b7942afa950468 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:37:00 -0800 Subject: [PATCH 16/50] Helm chart updates --- helm/postgresql/values.yaml | 3 +++ helm/templates/deployment.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index bd4d73b..2cca430 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -6,3 +6,6 @@ postgresql: username: postgres password: postgres database: form_templates + +volumePermissions: + enabled: true \ No newline at end of file diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml index a8f727e..cc019b4 100644 --- a/helm/templates/deployment.yaml +++ b/helm/templates/deployment.yaml @@ -1,7 +1,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ .Release.Name }} + name: {{ .Release.Name }}-app labels: app: {{ .Release.Name }} spec: From 3726a27e94fb0860f8a1217bae46de13be8887a5 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:48:51 -0800 Subject: [PATCH 17/50] Removed generic deployment --- helm/postgresql/values.yaml | 5 +++-- helm/templates/deployment.yaml | 32 -------------------------------- 2 files changed, 3 insertions(+), 34 deletions(-) delete mode 100644 helm/templates/deployment.yaml diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index 2cca430..360a42d 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -7,5 +7,6 @@ postgresql: password: postgres database: form_templates -volumePermissions: - enabled: true \ No newline at end of file +postgresql: + volumePermissions: + enabled: true \ No newline at end of file diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml deleted file mode 100644 index cc019b4..0000000 --- a/helm/templates/deployment.yaml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Release.Name }}-app - labels: - app: {{ .Release.Name }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - app: {{ .Release.Name }} - template: - metadata: - labels: - app: {{ .Release.Name }} - spec: - containers: - - name: app - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - containerPort: {{ .Values.app.port }} - env: - - name: NODE_ENV - value: "dev" - resources: - requests: - memory: {{ .Values.resources.requests.memory }} - cpu: {{ .Values.resources.requests.cpu }} - limits: - memory: {{ .Values.resources.limits.memory }} - cpu: {{ .Values.resources.limits.cpu }} From 9a25047c8ef5081f74492a2f87f02d90e6728566 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:59:58 -0800 Subject: [PATCH 18/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index d6e2f64..0bbccb7 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -71,4 +71,4 @@ jobs: - name: Trigger OpenShift Rollout run: | - oc rollout restart deployment/template-repository -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} + oc rollout restart deployment/template-repository-app -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} From 0fbedc7ce673e02e5f49c1b7bf37c67e307d54c3 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:15:01 -0800 Subject: [PATCH 19/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index 0bbccb7..d40dc16 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -67,7 +67,7 @@ jobs: - name: Deploy with Helm run: | - helm upgrade --install template-repository ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }} + helm upgrade --install template-repository-app ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }} - name: Trigger OpenShift Rollout run: | From 1ca5bf8e8172b0bf988f5cf435fdc9a39effa5e8 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:15:30 -0800 Subject: [PATCH 20/50] Updated postgres helm permissions --- helm/postgresql/values.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index 360a42d..f7e99de 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -7,6 +7,12 @@ postgresql: password: postgres database: form_templates -postgresql: volumePermissions: - enabled: true \ No newline at end of file + enabled: true + + persistence: + enabled: true + size: 512Mi + accessModes: + - ReadWriteOnce + mountPath: /var/lib/postgresql/data \ No newline at end of file From ee367d069f05652ea36258bb93c873fb2a764c69 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:30:14 -0800 Subject: [PATCH 21/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index d40dc16..0b13784 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -67,7 +67,12 @@ jobs: - name: Deploy with Helm run: | - helm upgrade --install template-repository-app ./helm/app --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} --set image.tag=${{ needs.build_and_push.outputs.image_tag }} + helm upgrade --install template-repository ./helm/app \ + --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} \ + --set app.image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ + --set app.image.tag=${{ needs.build_and_push.outputs.image_tag }} \ + --set postgresql.image.repository=postgres \ + --set postgresql.image.tag=13 - name: Trigger OpenShift Rollout run: | From 9a1cc2da21605c7f7ae90375c2e09c05fa03a8ea Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:38:33 -0800 Subject: [PATCH 22/50] updated app deployment --- helm/app/templates/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/app/templates/deployment.yaml b/helm/app/templates/deployment.yaml index 12a48e8..cc04910 100644 --- a/helm/app/templates/deployment.yaml +++ b/helm/app/templates/deployment.yaml @@ -30,7 +30,7 @@ spec: - sh - -c - | - cp /usr/app/.env ../client/.env && npm run build && npx knex migrate:latest && node index.js + npm run build && npx knex migrate:latest && node index.js volumes: - name: env-volume configMap: From 7628c8f7fb19cad8782916efbdb8f8b5a31942b7 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:51:07 -0800 Subject: [PATCH 23/50] updated app deployment --- helm/app/templates/deployment.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/app/templates/deployment.yaml b/helm/app/templates/deployment.yaml index cc04910..111b8c9 100644 --- a/helm/app/templates/deployment.yaml +++ b/helm/app/templates/deployment.yaml @@ -24,13 +24,13 @@ spec: name: {{ .Values.secretName }} volumeMounts: - name: env-volume - mountPath: /usr/app/.env + mountPath: /usr/app/client/.env subPath: .env command: - sh - -c - | - npm run build && npx knex migrate:latest && node index.js + npx knex migrate:latest && node index.js volumes: - name: env-volume configMap: From 9f6e92726e7a9ff02198914ee50fd290fc1c9602 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:06:31 -0800 Subject: [PATCH 24/50] updated db config --- helm/app/Chart.lock | 6 ------ helm/app/Chart.yaml | 4 ++-- helm/app/charts/postgresql-0.1.0.tgz | Bin 630 -> 0 bytes helm/postgresql/values.yaml | 4 +--- 4 files changed, 3 insertions(+), 11 deletions(-) delete mode 100644 helm/app/Chart.lock delete mode 100644 helm/app/charts/postgresql-0.1.0.tgz diff --git a/helm/app/Chart.lock b/helm/app/Chart.lock deleted file mode 100644 index fe24a76..0000000 --- a/helm/app/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: postgresql - repository: file://../postgresql - version: 0.1.0 -digest: sha256:7e4ef9dc694d5152e394135dfcaf1fa9fe6fc369f1a094f5586df6409e833cb5 -generated: "2024-12-20T14:13:21.3268297-08:00" diff --git a/helm/app/Chart.yaml b/helm/app/Chart.yaml index b2c0386..03c24d8 100644 --- a/helm/app/Chart.yaml +++ b/helm/app/Chart.yaml @@ -3,5 +3,5 @@ name: app version: 0.1.0 dependencies: - name: postgresql - version: 0.1.0 - repository: file://../postgresql + version: 12.1.12 + repository: https://charts.bitnami.com/bitnami \ No newline at end of file diff --git a/helm/app/charts/postgresql-0.1.0.tgz b/helm/app/charts/postgresql-0.1.0.tgz deleted file mode 100644 index 8bdf521fe9c357ffb4c6e6ca7743b9a8f65775d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmV-+0*U<}iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PI&yZ<|06^%;r(Fv>k-0UM;fwQ*Ecsv66*=`ot%se`(Fbazc< zMf~>)9Lz@}ktnX+58eeaW4|5nyf@=4ReCK+eHRy(_b9cs#aK)Z3&t4prqk-m80%jd zoB0!a>bthm;*miy5abcf^6w(tnO(L+Upez>xkO=JfUNIkQp!$3PV0nz(5INXk+b=~QkT11RGf z*BoruG)$vumg*ZDMY3xcWi&&jex!2MjjmAR9V+7RHI?zLrZ^L*%iO8o!2gYw{`bGh z#fmbKZevOgvknaC-*)`I{=Jz!9rb?V~bE+BKFCUDjvw0_LCUUsStcDs}Cm=hYpD+0=Dv7tkozq!*odZ(cmh!%zKIM~oOT;?Kv= Q00030{}>7az5o^g06WPo>i_@% diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index f7e99de..300606f 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -13,6 +13,4 @@ postgresql: persistence: enabled: true size: 512Mi - accessModes: - - ReadWriteOnce - mountPath: /var/lib/postgresql/data \ No newline at end of file + storageClass: "standard" \ No newline at end of file From 643688e05777a2955985c4832b1693c599263b64 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:13:30 -0800 Subject: [PATCH 25/50] updated helm dependencies --- helm/app/Chart.lock | 6 ++++++ helm/app/charts/postgresql-12.1.12.tgz | Bin 0 -> 58108 bytes 2 files changed, 6 insertions(+) create mode 100644 helm/app/Chart.lock create mode 100644 helm/app/charts/postgresql-12.1.12.tgz diff --git a/helm/app/Chart.lock b/helm/app/Chart.lock new file mode 100644 index 0000000..f90d5ab --- /dev/null +++ b/helm/app/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: postgresql + repository: https://charts.bitnami.com/bitnami + version: 12.1.12 +digest: sha256:76ed64f7f84ec9a8f0c07a2bb08ef21785a78c829c9b2e3a3f24937c16d3f905 +generated: "2024-12-20T16:13:05.307033-08:00" diff --git a/helm/app/charts/postgresql-12.1.12.tgz b/helm/app/charts/postgresql-12.1.12.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1a25b58d514ea82fb316c61075b3aded125ecd47 GIT binary patch literal 58108 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 Date: Fri, 20 Dec 2024 16:24:04 -0800 Subject: [PATCH 26/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index 0b13784..6f3ca74 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -65,10 +65,17 @@ jobs: openshift_token: ${{ secrets.OPENSHIFT_DEV_TOKEN }} insecure_skip_tls_verify: true + - name: Retrieve PostgreSQL Password + id: get-postgres-password + run: | + export POSTGRES_PASSWORD=$(kubectl get secret --namespace "$NAMESPACE" template-repository-postgresql -o jsonpath="{.data.postgres-password}" | base64 -d) + echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $GITHUB_ENV + - name: Deploy with Helm run: | helm upgrade --install template-repository ./helm/app \ --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} \ + --set global.postgresql.auth.postgresPassword=$POSTGRES_PASSWORD \ --set app.image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ --set app.image.tag=${{ needs.build_and_push.outputs.image_tag }} \ --set postgresql.image.repository=postgres \ From a22fd0dba811596b12de496ada970be867e0db8c Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:31:08 -0800 Subject: [PATCH 27/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index 6f3ca74..8b1266b 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -68,7 +68,7 @@ jobs: - name: Retrieve PostgreSQL Password id: get-postgres-password run: | - export POSTGRES_PASSWORD=$(kubectl get secret --namespace "$NAMESPACE" template-repository-postgresql -o jsonpath="{.data.postgres-password}" | base64 -d) + export POSTGRES_PASSWORD=$(kubectl get secret --namespace "$NAMESPACE" template-repo-app-secrets -o jsonpath="{.data.postgres-password}" | base64 -d) echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $GITHUB_ENV - name: Deploy with Helm From 5405dfb56c595860c24995ce8f02c75a0db79e6f Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:15:02 -0800 Subject: [PATCH 28/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index 8b1266b..b42755d 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -72,6 +72,8 @@ jobs: echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $GITHUB_ENV - name: Deploy with Helm + env: + POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }} run: | helm upgrade --install template-repository ./helm/app \ --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} \ From dd48d99789100b5874088912f9658d79e60ff869 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:28:44 -0800 Subject: [PATCH 29/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index b42755d..e1f5217 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -68,7 +68,7 @@ jobs: - name: Retrieve PostgreSQL Password id: get-postgres-password run: | - export POSTGRES_PASSWORD=$(kubectl get secret --namespace "$NAMESPACE" template-repo-app-secrets -o jsonpath="{.data.postgres-password}" | base64 -d) + export POSTGRES_PASSWORD=$(kubectl get secret --namespace "${{ secrets.OPENSHIFT_DEV_NAMESPACE }}" template-repo-app-secrets -o jsonpath="{.data.POSTGRES_PASSWORD}" | base64 -d) echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $GITHUB_ENV - name: Deploy with Helm From fb1b088c382dd127069e973380f650f55e7069d8 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:38:53 -0800 Subject: [PATCH 30/50] Update values.yaml --- helm/postgresql/values.yaml | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index 300606f..480351e 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -1,16 +1,24 @@ -image: - repository: postgres - tag: 13 +persistence: + enabled: true + size: 1Gi -postgresql: - username: postgres - password: postgres - database: form_templates - - volumePermissions: - enabled: true +resources: + requests: + storage: 1Gi +postgresql: persistence: enabled: true - size: 512Mi - storageClass: "standard" \ No newline at end of file + size: 1Gi + resources: + requests: + storage: 1Gi + +volumeClaimTemplates: +- metadata: + name: data + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi From 0c9f059a4b88b8892773675edb3b6b96d4b7314c Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:46:36 -0800 Subject: [PATCH 31/50] Update yaml files --- helm/app/values.yaml | 8 ++++++++ helm/postgresql/templates/statefulset.yaml | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 helm/postgresql/templates/statefulset.yaml diff --git a/helm/app/values.yaml b/helm/app/values.yaml index ae21ba1..54d6009 100644 --- a/helm/app/values.yaml +++ b/helm/app/values.yaml @@ -8,3 +8,11 @@ image: env: APP_PORT: 3000 REACT_APP_ENV: dev + +postgresql: + persistence: + enabled: true + size: 1Gi + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/helm/postgresql/templates/statefulset.yaml b/helm/postgresql/templates/statefulset.yaml new file mode 100644 index 0000000..a9eab5f --- /dev/null +++ b/helm/postgresql/templates/statefulset.yaml @@ -0,0 +1,8 @@ +volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: {{ .Values.persistence.size }} From e7600589be986cc4fedd46bd735313b544b448f1 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:57:36 -0800 Subject: [PATCH 32/50] update yamls --- helm/postgresql/templates/service.yaml | 9 ++++- helm/postgresql/templates/statefulset.yaml | 45 ++++++++++++++++++---- helm/postgresql/values.yaml | 13 +------ 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/helm/postgresql/templates/service.yaml b/helm/postgresql/templates/service.yaml index 21e5863..2c51ae8 100644 --- a/helm/postgresql/templates/service.yaml +++ b/helm/postgresql/templates/service.yaml @@ -2,10 +2,15 @@ apiVersion: v1 kind: Service metadata: name: {{ .Release.Name }}-postgresql + labels: + app.kubernetes.io/name: postgresql + app.kubernetes.io/instance: {{ .Release.Name }} spec: type: ClusterIP ports: - - port: 5432 + - name: postgresql + port: 5432 targetPort: 5432 selector: - app: {{ .Release.Name }}-postgresql + app.kubernetes.io/name: postgresql + app.kubernetes.io/instance: {{ .Release.Name }} diff --git a/helm/postgresql/templates/statefulset.yaml b/helm/postgresql/templates/statefulset.yaml index a9eab5f..54cf86f 100644 --- a/helm/postgresql/templates/statefulset.yaml +++ b/helm/postgresql/templates/statefulset.yaml @@ -1,8 +1,39 @@ -volumeClaimTemplates: - - metadata: - name: data +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Release.Name }}-postgresql + labels: + app.kubernetes.io/name: postgresql + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + serviceName: {{ .Release.Name }}-postgresql-hl + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: postgresql + app.kubernetes.io/instance: {{ .Release.Name }} + template: + metadata: + labels: + app.kubernetes.io/name: postgresql + app.kubernetes.io/instance: {{ .Release.Name }} spec: - accessModes: ["ReadWriteOnce"] - resources: - requests: - storage: {{ .Values.persistence.size }} + containers: + - name: postgresql + image: postgres:13 + ports: + - containerPort: 5432 + resources: + requests: + storage: {{ .Values.postgresql.resources.requests.storage }} + volumeMounts: + - name: data + mountPath: /bitnami/postgresql + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: {{ .Values.postgresql.persistence.size }} diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index 480351e..fa855e3 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -9,16 +9,7 @@ resources: postgresql: persistence: enabled: true - size: 1Gi + size: 1Gi resources: requests: - storage: 1Gi - -volumeClaimTemplates: -- metadata: - name: data - spec: - accessModes: ["ReadWriteOnce"] - resources: - requests: - storage: 1Gi + storage: 1Gi From e2b5e8f17d122edfb04b9cfefcce23e73a39e9fb Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 10:06:49 -0800 Subject: [PATCH 33/50] updated yamls --- helm/app/values.yaml | 7 ----- helm/postgresql/templates/service.yaml | 4 +-- helm/postgresql/templates/statefulset.yaml | 23 ++++++++++------ helm/postgresql/values.yaml | 32 ++++++++++++++-------- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/helm/app/values.yaml b/helm/app/values.yaml index 54d6009..d36d55a 100644 --- a/helm/app/values.yaml +++ b/helm/app/values.yaml @@ -9,10 +9,3 @@ env: APP_PORT: 3000 REACT_APP_ENV: dev -postgresql: - persistence: - enabled: true - size: 1Gi - resources: - requests: - storage: 1Gi \ No newline at end of file diff --git a/helm/postgresql/templates/service.yaml b/helm/postgresql/templates/service.yaml index 2c51ae8..0b7e613 100644 --- a/helm/postgresql/templates/service.yaml +++ b/helm/postgresql/templates/service.yaml @@ -1,12 +1,12 @@ apiVersion: v1 kind: Service metadata: - name: {{ .Release.Name }}-postgresql + name: {{ .Release.Name }}-postgresql-hl labels: app.kubernetes.io/name: postgresql app.kubernetes.io/instance: {{ .Release.Name }} spec: - type: ClusterIP + clusterIP: None ports: - name: postgresql port: 5432 diff --git a/helm/postgresql/templates/statefulset.yaml b/helm/postgresql/templates/statefulset.yaml index 54cf86f..ee62418 100644 --- a/helm/postgresql/templates/statefulset.yaml +++ b/helm/postgresql/templates/statefulset.yaml @@ -7,7 +7,7 @@ metadata: app.kubernetes.io/instance: {{ .Release.Name }} spec: serviceName: {{ .Release.Name }}-postgresql-hl - replicas: 1 + replicas: {{ .Values.replicaCount }} selector: matchLabels: app.kubernetes.io/name: postgresql @@ -20,20 +20,27 @@ spec: spec: containers: - name: postgresql - image: postgres:13 + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - containerPort: 5432 - resources: - requests: - storage: {{ .Values.postgresql.resources.requests.storage }} + name: postgresql + env: + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-postgresql + key: postgres-password volumeMounts: - name: data - mountPath: /bitnami/postgresql + mountPath: /var/lib/postgresql/data + securityContext: + fsGroup: 1001 volumeClaimTemplates: - metadata: name: data spec: - accessModes: ["ReadWriteOnce"] + accessModes: {{ .Values.persistence.accessModes }} resources: requests: - storage: {{ .Values.postgresql.persistence.size }} + storage: {{ .Values.persistence.size }} diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index fa855e3..4a62552 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -1,15 +1,25 @@ +replicaCount: 1 + +image: + repository: postgres + tag: "13" + pullPolicy: IfNotPresent + +resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "512Mi" + cpu: "500m" + persistence: enabled: true size: 1Gi + accessModes: + - ReadWriteOnce -resources: - requests: - storage: 1Gi - -postgresql: - persistence: - enabled: true - size: 1Gi - resources: - requests: - storage: 1Gi +service: + type: ClusterIP + port: 5432 + headless: true From 4d494a2a424344ee0638e3c787240ac602298c00 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 10:23:29 -0800 Subject: [PATCH 34/50] updated yamls --- helm/postgresql/templates/deployment.yaml | 18 +++++++-- helm/postgresql/templates/pvc.yaml | 13 ++++++ helm/postgresql/templates/service.yaml | 3 +- helm/postgresql/templates/statefulset.yaml | 46 ---------------------- helm/postgresql/values.yaml | 4 -- 5 files changed, 29 insertions(+), 55 deletions(-) create mode 100644 helm/postgresql/templates/pvc.yaml delete mode 100644 helm/postgresql/templates/statefulset.yaml diff --git a/helm/postgresql/templates/deployment.yaml b/helm/postgresql/templates/deployment.yaml index 8e9b19f..1523c13 100644 --- a/helm/postgresql/templates/deployment.yaml +++ b/helm/postgresql/templates/deployment.yaml @@ -2,6 +2,8 @@ apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-postgresql + labels: + app: {{ .Release.Name }}-postgresql spec: replicas: 1 selector: @@ -17,8 +19,18 @@ spec: image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" env: - name: POSTGRES_USER - value: {{ .Values.postgresql.username }} + value: "{{ .Values.postgresql.username }}" - name: POSTGRES_PASSWORD - value: {{ .Values.postgresql.password }} + value: "{{ .Values.postgresql.password }}" - name: POSTGRES_DB - value: {{ .Values.postgresql.database }} + value: "{{ .Values.postgresql.database }}" + ports: + - containerPort: 5432 + name: postgresql + volumeMounts: + - name: postgresql-data + mountPath: /var/lib/postgresql/data + volumes: + - name: postgresql-data + persistentVolumeClaim: + claimName: {{ .Release.Name }}-postgresql-pvc diff --git a/helm/postgresql/templates/pvc.yaml b/helm/postgresql/templates/pvc.yaml new file mode 100644 index 0000000..e63c0e7 --- /dev/null +++ b/helm/postgresql/templates/pvc.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Release.Name }}-postgresql + labels: + app.kubernetes.io/name: postgresql + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + accessModes: {{ toYaml .Values.persistence.accessModes | indent 2 }} + resources: + requests: + storage: {{ .Values.persistence.size }} + storageClassName: "" diff --git a/helm/postgresql/templates/service.yaml b/helm/postgresql/templates/service.yaml index 0b7e613..f8f3283 100644 --- a/helm/postgresql/templates/service.yaml +++ b/helm/postgresql/templates/service.yaml @@ -1,12 +1,11 @@ apiVersion: v1 kind: Service metadata: - name: {{ .Release.Name }}-postgresql-hl + name: {{ .Release.Name }}-postgresql labels: app.kubernetes.io/name: postgresql app.kubernetes.io/instance: {{ .Release.Name }} spec: - clusterIP: None ports: - name: postgresql port: 5432 diff --git a/helm/postgresql/templates/statefulset.yaml b/helm/postgresql/templates/statefulset.yaml deleted file mode 100644 index ee62418..0000000 --- a/helm/postgresql/templates/statefulset.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: {{ .Release.Name }}-postgresql - labels: - app.kubernetes.io/name: postgresql - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - serviceName: {{ .Release.Name }}-postgresql-hl - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - app.kubernetes.io/name: postgresql - app.kubernetes.io/instance: {{ .Release.Name }} - template: - metadata: - labels: - app.kubernetes.io/name: postgresql - app.kubernetes.io/instance: {{ .Release.Name }} - spec: - containers: - - name: postgresql - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - containerPort: 5432 - name: postgresql - env: - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Release.Name }}-postgresql - key: postgres-password - volumeMounts: - - name: data - mountPath: /var/lib/postgresql/data - securityContext: - fsGroup: 1001 - volumeClaimTemplates: - - metadata: - name: data - spec: - accessModes: {{ .Values.persistence.accessModes }} - resources: - requests: - storage: {{ .Values.persistence.size }} diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index 4a62552..31c0a9a 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -19,7 +19,3 @@ persistence: accessModes: - ReadWriteOnce -service: - type: ClusterIP - port: 5432 - headless: true From 69380e3ea54a6d83978622d97492898118734a1d Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 10:32:07 -0800 Subject: [PATCH 35/50] updated yamls --- helm/postgresql/templates/deployment.yaml | 20 ++++++++++++-------- helm/postgresql/templates/pvc.yaml | 2 +- helm/postgresql/values.yaml | 1 + 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/helm/postgresql/templates/deployment.yaml b/helm/postgresql/templates/deployment.yaml index 1523c13..5437691 100644 --- a/helm/postgresql/templates/deployment.yaml +++ b/helm/postgresql/templates/deployment.yaml @@ -5,7 +5,7 @@ metadata: labels: app: {{ .Release.Name }}-postgresql spec: - replicas: 1 + replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Release.Name }}-postgresql @@ -19,18 +19,22 @@ spec: image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" env: - name: POSTGRES_USER - value: "{{ .Values.postgresql.username }}" + value: {{ .Values.postgresql.username }} - name: POSTGRES_PASSWORD - value: "{{ .Values.postgresql.password }}" + value: {{ .Values.postgresql.password }} - name: POSTGRES_DB - value: "{{ .Values.postgresql.database }}" - ports: - - containerPort: 5432 - name: postgresql + value: {{ .Values.postgresql.database }} volumeMounts: - name: postgresql-data mountPath: /var/lib/postgresql/data + resources: + requests: + memory: {{ .Values.resources.requests.memory }} + cpu: {{ .Values.resources.requests.cpu }} + limits: + memory: {{ .Values.resources.limits.memory }} + cpu: {{ .Values.resources.limits.cpu }} volumes: - name: postgresql-data persistentVolumeClaim: - claimName: {{ .Release.Name }}-postgresql-pvc + claimName: {{ .Release.Name }}-postgresql diff --git a/helm/postgresql/templates/pvc.yaml b/helm/postgresql/templates/pvc.yaml index e63c0e7..cfeed57 100644 --- a/helm/postgresql/templates/pvc.yaml +++ b/helm/postgresql/templates/pvc.yaml @@ -10,4 +10,4 @@ spec: resources: requests: storage: {{ .Values.persistence.size }} - storageClassName: "" + storageClassName: {{ .Values.persistence.storageClass }} diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index 31c0a9a..e7cfe42 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -18,4 +18,5 @@ persistence: size: 1Gi accessModes: - ReadWriteOnce + storageClass: "" From ddc74c35ef9114797ec168ab4e2845fe44079e9f Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 10:52:02 -0800 Subject: [PATCH 36/50] Updated helm charts --- helm/postgresql/Chart.yaml | 3 +++ helm/postgresql/templates/deployment.yaml | 12 ++++++++---- helm/postgresql/templates/pvc.yaml | 3 +-- helm/postgresql/templates/service.yaml | 9 ++++----- helm/postgresql/values.yaml | 11 +++++++++-- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/helm/postgresql/Chart.yaml b/helm/postgresql/Chart.yaml index a02b4f6..52a349f 100644 --- a/helm/postgresql/Chart.yaml +++ b/helm/postgresql/Chart.yaml @@ -1,3 +1,6 @@ apiVersion: v2 name: postgresql +description: A Helm chart for deploying PostgreSQL +type: application version: 0.1.0 +appVersion: "13" diff --git a/helm/postgresql/templates/deployment.yaml b/helm/postgresql/templates/deployment.yaml index 5437691..7c868cc 100644 --- a/helm/postgresql/templates/deployment.yaml +++ b/helm/postgresql/templates/deployment.yaml @@ -3,7 +3,8 @@ kind: Deployment metadata: name: {{ .Release.Name }}-postgresql labels: - app: {{ .Release.Name }}-postgresql + app.kubernetes.io/name: postgresql + app.kubernetes.io/instance: {{ .Release.Name }} spec: replicas: {{ .Values.replicaCount }} selector: @@ -17,6 +18,9 @@ spec: containers: - name: postgresql image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + ports: + - containerPort: {{ .Values.service.port }} + name: postgres env: - name: POSTGRES_USER value: {{ .Values.postgresql.username }} @@ -24,9 +28,6 @@ spec: value: {{ .Values.postgresql.password }} - name: POSTGRES_DB value: {{ .Values.postgresql.database }} - volumeMounts: - - name: postgresql-data - mountPath: /var/lib/postgresql/data resources: requests: memory: {{ .Values.resources.requests.memory }} @@ -34,6 +35,9 @@ spec: limits: memory: {{ .Values.resources.limits.memory }} cpu: {{ .Values.resources.limits.cpu }} + volumeMounts: + - name: postgresql-data + mountPath: /var/lib/postgresql/data volumes: - name: postgresql-data persistentVolumeClaim: diff --git a/helm/postgresql/templates/pvc.yaml b/helm/postgresql/templates/pvc.yaml index cfeed57..d1c1b79 100644 --- a/helm/postgresql/templates/pvc.yaml +++ b/helm/postgresql/templates/pvc.yaml @@ -6,8 +6,7 @@ metadata: app.kubernetes.io/name: postgresql app.kubernetes.io/instance: {{ .Release.Name }} spec: - accessModes: {{ toYaml .Values.persistence.accessModes | indent 2 }} + accessModes: {{ .Values.persistence.accessModes }} resources: requests: storage: {{ .Values.persistence.size }} - storageClassName: {{ .Values.persistence.storageClass }} diff --git a/helm/postgresql/templates/service.yaml b/helm/postgresql/templates/service.yaml index f8f3283..f6869d8 100644 --- a/helm/postgresql/templates/service.yaml +++ b/helm/postgresql/templates/service.yaml @@ -6,10 +6,9 @@ metadata: app.kubernetes.io/name: postgresql app.kubernetes.io/instance: {{ .Release.Name }} spec: + type: {{ .Values.service.type }} ports: - - name: postgresql - port: 5432 - targetPort: 5432 + - port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} selector: - app.kubernetes.io/name: postgresql - app.kubernetes.io/instance: {{ .Release.Name }} + app: {{ .Release.Name }}-postgresql diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml index e7cfe42..f71857e 100644 --- a/helm/postgresql/values.yaml +++ b/helm/postgresql/values.yaml @@ -13,10 +13,17 @@ resources: memory: "512Mi" cpu: "500m" +service: + type: ClusterIP + port: 5432 + persistence: enabled: true - size: 1Gi accessModes: - ReadWriteOnce - storageClass: "" + size: 512Mi # Ensure this matches your cluster's quota +postgresql: + username: postgres + password: postgres + database: form_templates From 56ad439ccb482705695b3f557bb415fc9411b3c3 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 10:56:41 -0800 Subject: [PATCH 37/50] update helm --- helm/postgresql/templates/pvc.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/postgresql/templates/pvc.yaml b/helm/postgresql/templates/pvc.yaml index d1c1b79..99b67b7 100644 --- a/helm/postgresql/templates/pvc.yaml +++ b/helm/postgresql/templates/pvc.yaml @@ -9,4 +9,4 @@ spec: accessModes: {{ .Values.persistence.accessModes }} resources: requests: - storage: {{ .Values.persistence.size }} + storage: {{ .Values.persistence.size }} \ No newline at end of file From d1f13d052dc8c8ebc050417e36bed729e79704f6 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:22:17 -0800 Subject: [PATCH 38/50] Updated yamls --- helm/{app => }/Chart.lock | 0 helm/{app => }/Chart.yaml | 5 +- helm/app/templates/deployment.yaml | 37 --------------- helm/app/templates/service.yaml | 11 ----- helm/app/values.yaml | 11 ----- helm/{app => }/charts/postgresql-12.1.12.tgz | Bin helm/postgresql/Chart.yaml | 6 --- helm/postgresql/templates/pvc.yaml | 12 ----- helm/postgresql/templates/service.yaml | 14 ------ helm/postgresql/values.yaml | 29 ------------ .../templates/deployment.yaml | 38 +++++++++++----- helm/templates/pvc.yaml | 11 +++++ helm/templates/service.yaml | 18 ++++++++ helm/values.yaml | 43 ++++++++++++++++++ 14 files changed, 103 insertions(+), 132 deletions(-) rename helm/{app => }/Chart.lock (100%) rename helm/{app => }/Chart.yaml (50%) delete mode 100644 helm/app/templates/deployment.yaml delete mode 100644 helm/app/templates/service.yaml delete mode 100644 helm/app/values.yaml rename helm/{app => }/charts/postgresql-12.1.12.tgz (100%) delete mode 100644 helm/postgresql/Chart.yaml delete mode 100644 helm/postgresql/templates/pvc.yaml delete mode 100644 helm/postgresql/templates/service.yaml delete mode 100644 helm/postgresql/values.yaml rename helm/{postgresql => }/templates/deployment.yaml (52%) create mode 100644 helm/templates/pvc.yaml create mode 100644 helm/templates/service.yaml create mode 100644 helm/values.yaml diff --git a/helm/app/Chart.lock b/helm/Chart.lock similarity index 100% rename from helm/app/Chart.lock rename to helm/Chart.lock diff --git a/helm/app/Chart.yaml b/helm/Chart.yaml similarity index 50% rename from helm/app/Chart.yaml rename to helm/Chart.yaml index 03c24d8..92c659d 100644 --- a/helm/app/Chart.yaml +++ b/helm/Chart.yaml @@ -1,6 +1,9 @@ apiVersion: v2 -name: app +name: template-repository +description: Unified Helm chart for Template Repository and PostgreSQL +type: application version: 0.1.0 +appVersion: "1.0" dependencies: - name: postgresql version: 12.1.12 diff --git a/helm/app/templates/deployment.yaml b/helm/app/templates/deployment.yaml deleted file mode 100644 index 111b8c9..0000000 --- a/helm/app/templates/deployment.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Release.Name }}-app -spec: - replicas: 1 - selector: - matchLabels: - app: {{ .Release.Name }}-app - template: - metadata: - labels: - app: {{ .Release.Name }}-app - spec: - containers: - - name: app - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - ports: - - containerPort: {{ .Values.env.APP_PORT }} - envFrom: - - configMapRef: - name: {{ .Values.configMapName }} - - secretRef: - name: {{ .Values.secretName }} - volumeMounts: - - name: env-volume - mountPath: /usr/app/client/.env - subPath: .env - command: - - sh - - -c - - | - npx knex migrate:latest && node index.js - volumes: - - name: env-volume - configMap: - name: {{ .Values.configMapName }} diff --git a/helm/app/templates/service.yaml b/helm/app/templates/service.yaml deleted file mode 100644 index 48a18a0..0000000 --- a/helm/app/templates/service.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Release.Name }}-app -spec: - type: ClusterIP - ports: - - port: 3000 - targetPort: 3000 - selector: - app: {{ .Release.Name }}-app diff --git a/helm/app/values.yaml b/helm/app/values.yaml deleted file mode 100644 index d36d55a..0000000 --- a/helm/app/values.yaml +++ /dev/null @@ -1,11 +0,0 @@ -configMapName: template-repo-config -secretName: template-repo-app-secrets - -image: - repository: ghcr.io/bcgov/template-repository - tag: dev - -env: - APP_PORT: 3000 - REACT_APP_ENV: dev - diff --git a/helm/app/charts/postgresql-12.1.12.tgz b/helm/charts/postgresql-12.1.12.tgz similarity index 100% rename from helm/app/charts/postgresql-12.1.12.tgz rename to helm/charts/postgresql-12.1.12.tgz diff --git a/helm/postgresql/Chart.yaml b/helm/postgresql/Chart.yaml deleted file mode 100644 index 52a349f..0000000 --- a/helm/postgresql/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -name: postgresql -description: A Helm chart for deploying PostgreSQL -type: application -version: 0.1.0 -appVersion: "13" diff --git a/helm/postgresql/templates/pvc.yaml b/helm/postgresql/templates/pvc.yaml deleted file mode 100644 index 99b67b7..0000000 --- a/helm/postgresql/templates/pvc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Release.Name }}-postgresql - labels: - app.kubernetes.io/name: postgresql - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - accessModes: {{ .Values.persistence.accessModes }} - resources: - requests: - storage: {{ .Values.persistence.size }} \ No newline at end of file diff --git a/helm/postgresql/templates/service.yaml b/helm/postgresql/templates/service.yaml deleted file mode 100644 index f6869d8..0000000 --- a/helm/postgresql/templates/service.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Release.Name }}-postgresql - labels: - app.kubernetes.io/name: postgresql - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: {{ .Values.service.port }} - selector: - app: {{ .Release.Name }}-postgresql diff --git a/helm/postgresql/values.yaml b/helm/postgresql/values.yaml deleted file mode 100644 index f71857e..0000000 --- a/helm/postgresql/values.yaml +++ /dev/null @@ -1,29 +0,0 @@ -replicaCount: 1 - -image: - repository: postgres - tag: "13" - pullPolicy: IfNotPresent - -resources: - requests: - memory: "256Mi" - cpu: "250m" - limits: - memory: "512Mi" - cpu: "500m" - -service: - type: ClusterIP - port: 5432 - -persistence: - enabled: true - accessModes: - - ReadWriteOnce - size: 512Mi # Ensure this matches your cluster's quota - -postgresql: - username: postgres - password: postgres - database: form_templates diff --git a/helm/postgresql/templates/deployment.yaml b/helm/templates/deployment.yaml similarity index 52% rename from helm/postgresql/templates/deployment.yaml rename to helm/templates/deployment.yaml index 7c868cc..9f24e05 100644 --- a/helm/postgresql/templates/deployment.yaml +++ b/helm/templates/deployment.yaml @@ -1,26 +1,45 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ .Release.Name }}-postgresql + name: {{ .Release.Name }} labels: - app.kubernetes.io/name: postgresql - app.kubernetes.io/instance: {{ .Release.Name }} + app: {{ .Release.Name }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: - app: {{ .Release.Name }}-postgresql + app: {{ .Release.Name }} template: metadata: labels: - app: {{ .Release.Name }}-postgresql + app: {{ .Release.Name }} spec: containers: - name: postgresql image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + env: + - name: POSTGRES_USER + value: {{ .Values.postgresql.username }} + - name: POSTGRES_PASSWORD + value: {{ .Values.postgresql.password }} + - name: POSTGRES_DB + value: {{ .Values.postgresql.database }} ports: - - containerPort: {{ .Values.service.port }} - name: postgres + - containerPort: {{ .Values.service.postgresPort }} + volumeMounts: + - name: postgresql-data + mountPath: /var/lib/postgresql/data + resources: + requests: + memory: {{ .Values.resources.requests.memory }} + cpu: {{ .Values.resources.requests.cpu }} + limits: + memory: {{ .Values.resources.limits.memory }} + cpu: {{ .Values.resources.limits.cpu }} + - name: application + image: "{{ .Values.app.repository }}:{{ .Values.app.tag }}" + ports: + - containerPort: {{ .Values.service.appPort }} env: - name: POSTGRES_USER value: {{ .Values.postgresql.username }} @@ -35,10 +54,7 @@ spec: limits: memory: {{ .Values.resources.limits.memory }} cpu: {{ .Values.resources.limits.cpu }} - volumeMounts: - - name: postgresql-data - mountPath: /var/lib/postgresql/data volumes: - name: postgresql-data persistentVolumeClaim: - claimName: {{ .Release.Name }}-postgresql + claimName: {{ .Release.Name }}-pvc diff --git a/helm/templates/pvc.yaml b/helm/templates/pvc.yaml new file mode 100644 index 0000000..276feec --- /dev/null +++ b/helm/templates/pvc.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Release.Name }}-pvc + labels: + app: {{ .Release.Name }} +spec: + accessModes: {{ .Values.persistence.accessModes }} + resources: + requests: + storage: {{ .Values.persistence.size }} diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml new file mode 100644 index 0000000..aefea74 --- /dev/null +++ b/helm/templates/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }} + labels: + app: {{ .Release.Name }} +spec: + type: {{ .Values.service.type }} + ports: + - name: postgres + port: {{ .Values.service.postgresPort }} + targetPort: {{ .Values.service.postgresPort }} + - name: app + port: {{ .Values.service.appPort }} + targetPort: {{ .Values.service.appPort }} + selector: + app: {{ .Release.Name }} + diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 0000000..1a6b1ae --- /dev/null +++ b/helm/values.yaml @@ -0,0 +1,43 @@ +replicaCount: 1 + +image: + repository: postgres + tag: "13" + pullPolicy: IfNotPresent + +configMapName: template-repo-config +secretName: template-repo-app-secrets + +env: + APP_PORT: 3000 + REACT_APP_ENV: dev + +app: + repository: ghcr.io/bcgov/template-repository + tag: dev + +resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "512Mi" + cpu: "500m" + +postgresql: + enabled: true + username: postgres + password: postgres + database: form_templates + primary: + persistence: + enabled: true + size: 1Gi + accessModes: + - ReadWriteOnce + +service: + type: ClusterIP + postgresPort: 5432 + appPort: 3000 + From 57eeb62df36c7a206f4fa8d9fda7c47a8dc869fc Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:25:55 -0800 Subject: [PATCH 39/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index e1f5217..79bf246 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -75,7 +75,7 @@ jobs: env: POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }} run: | - helm upgrade --install template-repository ./helm/app \ + helm upgrade --install template-repository ./helm \ --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} \ --set global.postgresql.auth.postgresPassword=$POSTGRES_PASSWORD \ --set app.image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ From 13f6337ec48f8137f1568b386349b9061894f320 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:31:20 -0800 Subject: [PATCH 40/50] updated yaml --- helm/templates/pvc.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/templates/pvc.yaml b/helm/templates/pvc.yaml index 276feec..69fec95 100644 --- a/helm/templates/pvc.yaml +++ b/helm/templates/pvc.yaml @@ -5,7 +5,7 @@ metadata: labels: app: {{ .Release.Name }} spec: - accessModes: {{ .Values.persistence.accessModes }} + accessModes: {{ .Values.postgresql.primary.persistence.accessModes }} resources: requests: - storage: {{ .Values.persistence.size }} + storage: {{ .Values.postgresql.primary.persistence.size }} From e78d25f72d30a8e2a9ba53a29b53b4851696c310 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:35:43 -0800 Subject: [PATCH 41/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index 79bf246..1a32559 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -85,4 +85,4 @@ jobs: - name: Trigger OpenShift Rollout run: | - oc rollout restart deployment/template-repository-app -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} + oc rollout restart deployment/template-repository -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} From 5cbef7aef006ac74817a99dc575e7fc4e8259a9b Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:40:57 -0800 Subject: [PATCH 42/50] updated pvc storage amount --- helm/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/values.yaml b/helm/values.yaml index 1a6b1ae..ac83ad2 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -32,7 +32,7 @@ postgresql: primary: persistence: enabled: true - size: 1Gi + size: 512Mi accessModes: - ReadWriteOnce From fa7cfeea31c62d22a619c808cee69363a39b2480 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:56:03 -0800 Subject: [PATCH 43/50] updated yamls --- helm/templates/deployment.yaml | 49 ++++++++------------------------- helm/templates/pvc.yaml | 11 -------- helm/templates/service.yaml | 22 +++++++++++---- helm/templates/statefulset.yaml | 44 +++++++++++++++++++++++++++++ helm/values.yaml | 11 ++------ 5 files changed, 74 insertions(+), 63 deletions(-) delete mode 100644 helm/templates/pvc.yaml create mode 100644 helm/templates/statefulset.yaml diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml index 9f24e05..d5a95e3 100644 --- a/helm/templates/deployment.yaml +++ b/helm/templates/deployment.yaml @@ -1,52 +1,29 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ .Release.Name }} + name: {{ .Release.Name }}-app labels: - app: {{ .Release.Name }} + app: {{ .Release.Name }}-app spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: - app: {{ .Release.Name }} + app: {{ .Release.Name }}-app template: metadata: labels: - app: {{ .Release.Name }} + app: {{ .Release.Name }}-app spec: containers: - - name: postgresql - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - env: - - name: POSTGRES_USER - value: {{ .Values.postgresql.username }} - - name: POSTGRES_PASSWORD - value: {{ .Values.postgresql.password }} - - name: POSTGRES_DB - value: {{ .Values.postgresql.database }} - ports: - - containerPort: {{ .Values.service.postgresPort }} - volumeMounts: - - name: postgresql-data - mountPath: /var/lib/postgresql/data - resources: - requests: - memory: {{ .Values.resources.requests.memory }} - cpu: {{ .Values.resources.requests.cpu }} - limits: - memory: {{ .Values.resources.limits.memory }} - cpu: {{ .Values.resources.limits.cpu }} - - name: application + - name: app image: "{{ .Values.app.repository }}:{{ .Values.app.tag }}" ports: - - containerPort: {{ .Values.service.appPort }} - env: - - name: POSTGRES_USER - value: {{ .Values.postgresql.username }} - - name: POSTGRES_PASSWORD - value: {{ .Values.postgresql.password }} - - name: POSTGRES_DB - value: {{ .Values.postgresql.database }} + - containerPort: {{ .Values.env.APP_PORT }} + envFrom: + - configMapRef: + name: {{ .Values.configMapName }} + - secretRef: + name: {{ .Values.secretName }} resources: requests: memory: {{ .Values.resources.requests.memory }} @@ -54,7 +31,3 @@ spec: limits: memory: {{ .Values.resources.limits.memory }} cpu: {{ .Values.resources.limits.cpu }} - volumes: - - name: postgresql-data - persistentVolumeClaim: - claimName: {{ .Release.Name }}-pvc diff --git a/helm/templates/pvc.yaml b/helm/templates/pvc.yaml deleted file mode 100644 index 69fec95..0000000 --- a/helm/templates/pvc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Release.Name }}-pvc - labels: - app: {{ .Release.Name }} -spec: - accessModes: {{ .Values.postgresql.primary.persistence.accessModes }} - resources: - requests: - storage: {{ .Values.postgresql.primary.persistence.size }} diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml index aefea74..5fa320e 100644 --- a/helm/templates/service.yaml +++ b/helm/templates/service.yaml @@ -1,18 +1,30 @@ +--- apiVersion: v1 kind: Service metadata: - name: {{ .Release.Name }} + name: {{ .Release.Name }}-postgresql labels: - app: {{ .Release.Name }} + app: {{ .Release.Name }}-postgresql spec: - type: {{ .Values.service.type }} + clusterIP: None # Headless service for PostgreSQL StatefulSet ports: - name: postgres port: {{ .Values.service.postgresPort }} targetPort: {{ .Values.service.postgresPort }} + selector: + app: {{ .Release.Name }}-postgresql +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-app + labels: + app: {{ .Release.Name }}-app +spec: + type: {{ .Values.service.type }} + ports: - name: app port: {{ .Values.service.appPort }} targetPort: {{ .Values.service.appPort }} selector: - app: {{ .Release.Name }} - + app: {{ .Release.Name }}-app diff --git a/helm/templates/statefulset.yaml b/helm/templates/statefulset.yaml new file mode 100644 index 0000000..c04fff3 --- /dev/null +++ b/helm/templates/statefulset.yaml @@ -0,0 +1,44 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Release.Name }}-postgresql + labels: + app: {{ .Release.Name }} +spec: + replicas: 1 + serviceName: {{ .Release.Name }}-postgresql + selector: + matchLabels: + app: {{ .Release.Name }}-postgresql + template: + metadata: + labels: + app: {{ .Release.Name }}-postgresql + spec: + containers: + - name: postgresql + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + ports: + - containerPort: {{ .Values.service.postgresPort }} + env: + - name: POSTGRES_USER + value: {{ .Values.postgresql.username }} + - name: POSTGRES_PASSWORD + value: {{ .Values.postgresql.password }} + - name: POSTGRES_DB + value: {{ .Values.postgresql.database }} + volumeMounts: + - name: data + mountPath: /bitnami/postgresql + volumes: + - name: data + persistentVolumeClaim: + claimName: {{ .Release.Name }}-pvc + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: {{ .Values.postgresql.primary.persistence.accessModes }} + resources: + requests: + storage: {{ .Values.postgresql.primary.persistence.size }} diff --git a/helm/values.yaml b/helm/values.yaml index ac83ad2..48118dd 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -12,26 +12,20 @@ env: APP_PORT: 3000 REACT_APP_ENV: dev -app: - repository: ghcr.io/bcgov/template-repository - tag: dev - resources: requests: memory: "256Mi" - cpu: "250m" + cpu: "100m" limits: memory: "512Mi" - cpu: "500m" + cpu: "250m" postgresql: - enabled: true username: postgres password: postgres database: form_templates primary: persistence: - enabled: true size: 512Mi accessModes: - ReadWriteOnce @@ -40,4 +34,3 @@ service: type: ClusterIP postgresPort: 5432 appPort: 3000 - From a0d079ff8ff9b3879cdda0002533e1ef0c7afe4b Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:57:44 -0800 Subject: [PATCH 44/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index 1a32559..79bf246 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -85,4 +85,4 @@ jobs: - name: Trigger OpenShift Rollout run: | - oc rollout restart deployment/template-repository -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} + oc rollout restart deployment/template-repository-app -n ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} From 2a2c20b61591fcb43b67bc6e811bf10ec16c6ba0 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 12:11:11 -0800 Subject: [PATCH 45/50] updated yaml --- helm/values.yaml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/helm/values.yaml b/helm/values.yaml index 48118dd..5de9d78 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -12,6 +12,10 @@ env: APP_PORT: 3000 REACT_APP_ENV: dev +app: + repository: ghcr.io/bcgov/template-repository + tag: dev + resources: requests: memory: "256Mi" @@ -21,14 +25,7 @@ resources: cpu: "250m" postgresql: - username: postgres - password: postgres - database: form_templates - primary: - persistence: - size: 512Mi - accessModes: - - ReadWriteOnce + enabled: false service: type: ClusterIP From 5231261e77d249bb4f10c51a1b3f2a0582c9c2b3 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 12:24:36 -0800 Subject: [PATCH 46/50] updated yaml --- helm/templates/service.yaml | 2 +- helm/templates/statefulset.yaml | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml index 5fa320e..5713a50 100644 --- a/helm/templates/service.yaml +++ b/helm/templates/service.yaml @@ -6,7 +6,7 @@ metadata: labels: app: {{ .Release.Name }}-postgresql spec: - clusterIP: None # Headless service for PostgreSQL StatefulSet + clusterIP: None ports: - name: postgres port: {{ .Values.service.postgresPort }} diff --git a/helm/templates/statefulset.yaml b/helm/templates/statefulset.yaml index c04fff3..9b7b416 100644 --- a/helm/templates/statefulset.yaml +++ b/helm/templates/statefulset.yaml @@ -30,10 +30,6 @@ spec: volumeMounts: - name: data mountPath: /bitnami/postgresql - volumes: - - name: data - persistentVolumeClaim: - claimName: {{ .Release.Name }}-pvc volumeClaimTemplates: - metadata: name: data From 26d719bbba042c059c17238f56e20ccc8e590f28 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 12:29:56 -0800 Subject: [PATCH 47/50] removed charts --- helm/Chart.lock | 6 ------ helm/Chart.yaml | 4 ---- helm/charts/postgresql-12.1.12.tgz | Bin 58108 -> 0 bytes 3 files changed, 10 deletions(-) delete mode 100644 helm/Chart.lock delete mode 100644 helm/charts/postgresql-12.1.12.tgz diff --git a/helm/Chart.lock b/helm/Chart.lock deleted file mode 100644 index f90d5ab..0000000 --- a/helm/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: postgresql - repository: https://charts.bitnami.com/bitnami - version: 12.1.12 -digest: sha256:76ed64f7f84ec9a8f0c07a2bb08ef21785a78c829c9b2e3a3f24937c16d3f905 -generated: "2024-12-20T16:13:05.307033-08:00" diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 92c659d..432798d 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -4,7 +4,3 @@ description: Unified Helm chart for Template Repository and PostgreSQL type: application version: 0.1.0 appVersion: "1.0" -dependencies: - - name: postgresql - version: 12.1.12 - repository: https://charts.bitnami.com/bitnami \ No newline at end of file diff --git a/helm/charts/postgresql-12.1.12.tgz b/helm/charts/postgresql-12.1.12.tgz deleted file mode 100644 index 1a25b58d514ea82fb316c61075b3aded125ecd47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58108 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 Date: Mon, 6 Jan 2025 12:29:59 -0800 Subject: [PATCH 48/50] Update deployment-dev.yml --- .github/workflows/deployment-dev.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index 79bf246..79c5321 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -64,20 +64,11 @@ jobs: namespace: ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} openshift_token: ${{ secrets.OPENSHIFT_DEV_TOKEN }} insecure_skip_tls_verify: true - - - name: Retrieve PostgreSQL Password - id: get-postgres-password - run: | - export POSTGRES_PASSWORD=$(kubectl get secret --namespace "${{ secrets.OPENSHIFT_DEV_NAMESPACE }}" template-repo-app-secrets -o jsonpath="{.data.POSTGRES_PASSWORD}" | base64 -d) - echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $GITHUB_ENV - name: Deploy with Helm - env: - POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }} run: | helm upgrade --install template-repository ./helm \ --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} \ - --set global.postgresql.auth.postgresPassword=$POSTGRES_PASSWORD \ --set app.image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ --set app.image.tag=${{ needs.build_and_push.outputs.image_tag }} \ --set postgresql.image.repository=postgres \ From 011b7063ba6f3771bb2be0edf5cedb9c46e06242 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 12:37:57 -0800 Subject: [PATCH 49/50] updated yaml --- helm/templates/statefulset.yaml | 3 --- helm/values.yaml | 12 ++++++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/helm/templates/statefulset.yaml b/helm/templates/statefulset.yaml index 9b7b416..053444e 100644 --- a/helm/templates/statefulset.yaml +++ b/helm/templates/statefulset.yaml @@ -27,9 +27,6 @@ spec: value: {{ .Values.postgresql.password }} - name: POSTGRES_DB value: {{ .Values.postgresql.database }} - volumeMounts: - - name: data - mountPath: /bitnami/postgresql volumeClaimTemplates: - metadata: name: data diff --git a/helm/values.yaml b/helm/values.yaml index 5de9d78..3052723 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -25,8 +25,16 @@ resources: cpu: "250m" postgresql: - enabled: false - + enabled: true + username: postgres + password: postgres + database: form_templates + primary: + persistence: + enabled: true + size: 512Mi + accessModes: + - ReadWriteOnce service: type: ClusterIP postgresPort: 5432 From 4e816e13b0d2713e3e8f3e3f53fb4960df2c40a9 Mon Sep 17 00:00:00 2001 From: David Okulski <32730627+DavidOkulski@users.noreply.github.com> Date: Mon, 6 Jan 2025 09:38:53 -0800 Subject: [PATCH 50/50] updated yamls --- .github/workflows/deployment-dev.yml | 11 +---- helm/Chart.yaml | 6 +++ helm/app/Chart.lock | 6 --- helm/app/Chart.yaml | 7 --- helm/app/charts/postgresql-12.1.12.tgz | Bin 58108 -> 0 bytes helm/app/templates/service.yaml | 11 ----- helm/app/values.yaml | 10 ----- helm/postgresql/Chart.yaml | 3 -- helm/postgresql/templates/service.yaml | 11 ----- helm/postgresql/values.yaml | 16 ------- helm/{app => }/templates/deployment.yaml | 26 +++++------ helm/templates/service.yaml | 30 +++++++++++++ .../statefulset.yaml} | 15 ++++++- helm/values.yaml | 41 ++++++++++++++++++ 14 files changed, 103 insertions(+), 90 deletions(-) create mode 100644 helm/Chart.yaml delete mode 100644 helm/app/Chart.lock delete mode 100644 helm/app/Chart.yaml delete mode 100644 helm/app/charts/postgresql-12.1.12.tgz delete mode 100644 helm/app/templates/service.yaml delete mode 100644 helm/app/values.yaml delete mode 100644 helm/postgresql/Chart.yaml delete mode 100644 helm/postgresql/templates/service.yaml delete mode 100644 helm/postgresql/values.yaml rename helm/{app => }/templates/deployment.yaml (53%) create mode 100644 helm/templates/service.yaml rename helm/{postgresql/templates/deployment.yaml => templates/statefulset.yaml} (59%) create mode 100644 helm/values.yaml diff --git a/.github/workflows/deployment-dev.yml b/.github/workflows/deployment-dev.yml index e1f5217..79c5321 100644 --- a/.github/workflows/deployment-dev.yml +++ b/.github/workflows/deployment-dev.yml @@ -64,20 +64,11 @@ jobs: namespace: ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} openshift_token: ${{ secrets.OPENSHIFT_DEV_TOKEN }} insecure_skip_tls_verify: true - - - name: Retrieve PostgreSQL Password - id: get-postgres-password - run: | - export POSTGRES_PASSWORD=$(kubectl get secret --namespace "${{ secrets.OPENSHIFT_DEV_NAMESPACE }}" template-repo-app-secrets -o jsonpath="{.data.POSTGRES_PASSWORD}" | base64 -d) - echo "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" >> $GITHUB_ENV - name: Deploy with Helm - env: - POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }} run: | - helm upgrade --install template-repository ./helm/app \ + helm upgrade --install template-repository ./helm \ --namespace ${{ secrets.OPENSHIFT_DEV_NAMESPACE }} \ - --set global.postgresql.auth.postgresPassword=$POSTGRES_PASSWORD \ --set app.image.repository=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \ --set app.image.tag=${{ needs.build_and_push.outputs.image_tag }} \ --set postgresql.image.repository=postgres \ diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 0000000..432798d --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: template-repository +description: Unified Helm chart for Template Repository and PostgreSQL +type: application +version: 0.1.0 +appVersion: "1.0" diff --git a/helm/app/Chart.lock b/helm/app/Chart.lock deleted file mode 100644 index f90d5ab..0000000 --- a/helm/app/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: postgresql - repository: https://charts.bitnami.com/bitnami - version: 12.1.12 -digest: sha256:76ed64f7f84ec9a8f0c07a2bb08ef21785a78c829c9b2e3a3f24937c16d3f905 -generated: "2024-12-20T16:13:05.307033-08:00" diff --git a/helm/app/Chart.yaml b/helm/app/Chart.yaml deleted file mode 100644 index 03c24d8..0000000 --- a/helm/app/Chart.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v2 -name: app -version: 0.1.0 -dependencies: - - name: postgresql - version: 12.1.12 - repository: https://charts.bitnami.com/bitnami \ No newline at end of file diff --git a/helm/app/charts/postgresql-12.1.12.tgz b/helm/app/charts/postgresql-12.1.12.tgz deleted file mode 100644 index 1a25b58d514ea82fb316c61075b3aded125ecd47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58108 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