From 93ce80038afb1ed49c1dd98c9e3c0a7faf03a40b Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 17:31:32 -0700 Subject: [PATCH 01/25] adds ghas, updates dockerfile and dc file to use target web, adds chart dir with helm charts, added postgres external connection, but added ability to use custom postgres if needed later, updated values file and moved to ops dir, added helm_deploy file --- .github/workflows/build-test-lint.yaml | 36 +++++++++ .github/workflows/deploy.yaml | 23 ++++++ Dockerfile | 2 +- README.md | 9 ++- bin/helm_deploy | 29 +++++++ chart/.helmignore | 23 ++++++ chart/Chart.lock | 6 ++ chart/Chart.yaml | 10 +++ chart/charts/postgresql-13.1.5.tgz | Bin 0 -> 62973 bytes chart/templates/NOTES.txt | 22 ++++++ chart/templates/_helpers.tpl | 62 +++++++++++++++ chart/templates/deployment.yaml | 61 +++++++++++++++ chart/templates/hpa.yaml | 32 ++++++++ chart/templates/ingress.yaml | 61 +++++++++++++++ chart/templates/service.yaml | 15 ++++ chart/templates/serviceaccount.yaml | 12 +++ chart/templates/tests/test-connection.yaml | 15 ++++ chart/values.yaml | 82 ++++++++++++++++++++ docker-compose.yaml | 4 +- ops/staging-deploy.tmpl.yaml | 83 +++++++++++++++++++++ 20 files changed, 582 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/build-test-lint.yaml create mode 100644 .github/workflows/deploy.yaml create mode 100644 bin/helm_deploy create mode 100644 chart/.helmignore create mode 100644 chart/Chart.lock create mode 100644 chart/Chart.yaml create mode 100644 chart/charts/postgresql-13.1.5.tgz create mode 100644 chart/templates/NOTES.txt create mode 100644 chart/templates/_helpers.tpl create mode 100644 chart/templates/deployment.yaml create mode 100644 chart/templates/hpa.yaml create mode 100644 chart/templates/ingress.yaml create mode 100644 chart/templates/service.yaml create mode 100644 chart/templates/serviceaccount.yaml create mode 100644 chart/templates/tests/test-connection.yaml create mode 100644 chart/values.yaml create mode 100644 ops/staging-deploy.tmpl.yaml diff --git a/.github/workflows/build-test-lint.yaml b/.github/workflows/build-test-lint.yaml new file mode 100644 index 0000000..8513e0d --- /dev/null +++ b/.github/workflows/build-test-lint.yaml @@ -0,0 +1,36 @@ +name: 'Build Test Lint' +run-name: Build Test Lint of ${{ github.ref_name }} by @${{ github.actor }} +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + inputs: + debug_enabled: + type: boolean + description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' + required: false + default: false + +jobs: + build: + uses: scientist-softserv/actions/.github/workflows/build.yaml@v0.0.14 + secrets: inherit + with: + platforms: 'linux/amd64' + webTarget: web + + # test: + # needs: build + # uses: scientist-softserv/actions/.github/workflows/test.yaml@v0.0.14 + # with: + # webTarget: + + # lint: + # needs: build + # uses: scientist-softserv/actions/.github/workflows/lint.yaml@v0.0.14 + # with: + # webTarget: \ No newline at end of file diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 0000000..1b49fb9 --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,23 @@ +name: "Deploy" +run-name: Deploy (${{ github.ref_name }} -> ${{ inputs.environment }}) by @${{ github.actor }} +on: + workflow_dispatch: + inputs: + environment: + description: 'Deploy to Environment' + required: true + default: 'staging' + type: choice + options: + - staging + # - production + debug_enabled: + type: boolean + description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' + required: false + default: false + +jobs: + deploy: + uses: scientist-softserv/actions/.github/workflows/deploy.yaml@v0.0.14 + secrets: inherit \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 2a95304..306de04 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.1.3 +FROM ruby:3.1.3 as web WORKDIR /app COPY Gemfile* ./ diff --git a/README.md b/README.md index 5a2c2b0..61166aa 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,11 @@ The default branch `master` uses Mongoid as database adapter. For ActiveRecord, - `groups:read` - `chat:write` - `commands` -- `incoming-webhook` - **BASE_URL** stands for https://slackbot-hosted-domain.com hereafter. +- `incoming-webhook` + +### Still yet to do: https://api.slack.com/apps/A062693KZRB + + **BASE_URL** stands for https://slackbot-hosted-domain.com hereafter. Use **BASE_URL** for **Redirect**. 3. Activate **Interactivity & Shortcuts** and add this url: `BASE_URL/api/slack/action` @@ -39,7 +42,7 @@ bundle install cp .env.example .env ``` -Go to https://api.slack.com/apps, click on your application. +Go to https://api.slack.com/apps, click on your application. Grab the infomations for `.env` from **Basic Information** section. ## Run the app diff --git a/bin/helm_deploy b/bin/helm_deploy new file mode 100644 index 0000000..0b7c97a --- /dev/null +++ b/bin/helm_deploy @@ -0,0 +1,29 @@ +#!/bin/bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +if [ -z "$1" ] || [ -z "$2" ] +then + echo './bin/helm_deploy RELEASE_NAME NAMESPACE' + exit 1 +fi +release_name="${1}" +namespace="${2}" + +DEPLOY_IMAGE="${DEPLOY_IMAGE:-ghcr.io/scientist-softserv/slack-scibot}" +DEPLOY_TAG="${DEPLOY_TAG:-latest}" +echo "${DEPLOY_TAG}" + +helm repo update + +helm upgrade \ + --install \ + --atomic \ + --timeout 15m0s \ + --set image.repository="$DEPLOY_IMAGE" \ + --set image.tag="$DEPLOY_TAG" \ + $HELM_EXTRA_ARGS \ + --namespace="$namespace" \ + --create-namespace \ + "$release_name" \ + chart \ No newline at end of file diff --git a/chart/.helmignore b/chart/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/chart/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/chart/Chart.lock b/chart/Chart.lock new file mode 100644 index 0000000..be16125 --- /dev/null +++ b/chart/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: postgresql + repository: https://charts.bitnami.com/bitnami + version: 13.1.5 +digest: sha256:e0df2793d8394c55d7768c288f18518076c6e9cff6ac27a71efcea1e444b1700 +generated: "2023-10-22T16:31:23.565473-07:00" diff --git a/chart/Chart.yaml b/chart/Chart.yaml new file mode 100644 index 0000000..6df7a4d --- /dev/null +++ b/chart/Chart.yaml @@ -0,0 +1,10 @@ +apiVersion: v2 +name: slack-scibot +description: A Helm chart for Slack SciBot +version: 0.1.0 +appVersion: "1.16.0" +dependencies: +- name: postgresql + version: 13.1.5 + repository: https://charts.bitnami.com/bitnami + condition: postgresql.enabled diff --git a/chart/charts/postgresql-13.1.5.tgz b/chart/charts/postgresql-13.1.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3cdb6846a34138aee0a724f30ce0d15351d91a33 GIT binary patch literal 62973 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

XDAAOaitl#^<8g1a%VQf{>r>F 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 R|1SUl|NnpRLr?$^2LR(f(q{kw literal 0 HcmV?d00001 diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt new file mode 100644 index 0000000..319f01b --- /dev/null +++ b/chart/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "chart.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "chart.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "chart.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "chart.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl new file mode 100644 index 0000000..7ba5edc --- /dev/null +++ b/chart/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "chart.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "chart.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "chart.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "chart.labels" -}} +helm.sh/chart: {{ include "chart.chart" . }} +{{ include "chart.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "chart.selectorLabels" -}} +app.kubernetes.io/name: {{ include "chart.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "chart.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "chart.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml new file mode 100644 index 0000000..11eae71 --- /dev/null +++ b/chart/templates/deployment.yaml @@ -0,0 +1,61 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "chart.fullname" . }} + labels: + {{- include "chart.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "chart.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "chart.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "chart.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.service.port }} + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/chart/templates/hpa.yaml b/chart/templates/hpa.yaml new file mode 100644 index 0000000..a91f61b --- /dev/null +++ b/chart/templates/hpa.yaml @@ -0,0 +1,32 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "chart.fullname" . }} + labels: + {{- include "chart.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "chart.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/chart/templates/ingress.yaml b/chart/templates/ingress.yaml new file mode 100644 index 0000000..63c1311 --- /dev/null +++ b/chart/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "chart.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "chart.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/chart/templates/service.yaml b/chart/templates/service.yaml new file mode 100644 index 0000000..dfc5b3a --- /dev/null +++ b/chart/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "chart.fullname" . }} + labels: + {{- include "chart.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "chart.selectorLabels" . | nindent 4 }} diff --git a/chart/templates/serviceaccount.yaml b/chart/templates/serviceaccount.yaml new file mode 100644 index 0000000..26a57fa --- /dev/null +++ b/chart/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "chart.serviceAccountName" . }} + labels: + {{- include "chart.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/chart/templates/tests/test-connection.yaml b/chart/templates/tests/test-connection.yaml new file mode 100644 index 0000000..8dfed87 --- /dev/null +++ b/chart/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "chart.fullname" . }}-test-connection" + labels: + {{- include "chart.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "chart.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/chart/values.yaml b/chart/values.yaml new file mode 100644 index 0000000..23e0188 --- /dev/null +++ b/chart/values.yaml @@ -0,0 +1,82 @@ +# Default values for slack-scibot. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: nginx + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/docker-compose.yaml b/docker-compose.yaml index 9ba5f3c..7efb68d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -6,7 +6,9 @@ volumes: services: web: - build: . + build: + target: web + context: . volumes: - "./:/app/" - "./log:/app/log" diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml new file mode 100644 index 0000000..58fb2c9 --- /dev/null +++ b/ops/staging-deploy.tmpl.yaml @@ -0,0 +1,83 @@ +# Default values for slack-scibot. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: ghcr.io/scientist-softserv/slack-scibot + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +imagePullSecrets: github +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: true + hosts: + - host: slack-scibot.notch8.cloud + paths: + - path: / + annotations: { + kubernetes.io/ingress.class: "nginx", + nginx.ingress.kubernetes.io/proxy-body-size: "0", + cert-manager.io/cluster-issuer: letsencrypt-production + } + tls: + - hosts: + - slack-scibot.notch8.cloud + secretName: slack-scibot-tls + +postgres: + enabled: false + # auth: + # postgresPassword: "" + # username: "" + # password: "" + # database: "" + +# database configuration for an external postgresql; +# ignored if `postgresql.enabled` is true +externalPostgresql: + host: pg-postgresql.staging-postgres.svc.cluster.local + username: postgres + password: $POSTGRES_PASSWORD + +env: + configmap: + DB_HOST: pg-postgresql.staging-postgres.svc.cluster.local + DB_NAME: slack-scibot-staging + DB_USER: postgres + DB_PASS: $POSTGRES_PASSWORD + SLACK_CLIENT_ID: $SLACK_CLIENT_ID + SLACK_CLIENT_SECRET: $SLACK_CLIENT_SECRET + SLACK_OAUTH_SCOPE: users:read,channels:read,groups:read,chat:write,commands,incoming-webhook + SLACK_SIGNING_SECRET: $SLACK_SIGNING_SECRET \ No newline at end of file From 74d94bf3ce97eae6684124f05b3bb9342a6306bf Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 18:44:27 -0700 Subject: [PATCH 02/25] chmod +x the helm_deploy script --- bin/helm_deploy | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/helm_deploy diff --git a/bin/helm_deploy b/bin/helm_deploy old mode 100644 new mode 100755 From 58006b8c9560d4e0142c4d7d038749ac6b2e7a7a Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 18:48:49 -0700 Subject: [PATCH 03/25] imagepullsecrets is an array now?? --- ops/staging-deploy.tmpl.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index 58fb2c9..393d8c1 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -10,7 +10,7 @@ image: # Overrides the image tag whose default is the chart appVersion. tag: "" -imagePullSecrets: github +imagePullSecrets: ['github'] nameOverride: "" fullnameOverride: "" From 2a4aec17b9193b529b0d200f9c2c40806e3843ab Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 18:52:30 -0700 Subject: [PATCH 04/25] ok got it, array but map --- ops/staging-deploy.tmpl.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index 393d8c1..8d0a222 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -10,7 +10,9 @@ image: # Overrides the image tag whose default is the chart appVersion. tag: "" -imagePullSecrets: ['github'] +imagePullSecrets: + - name: github + nameOverride: "" fullnameOverride: "" From 8d34271e9e126a5ddc6da677fdad694b3433021f Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 19:27:15 -0700 Subject: [PATCH 05/25] Ok just remove the postgres helm chart -- not needed for now on staging as using pre-exisitng, and prob will on prod too --- chart/Chart.lock | 6 ------ chart/Chart.yaml | 5 ----- ops/staging-deploy.tmpl.yaml | 11 +---------- 3 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 chart/Chart.lock diff --git a/chart/Chart.lock b/chart/Chart.lock deleted file mode 100644 index be16125..0000000 --- a/chart/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: postgresql - repository: https://charts.bitnami.com/bitnami - version: 13.1.5 -digest: sha256:e0df2793d8394c55d7768c288f18518076c6e9cff6ac27a71efcea1e444b1700 -generated: "2023-10-22T16:31:23.565473-07:00" diff --git a/chart/Chart.yaml b/chart/Chart.yaml index 6df7a4d..64f6830 100644 --- a/chart/Chart.yaml +++ b/chart/Chart.yaml @@ -3,8 +3,3 @@ name: slack-scibot description: A Helm chart for Slack SciBot version: 0.1.0 appVersion: "1.16.0" -dependencies: -- name: postgresql - version: 13.1.5 - repository: https://charts.bitnami.com/bitnami - condition: postgresql.enabled diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index 8d0a222..a2e232c 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -58,16 +58,7 @@ ingress: - slack-scibot.notch8.cloud secretName: slack-scibot-tls -postgres: - enabled: false - # auth: - # postgresPassword: "" - # username: "" - # password: "" - # database: "" - -# database configuration for an external postgresql; -# ignored if `postgresql.enabled` is true +# database configuration for an external postgresql externalPostgresql: host: pg-postgresql.staging-postgres.svc.cluster.local username: postgres From d602df06835d5ddf656436e4836e0d2efc81a40d Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 19:38:01 -0700 Subject: [PATCH 06/25] Wrap in k8 version conditional since staging is still v1.18 --- chart/templates/deployment.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 11eae71..bf1f650 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -26,7 +26,11 @@ spec: {{- end }} serviceAccountName: {{ include "chart.serviceAccountName" . }} securityContext: + {{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion }} + seccompProfile: + type: RuntimeDefault {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- end }} containers: - name: {{ .Chart.Name }} securityContext: From 70319edc85dd89349b59e7f1e6e09d6689813f00 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 20:31:19 -0700 Subject: [PATCH 07/25] Update deploy --- chart/charts/postgresql-13.1.5.tgz | Bin 62973 -> 0 bytes chart/templates/deployment.yaml | 4 ---- 2 files changed, 4 deletions(-) delete mode 100644 chart/charts/postgresql-13.1.5.tgz diff --git a/chart/charts/postgresql-13.1.5.tgz b/chart/charts/postgresql-13.1.5.tgz deleted file mode 100644 index 3cdb6846a34138aee0a724f30ce0d15351d91a33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62973 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

XDAAOaitl#^<8g1a%VQf{>r>F zxQU1#l|O;^*z+co96B#z@JRVjoEXyzSdtYURr*jvp&C6eA!Qxra+S?-Pt7_tL>Lxr z$9r&*aLF)%cp|-)NGNP|xxRlkukCQatWam%frvaR5%^$t7t>-XD{&YI#bg8lL(r|| zXdHT(DZT8ZcUmhauWjLrKRa>c=K8-#8|KfI&|41P$n>wm5C&p{D}(W7#9cpU?(((R%EGYBi0{^^#DQ(ExL{*pwZ{ee;sg zMMLcf5W{2WF%yqutA?+y*@2HesPND0}P!c1?L==ppRKDu6(bQc0;?91c!#{Lvt><vpX9*I z(C$n%;WQ`n3(MY;1Bw3y#mx1;O1in6z9X`ez{#!)Ewyfb;s+;7&80TVy6hr$ReKCd zaUKL{;iM3p8^dvU&j^y~ z14}J35E&XZSqc1!82c?6&{n?g=bGjACr_X!HxEcU;lC44IuxqhRZ6HavH9QYHAiVT zkx*mg0cD-go6Qb*M-Iu8+QJ|#qD1$c`L^62lcu*B%K6&4287*W)7B#%n+&`Q1mjoK z=Bnts-a?F$U_a&b%Fwu&T5c&nWyd8qn8k~z-OgXR8YTjMwwVBUCVt1UcZq^JkTzHH z#=w;HrUx=SYOHalja1n5HOKlyvp3aHJg&>F%f-e-Xz0sN$oCDQ+9#Ln16y>*-*^Iv z$hB#Et4Y5bg6Mq{q)^q&H6Oco9%slC=zlpzsj4tQx6K(=DdBf@>cB@*c&vc{egA$k!H86E6{xhIK2sxfQp9mX(&ozsXw;-DtPHVi< z)-`J*dvUCiFs?xG6k)Y2Eob-!k*)-?BV9L)Ww3x2Q=1knXLFKts!Od)YF|!DLacu? zk0A8jyBq$RYHpx_;@JYk14hdJ0?LDb;RTWT??!fcQ%ybEkE z>Hx+FBxyvIt$^NcJ?Z=rg3t$N#p_Sp!fAS6(*%HE_YLRc8=!az;CFX*cTSrIyj>m7 zs{sH;pVsRDI|5468KA7iA#zOtyteflz|b8(b;hb*EO1Y_5zx!PfTrvxHdR4*JlRvc zP0ZSNi?nOZU-9~wB>vrpzXwY-n>?Lk8Whu22?g;WO#2?G(_SZ)@Pt-|MP@*zEi>?c z!A5B>`b(XVDUIa7QO8SpE$cL|VX5ViwH$N}DVGn#=WC^g7PiyCx6O?L{U*-~yba-W z))9!LP*BL94hYf@aX-QPd*0EEX_oQ=H;CuMow*q=_G&11Ha&B&YV{Bm8ZD38IE~i#+%>c z0p-K@;Cz3S*=+9&VD#0a?<+Tj*d!8-Txen`&e63Q7U>e4QWGw*vhpe;%R4TjeE{5M znNIY(Cl!v6W=?=FdjD5g+9B>zQ!(F}Lgy?@r{Z1B;tUCqgcZ60b#?28&uI&rdr0Sa z#y zF$549?NmlJd9+!kW5_v*5+aTc#$4m z{<;Ct>vh@5QF+IDD{27&t$1CgJ7s%|fNjmuB>&Mg2RH#cF z!~>2m1zFK`B6Xh`X)LGJ@l#q2#&7-r(&}`7yqrez?Ypa3oC`+ zx?}Ov%+qFPCXFZDOJxi|+xZiIuC^j0KmJ0fL48-e933j^TyOaW^owNyVBHu6S6xT!^gJ+@7JcBAuDtbFMFac zq8(fToLzByqZRUDhDwbf@#0+r^~HII_%LKgR)^ul=Uls&*zRNJ*c{?$SGeArkrhaj zoGMR1e=x8gpJa{dQp+=C2!XpR=gA`k(<&;-G#|#zAQFtPVAT;UN5%H9uhgsX?<+S;eA>xMjy7)r-J_S9OX2f$Opwj1x^+ z?ZPcaFe*yyy8*+B$&f4-eno&y;L4?kgn&x`QnrURg^>t`m{4kM;q+>6yYjz+sx@h6CW|i9 z=rUoHVU$L$eJyHMwTY{+gGBv(%#k#;yzw7HrKLXoo}-xk5^^O0v917G@nFt;D{gvXsa zps^QFey;FHnO-0n=hu!^=oqG>m$g{-89W+2LvKu+UecG=TQQ>_sl^5U%PE?g%Jgbx zHwRc<5NXmDF;hKoljUha*7l-CQUpQdkF4~&Z==e(c=k%0`ROAYx$8Y6jL%8 zm;VqVZNGyRpdis=-$)E^6KP3*6e7;utj6N1b zTp?p=Tw!{Qh0~-mfcb8lZ2FR!+B=lUc$44R&wtVNg|Ycc$kK{NsIC}e?V|IOeUpB- zZn00|vP+gaL#Cz{15)Ep!C9d668gGT$tboy>D6w@o|{QH@@t7z z4(!!85LUu$rn6)Nzss{R*C7=d3}f?)fS7pFLkDE$f40h>*IgAk4r&9p%VO+)>$Sd+ zwbQrEhL$)sR{vt8dlh}CwdXcRQ|4i{*lsVi7Y=lY{+w!Y9F)p~KVofZ@odI@<ySS(lkWVm?7 z7oi<$>`tGN2sd{iTPv*);l-)LP~!frJhUa)5Ri%FanrURUj%prjnPsS~9) zij44vpbd_W0Goo2obYwTZGi(~Demu5mEAs(bs(~BHMlXE8X@_61|p{DzaxKEh*Y57 zgP6)!Lo3! z{`oFfCubANcJ0{v(dx&RsOzzA24)vs(evXXUjG&M@6?t@y+v@sWAe#(B zZL@X1d`q!s_6r1=_xQdZUmD3@&}e5LaaumE2O8e~*N>2KPbl=_2RcX0oizGPr~b+0 z^{?5fa{-~?oy*)S8$C%^M0iV2*kuMz^|j`|_)wF7mTY;?vEk8+1M1@8D2p?|Zy+k@ zI%_|>PqoM4+qB?!)cUk71x{L6Le)hh*qUx%n=@`25vph>ej!0 zND%PC0km`Pqxby*{t5p{2B8bYl?U2&KK~(zvV0*kJ$W*W5JIyA7KihAwpi+mB%wl& zXtxnoAl8J@3S80`wb^$Qk*;-`n+%t=l|JZnon#X-NipA)jE?C5r~0rrk6lG`Do*v1*_(O5=jWk7+0(kF!!KQe}5Z5FsqCN%5r_T-a;Kx<*X7koX zp)=~O=e}5Cf~0!a92*zypH0i#RFVmijIHtJ_gmqbW_P^J_h7+|9Oly3#@OlR=42-| zEEajwFl(emzFqie#Y4mYOl4plETxpkA&Gp9DKaPVQY@-JfPAKFmMu(r_-Wc39zXB<8!b*T_pf7nzs9@wqYT zG6@5+i#c`yPi$ea6-PbJHZNo_Q=yi%)ergB0zcQyFD7LcM9xr{&4aN1Hf>>S0}Crl z?c(uT>Z@pDYGu-yiQ!}iOt3_iYbhC5`0QSsno=UT8#IM&J8Z!1=6uzPPYmaQC->3Z=nKFJ@EjF$u8u}>c z3HbtO8B=56wFkA}&ug)qyYI8d_RLRV#<&UzS!pSqMj2zFwR?wp(~X zLV&Lnh89QYANZ<}O>uo>_-}B1T&Bh{AF5ff3X}^;;&15>HP0SS z!eS|va8Q}lqq3s6NTcn8>k2MVV!y4Kk>ox>!6Y_4j<<@gE^jw1!_3wGTGD?c;|e{~ z>6T=S3$bSn!ciNOr`jHDrGR5eF4)X1JP@fdTqM!b49k;Y;}31SY)lBLa#|Y;P@Y(* zOk6DmEXS3j%G`ymSo^$mFoL&a)dc*xg0qXE*Np60!^GD+nhY#s+*yn|Wc_zQIkrEn zfGAuHEvPdzS97U7h|_p=b*-WnefxqvnR&H&+IfoTb1&V?9uK%1-?MyuHnsQBsi}_~ zjVG!b3l^2}(cXZLQ z!Kr|EqskyB$?)ZV|008!e7nUwxKA<>7PQJCtk5r77Y!HGY=M(hm+v8;AUD`@q?=tW zbGy7gBD+eVUkA%jyG)a6SG2!t4gn4}^kWSi*s8ssPbS3H)z!{|t(Bvvzi8cpsv(LX zKC0|ozMjL&jaeOVk51Q%WjPI7s-CqE7M*~#6g^o#AC^!esf3&q?R@#Q$EusRE54M} zx>|Zl0r2sd7c@owrIp8?BeBm%(nvm!X$O8ABUcNy4p-jXXLmyHRKE)gu^Qx3hA9X? z=xCVZFGZJ<%%vD=R!V`f%6?jk!G20{c(*q#u_&=0hAHxiD|Q;r$RT87dhmL^cX6Z+ z`MQ3*_j+>m7*^T8YyrAdu8BKKB+?&V5ZAW{D@R$>mKBOz8$LDZguMOr%VLJJ?XNin zgzsQk=>4=7N@;s7qz(Z z7MROLb=X$tHOG*2H4T4Oi8cbSkox*Q_%gg^-{Il?bRYg7erKrRUIhz-7hsOzm~i>+l`HW{B>PDRa*>t8RA zs;ckgDp&ALtGTQu_bgD(b_Qez4GW=Hm01z|7sSS|FuToGX{ zBCLHxXwgioO~n}O3hkMA>WU#*``>R=D~XKrS+f#y-o1RoZ4LBq6F0N6GJEEE{2psc z51HY+Scz2?LFw?)F}*h;PpL85NxJ6uO;>VZ@MUt0M$1|gj5fL-;qwDk3?~lu?H`$L zCWyq0?HuX*qDs@Fnf5s8Pc30yRELg)S#u9;skzO*uRTT06MxF$Ri&DUr!hKnEgA26 z=5a}r8s=uyrGe-}^Ass>-4&HfT^Di-4-d7?llFLkhTWqk7_62L6_2E?GyhgFc&*2y zvXkqZ|LWSZpet5LCEuQN#L8J8L9XJSm1(%9ZSw-QZ*fbwnH@!4x}Zg&cuO@un+q4f znARV`HEoY@{YZG<=+4Rmtg)|d$43#FWqegXuVr>~ugN;Ix1VLl^*fZS4bbw2!`G<{ zJ}xeSa;g2LBK*M5mD3{L(MyM<Xz640$&d%= zmYBiupRxD_35N)l1;pB6niKG&!-dQj@HS+;zjFp76z{v@8j(`8wm8)gCueAKy|-QN zzL%1axmm~i`Qv6koODwgOw4psD=ijlJxNeLa69wEdF(L(up8|M{yO^rVxG5=koI^N z_$rBro4X+&2D2O`y(!TYq_CaZvhpoIpXLCJQfl_La=9AwO zAo`pJfuM%Zgwc&;<3ARgZWob%gTWBta^*gqu3_?vemH@S)>2Qx2XwVVK4|(1-i#U@ z>=NfJqZiA?rcRg~6Y|fDYoN{0Mn4cZII4zwRp+A{y_M+aE$@67gaPVjz^LnO|A2g_ zIRzMAB38sb-tB4;%}R+4C$o^TXi&6olka-7Z!p&`@M1rR`I)( zio-Ec*V0?^EG?mnYdsXwc*s0qF7my$%|L3}K3>xk!2f$nL6k>TOmdlJZ=trNjqHFj z@z&mDT5Q`&HEGlD9`9MT%}~LIOTmR9zu$A#4*==Xe(dMeMAS?tCK(?8XLkk*qr_#D zN=ASyCms~)A}ZT2&+c(uQ5VAqAsCJkV(lcykl3Q_BG}^OaTZk|siG{~$8G^JeKY0? z%E}W!o6lPaq77lO9Z|8pOG66H5V3TgASIZH9%=C6g!%)*x&dCBZ1)sB{Fk+ToSRYG z&7_+Vi#{JUUZoqhms+Fq8nPW;>wHMUg2t-1q-rBe_mnI{x=`w?Dr>fA>QMe&(g|y7)L=VK~gOtyQ70!XD`% ztXh-7U&JHTO}A^cN=en_dD0#K?O)^loP?nLDqG5Wmitxd6M=Wcywrm@i4x0LK#{k4 zoBi#+!*_w()N}KFCsvt^Y@S5PEFS|#t7Tno32f+8YILGoG!q%C0faYQTpJ%oD3nd} zz%ia0#pe5z8R-O3jzg3C-X;0nWu&u*sHa1B{R*}H&}@*y0Lj(552--lFvOMSjK>5M z9_#H3!tw)Dw=4q$QQ{ot!&M7uWyrYKwNkE&Vxzx?$6LX;r(x%zBrOgDmq8I4qpeyh zpQiXI&i#2iOPk@q{Hh5xds?*Wp4&0@c!j8S+_Yi(`21_4j(a(Qy(58~-644qgGmq? z&(Zc*Av>aSE)|E;TJpPqjG}okqT|GF`XD(Ol9EX}Z@8~K1lJ(@APxM8g_D3d1sM&3 zU-eNP??ejtruxDYv`D!}#$W^5HLYOd7+=j;7G)pRlx9F(7p`R)azjZN-?!blHULA> zA>l5ufbWxO1t|%V$RELD2?J{w=N)1QZnKb{?x`ioZnEzEZ^=ykBF!GiIVg@N!4ahH zv)15_N`MbYO*sADxc7zI+$oSJK4kc$@`3X&a9l?g_-^0>!^cv4ItV1CKd7u*q3~m1 zMuH|b2U6g6@tDYWb_1p1fxh0$l57DdV-O@P)O&asl=SKLdNRGg-}u@3_g?>)e{$vv)uh)%!A?VT0;M^n%55|5b_MZLm64|A z_rAuxjw1GWq+@k`1P1c+wK949)QcM(lyh$o{v)2S33g)xLQQzokZM=qD40)5{_k!a z=ux992!B> zb=OnSD`x@siDOq`@8wugRt}fR9?KYN-~#vd-mS9-gxntAv_e2U)`1c# z6Sk+h4O*QrfSZd$^3rd&i_g0SU{}mi45;2yLz``|Vx0W_f~b|Ag+$;aSkHgX@q>0X zMA#J>KO!V0S!AYZipVue^fPE|up&*N5c#!8lDC$uqLWWpZkA0d;V38kbe@CN1F}bM zoXV$}PSuTks+oENkV&z)PJ$B{#3SsMOLHD2A$gnV60#(SD(PI)z4>ebPAOMkxnMGD zJ~C9>fY?~255V1iSqD7%uIAD0NeFgv%6TsXWTh_&sFU;gsmXbTfG@^noIFzVal{tw{bx37RuF9k|X zrEVncxRl(&{d6$7mS1V47DaOo{o>M!=)tSoW z9+kCS=wuPG9Vrg&7YbuwWEsr@uVY0JLi$W%NrqS~(*(KxAI}%MfhAfI+N4Ui^5R;1Q@mxRq&D$A>f5 z2qkMb_yX|u8Smet-QzB@xVhma9pBZ1zMC)~L!~$Ydb?0fQ{OMs{RZ!!x37C==>WSz z>v%xzo-NyD$=ZGgFY(~tucvUp79hxnNv^8-m zsi^f(%ASoQJk~*P1r;C0n<&=W1=b#Rk29J)f>7d!l z-{DGOsh#GY{reP?t84WPthONk-A=(E z&Z2rL>KWtTb5b0D`hKm8EzbIVMi19S&>k6Yx6MrY9uj>tR&F_^C-U5SMURrnCN;+9 zSX1A=m{pUwNRooyJV~M5s3{BUs6$J^3OEQCr`4*MsLN3;U#Q9XUMiWUoUe8}&HMuevdb5DqltF^qqk)s*>75N` ze_lG>r+w2u(kB}scVQcb1Jn|>r;!_!gf|vO9MPquj%ti%T1)L?7PA9)PNTbfCahs z;&`om}hQPWI;sfJW@So4(Hs$tWau`laNLOF=(ifX56h81{3lST&Q|G93<5RYf z&+O7qurz9JQYnXUy@@0C=DJDbhKx&8oKWSF8?W^RyOy^jK(_G49rCD*GO%)f@s*TaI1&@bI^)CQVHZyuQCYDGkT|Z;lDHpVz?^77DGael|~N|;Nc_VJ47|irC>PjTA&>0vSo>8 z&r6e^!YIWzmbMN_(GzNCw89MybCGFLns8q4TC*&IJ$ui=X zKg;7QP#29L>am&)DOkPt(yV{>Oo|R#%c`Ji$SRK~)00PGi%;q)n&9B>rv0Oq9vrbo z<#A}(o%E>)u1@uSQQ+6XA}tuw&<%N|-O=fqB84VgLLW|iD=l1meNARH=EJzpmxenS z_?ahVq5R_L%vS%Bg-t`*bL4n%FNvMY^U85_0UL~vJzOT6WeTkscMW=T#1jeytz$#;l{-=Z+Y~H~6$OLVj0ld!0=+Apr6YbsiAN zyhz^ap)(;*_7GA%*7H|V)_D!#SN9rNpv!H2+*sYqwCe%Z!I(kHv5?J{j`VQc(s9x_u^fqinR z6gXB1lPlUUZh=Nv&d5s0u5wNSBesrqMo{5G+M1Guru4539wJuMG2Ldf!wlW1b|na; z}93+?6tLWXN#`b-3ms zwUuRJ^Bc?x&!!lA!Q~_e@AO*i?MVKKb@y({^uoCl7#h+hZ+<`ZLPW`kp2n)JcM`6O z`DiTHY*Vkdv#tH2yZhDI^?Un+Krve9S-e!Vh_47HI|cu0O#GP}N~zS4k`6m05qaXq zF0FjA>*em9xz@gVPj~C@@$@3t(dqH?`aZuZ=xT>1 zmY3~R0n69cpuTuTFze3LwU9fE=Lo{hG0G0QCdOglR{Iw@b13$m~Qyu zgUswt=T?D;0vr~oybv-ycFNB2ac3@HcJKA>XQ#cfEDMHJ!E`w4Ed&_sgf8l``hZaG z2$9g^EKgMGU2Tc1ZSpv;tL;k~#Z-oM?foIf9#;>hI#15(>DOe`;?DGNXQiCoZuaq1 zFy2YON2CV2s>&D?3iDdWz^m@A#1^GjlUI8;tA4(hjbK?n>e-XeK9a+w>SS! z!{&SG@`YdLY3Brm1--ox-&r5=i~HO@eQ|9w$NF;gXBD%Aj?1`eYne(?N8OB5^zRYq45oaj? z58#Ch?zpxOl@nL^%|fnDyLZ5mad1wn-L5;!pv;!etxT=8b2XLb<>lS+dRm8ai|)jP zx7+(A$XF;@9Uqm|m51pqoxt}HA-90>Tf06p6+`Vb;aK~#(vzTC^#aTAzQZTT?2P?D4R13us`V6b zyRGt<6NPn7z%M8wYb(`Qarpa1==N)U`0ttP@Q&v4>ZP^AWv;9jd$)?G12pI3J@*4h z*P)>n)#b$b@$lR7bZIMwTJBB`0(dvUOeG!k=-}9?T|EGu5uBoIMiTdPt&@)*1?BTz z=k{vxc-U>V`!WhzX4Kk&Aq2JECz1zbTZ*S3?%d+l>`n0jB$`Zb5YA z%EtA$U0BC64f-3VYIrC+FWaL8<|=5<_gcR{V!qL?L77vAhUe!1y$Rs3q_97^2?`rv zBk#rIPQ%BhnOxb8URh2Y-E1Y>pM};bea11hFBQxfkDTywh_hL+yDo8;y*0iT+)@Zq zJT5w8`;bgYCN=Udkuw4M_djgX6L{nHx~=*SDbD6stVi$Twv(7)xpyYLidMHg-9X4o z2eb=XUm68IdQ*yg*U(3+xx%++5#KPZAw*N@-oLZVnLnp_PHFcrwQYS$N?nY|>L0hB zhg6VlcZ}QhUqzX?i;`R2Sz5XWocBmZSXT>;ewJB!DqO((oRCs59wyMv1Ym?X9u_?5-7c_GptH7?89t{-7_bdGK4hxSu7z}0S+^4=7rX- z83Y=%p-vT^@v!VJuO$c8RjeYtd(}$?wjS=$Ss{n{1W@fJ=Xe@`l|4s^=GGWc!};lu zKy{wBB`B&F%w z%nLe&{~}^F(B9n(pA$F-P#+gu=6}TVeZXU z5MFoCIJEQt2HHIOr?%+uQZmHdjNV^GSlJ#{;4tkvr+rXC9bsS!0fp5n<~l;6e@KqQ za=!)O@#%qnDX?}zm6Lf|~Ar+OKq;`(Sr@`T2N$pMO1x z+|*||7)LerCDv};s9pIno=k^F^|&yi)R~yw8{rh;Mm#@P0o%+O%z`i9!hy#QWOHtx zSAFv-`*kIEr!$ut!~@JsK&9r5BU{GdvLVb?dUq7;`+*Ha>1dShVCKevgObQa)ohlcWO@p6(lFcwN zZR$oW1*Y&DBWjixXOaP0V4Fg!*%&~3qBYn$pTfAHzDZ9yps^#+j#%?uP#=}fD6KSW z9N*g$usq)mH81Si(}~Zw19gu2WQKRcE%j*cLoM!aO0u^^&aABN71lTLxQoS|^7z#(1r+4mqKCntC_Fky{ zFOS}4j&+N(Dy3-A`RF=UQ_^)TYw-hMXdgLO-ptKW2u;U^_pg3+i7*RdEX#sn ze#7Y)*4vam`=5mcuc+(~K4Ddu80;V_$u!C5)|*cKq}pO0^gg4pM!%1ig4|O$Arc^n z=UcUb<9Ep@f=Td2qOu`4A)4R1U#+57$5L95bxwa8h9Z#?q&CvYvKH2_tKvL;Lu#t; z#{3oD`6IWsk)O;*L@`^?5IiDyb(Ty)MEG#HXRL~?6=MYn=>-q3+=;Zb6NEW41rQD5 zN>9PoR8%F@l|{K#aqquN_a)cEEFFnDY3Y-}J2)KnHs(?qvsVO6N*zJ}FXCn*{6X9* zn8&Xlq=jmn)s0ulR?&@V0iaY3n|h;i>?}K~KgyFLbs`CKs@~A>;$^WBC{~D+W3kcK z)+rjZWQ4j@MM;fwes<=JD$;u8XZ02-HcwtlywRZFvM{F2T06{jg)s%LiegGwnLQ!~ zm$`aejn9XaU~jvpvYVurI`qKa4&N_9YNK{LzmNU=o=!LcA8Zr1dX#|9>=7Sd^Mv|J z(9L9&db5+%n$+m-0Nla)%7)~P_ITqnsdZmJ`kn?0_`X6DZCa7`oB7*J*|Z+R7p6wz z+A{kU@ys4li7ud9EJcl+15Kc3U}v4*fN7{brC)i2LT3SlxE^UTwUE7{b2^XOsl+2q zXeVHpMn~=X!90!-qGJL1Rk-Uey9To;$Pz%JkRK>Sqrb+GE}%(~{q5LCie}2xynw+YmAA#T7c7!69N4@`pHahNnRnliY2p@v!^9T}$Btac7w-Fu&}32Y&5pO8 zo|^1_H!~=x>GS1e@2UTPIB?NXZ!w37ocOaA`cn#7p&*sj_;V}kn=M?uE!yPK1ai)B zUgCnd?TsOvyeUKL-#xAl=QlC#)L$LDe-Pf`3z%-4i);S_!LD6}VNgCP0sCG58w9_O zn5m|`X*kLp;T2aw%9Ri+)i=ZRK3Cl))!$;jqYOQ>>~-xF?=2HVQzWx576? z`7-7WL=s1IQs0Pcv!g5|tWSF4v8QbA58PrUtVc;V_>lmUS9J6yOpuc@_Cu z&Xs9xg-k@>5?P=Vp4-)FWmjr`Ius{s8J)j(P<_z7=Nzl(`_ktIYOoGJt&MiLV3?@d zea$Yqw}MJoz2uhdKj#lP&>b5Oy&? zgV}fU?6tX10Gp)HCqTGKOx~gcWuRoN{KXgRoxI>(YY4@k2?p#$Z_9?r3evs#>JMgdEe|56~KXz5~vwW1N0Le>2eDR0{^b=?( zg1WrH0fF$Sv1HwhlG=k*cU>qXG;sBjg1@-z8+#^%tm~=O(q;&6omRHClWL5H7e7bO zkbDfsKe_>sTy?JH zvJinMT>-*I!=#=8>|(n-|FP4}9YC+r;)MpRyQZQ49wryQKiTCnMfCcVoIkPWSZVOV zuJTFdW-knH%kaQF{g?t<1)F#l?h|fUaF3+00)ANEH>rz9$;>a0B^)Diz^WR0rXq0E z8(@FFzjCnYhjp@#&VKsg6ia*qR;dhl4D2hDWF>K~%;!t7z>VM1(V|HJhw^4tQZ1!B z46U$@SHY%O?!jB3e~i17V;}4?$ZimB0)9*#YrviG0r-aS)KN_+A!-Iv60Zqrq%gW$ zpxj)J;}AZpn@4{uw&0u!nbuDh7Q1Q}3p1<8o-TF&+AdeC=V1Lly{8@f>TGph&Q{{N z^uS+xo1KAggD7OL)j3K_H-6N}{dcU zD12E6Xh(%8vq;&dc`(4+hZRTjLE~kc& zQ4Sao6#)OfmD!LJ;Qbp&U$(U`ML#JK?p?Z7 zOR4)%5n$X+vy|GLK8{gEptwEzUL+W`K(bBtEd{SXCgBz6ef|%gZr1Y)GNMZsmceiQ zXxe%Z6v%i_)*F5#*z)vWc&kb0HA_7^5MfTyKZ@r_$D?w;4F#B_p_*&nh&oJ>hl*`m zyHKm9^(~}55{yJMwgxJ;0tvg{V`=L9al|JD6#RcdJ^b_#~_x2(KcAEn= z=vec>sr^V(FuVh;?0nxY^ce&3XK7wNz-rq96BV>+eh)cn2>cE)cHbX*kM;XsTzzA7 zB~9CIY}>XqvAMHj+fF7nC$??dHYfJPnb@A#{PI5Q{5pTCS9h=OU0sb`>(X6CB9Fmz zQdeE_u0}^@yP@Pwirx0%vZwu^djcU(fG(JeEM=Fvi5bJrBRo6^-Ti(Jo&bl zx0~lcd{?hzD|2_P{e_vmCqVVLe||?j|pCq2l$(2C(Bh06uGf$Cj8Qj9Rp*V z#w#fQ&Sx}a-xYjlU6U+})1;VrguNXp5mg%&;{xaOdMu_@I~P~@3v0IKmTaP>gff=_ zp4PJQLjCB(9c6nW@40aTHlg8a)TxJbVIrI+9xiB`X{XvJ#-fnYF!2b!$CO>2EhgDqE7)>rh@n(9Y zCh?zP%qCg3>H*msS}Sn9>jI)H zt5wB5&`tkk;M%u@`yttN`!yYOT1@{r`<*c0$5m?yk+aSMVsb&c{MtEq8MwTXgW7HD zySdwx|M2j&;sq)w94S54Km3=+#uW_cCxT?}S|4So(IYj^9H)fby!`dxd3Ev6)8dG8 zQ*!t9dlvTaKicMg`n>4)p)clE=u4+-6N&|94R|p>6A|>~4ZHU5SF<+r1$8ERyJ0iP zc12RI`sAzcN;~HzC@uzSJjjc%UN*S6*S|JQZxX@#z2@XL!H&C292 ztT6>XPh~GOwp(vCai7`%id>X?9|Ho8E*eUEM zhX=(%G2lRf9*D*Vgb#UBWh265kObqr#R-wwWA!nQlns`8hpq{GQq0R&JqQ%+jBW|S zEQYfN_eHt({0IA|W2NW0+x7vfrHbS^2Pg?NCgc7OKn$`u#n{kX4+!wQh81_yP8*_j@N{3c} z%2;I#N5bisjAc^k1Rtt%_vs0YN=H;FK}>X zuBxwP4Q{_`W}6RsukI7t^*1Aix;SDMYZV&?Z$?|Z%?7c`7&l^xK}+tMQ%U+b*=WsD zC+Qp-n!=K48iaC{mK;ijIP(4vPX50aK#c0KVmoye|G(lCaCJX)%~?+pSa_5P`H)lg z9EjiIf8(N|A0BUFi`2v)thrBuGeruPerKI*sNwH_sX|+TY$t_6k=q7D#*yZx zu{bPE{Y0AR`61(qy&uSB%((v1sL*0|%TD~x7z6w-6+Z%a(ZZKLF1&6n(hU)jo@6lx zHbDPb%J#{bpzr^Z;6{UpA6J>muQWFsGgeU{SO#34&;Ogd-?0lPP#4t=LrP(s}ah`x`Fr3&24A(m&4RGY{P2gm5Xp zL#1oa2Km?B2*F?Z2tN}FT%0ZQ(w#LTcEU|THqGtH&}Ay)ecF&D;s zrjp8EgJFXf8KgEb)aT?kICn{eAE65nOK^eoC(})}m2qk{r!>V?)_%_rqhcf>V@l94yLf@#*wOC|5mkuy)HEOZx@cLmEoLaZZ z8ah7Hx8Twyht6xIh;CAJl1h+O5MLzQH8^w*F5lwH>aSYOWe++v1(Cs|)6dNosAuJy zF2W!;D5Kum)4i3RIWN%YO} zK6Za}JIuwzPwnLB_}2B9c-XU3pbdH3MfwqB518)3l|&D&*lcQBlUGp{Y7fuS4<|Hc z>baz6@zM0mjG4<}lsZ;UV)yhg#rmQ$1$BFp92)HiEqWgOoV@*y$y5ew zTeC?(=?{kxuTERtS?p*5x8FI_8RJ;Imwri7ySHT^!=PDi_UAzYf zGqB$*)Gy8B#nCU8cfz^49ngbj#DRd$7}~+z;-R0pBDhG@hS;;_q#Dx9yTQ_Vn2|%N zp+49h$YXY&{SyK>M7^g3F5e6op3zAgGV=QUbqZx8%|yFLpk^yBbEQ=T+Zj1|=f(h} zp^Asg`w_%%`7-pJzSrP$pVoxy2IOlTmZ7JVZfsbILL!kXArYq)UJ02Q-o3wvKKl|-VuIs1`$m^8H8QyYsdoFA zrSs@jT4g3c^506R_~#f_NaECle2`#F z#s#J`(CI9e;2!k$I33Mk>p5F2@{o4MS*av&a|&3i^5R34kYM3nzK7~LBqb(nY0Ty` zt^Q9p&;r8G-sbeM{)%p3U~;;A0E*4l5!QEy&EHRYWaA9 zK!{)#XEvL7hY0G|(fqZoG?nnI!#67(5gk2>Sw}7q;$#5f5y9rijXxw-C-%o`*$uh& z_g@&Lfx3IH*Ub84f^SI$noH9;q(*QNx&z(jRd75{0u*=wrig(HX{0;$Kj*SQSERga zJ7?rj=nizp2sV~p)n6%`;2To8Wy?DAU9I3->>Nk}W*v^lf82|cOy04?bT4jZseh_} zzc7FIl76JZ)~O$wR{Em84cC4=NtcO!B;5Y{#q{t!#zcL7uBsk_`^H;0V+T^dJqD!v z1==alcRVx!+A1HHcXXN^syqve$vl+3b)pKUonSOlwsN>}vTK?nEQJj#oOxt7K^R3` zaTg6~c*#72Q?w*AXl8)1zwEZ^Olq{~vR-?AX%s7RVoFrfup%Mc>WQ`B`LhHs)4Jqd zze^$|*rjm^PiRc0$9yF}Do>3pZ*Kh&Vsr0D9hvWjaxQIs2I>B zhxt+|ZaHhUBu|r1NsDmzYxzZmR( zA{_Rwn9B*tp`HFMz9+qzJyuq(RHpiM9B0!gilm4^B6Mq$3YMWOc3bWwdop#xZK1JO zg8KM%QOhRt{a$Kv*NWld@S~e=Dkrd!kHw#-DIR5_*p1-HO;LJ6RItYk{g5s(4^-j5 zQBGl7b(f)ab}Ny8S;{5D2BWsF@?>g}L7aear%cwmo%5lZ$16D#B==N~bB>fEo&845 zMDCmN17(fCb|8%NZWi5=OkHLvn-&YFo>uoew5NL>#nsj$eHPl&$72jaqSX7o>|!=h*az!7|8O2o=0#9N zgkj-F&geW&nFIgG%pK_3S&1$udU60MwGavMxE@(rRt8rvoV2-Od3}hV6{JQouyJ_OL1x&dsRDo z=_JG30S~$LKJGzdHt|u{TJb2)QVEbvVP-eCm%(e3a+b{V53?@Q+hNUHpL04TGPyt> zmmT~`xZ9W$-P4;#q}+ysdTonYB~UPJPgyj>#s5`sm>qyUU9$O}C~|(c*HxDWypxgi zp0&|l|BG?MOBrz17&d|QR7@W!=J>BL!m}OOJbwISfGDu`*}iN+YjgtLou7QHDj*pk ztc$qryWE`$tBRIFTZiTUVGv)Gl#)HMz5Uw|5s(qZ1WKF!&K+3R;$S8^|5U0RRv;aH zo(7DM*3Va*HdK_a_}N2N>fgQNS>CmxiWU<)8m);LP#aqlEqF|!$nDPF=An)k#sgB$zTrJy;|XtKnHiXp0gHf54T|~ zhGMv%xG^}lxJMpLZhNc+O_lt0NX1jDQ7`fL+Q1q-bXZNIHXlj(a`qc8E_R!Su-lWi z!}tr7Z3C3V=zI3>tI~})Yq=PHy`F@n#RN-`cX&#a*kdpiZZl#s9z&GlQ9D^Vl*^=x zVwye4ftCLHAg7hT0wv?(zA42-k-D`67xPY_=-L#okf8iiko_pZ6$gykJGu z4oECP{?G_i&jO~nmB<3Tiq;r%E8`2rBV5m7l-sqf17p8TZn-W)>3Eawv(y?uoB3%} zoU2cgm8|xbPzS1n(H?AJ6x0Ajx#YyG%VnmjM>Ob5RkNSy+hBXgmcdk@X5f@pV|5^j ztH-SOGx5;a;0Gw%(gvG373P1ZV(dUu}ze*Po>A&;!cSW;@ItV55(}qE!S9)QJ2bBRBBG@Y?o~WZTeqD&E8WH;?Bx**U5(La4ji<_1 zjQ_1=5ZDiD8Uqdqm?10RCMSiQ#FJH?1H*;fcMym;W8rL0~Tv53DH0IFZrWV`$sYIa4VK&Zg@Tl6y2f{It6F z*y9Rrm^X?Jbjev&24=K}Ca;CJ`d2^|2mG+0!|CBD9+F*$N~jdMy~g2z9~BcqbJBUh zVA+3mva(NURX?1KQ-+@Tb}C?iih>e2V=(?MB~cmz00@V8Zztq16(^{Oe9JG->Ve!V zDWuk-g(oX0tTVjq9Q1%=VzI!k0+1{@LisiAuH z5|lCs9PLq*%AWImMjBjQ!)m2aa*t$Q+YV4mT4~mw!(2!a?TEN?8~lZ@ojWQVJ^o*C za3b5*z^z@Do4(3IA#V*C-SCF3&V8kLi7tTS-rJL>WY{DNz}kwK_E1hiYBtj!9nr=p z>!~GZE!;`=`GfRy@%2`);^S>OzlQ53|2UybaM<~x0G8JR>AtxxH!%6>O>$RFdC{4a z^?=)y3Zk9$Q8A1eOeJB)y!rj@D8dyvbftiqV~L$o2@hUbfWu`&tURROmq<<<>St3QIw9b5Zm|S1>&_ zS6CsVa3OVcAU}bkvykMb^8x0;;2>QMd_}nN6BcbL%ZVrR5?{?*5ng!TOP4zbIiZ>V z-%{+fAFyh&lo2J4w~N7xRnp}!i4wbvyOju5{3C)#QGycHf$&O9=+KH95MWv=Y{zaK z3lB1msS72tLDA726EHj>(o!?lD*%WT?pknq;>1};@1pk0={qujpraC69OIj67{!@% z5^Q)T-mq!}5I5dVDS)vACGi0JR?rb+pb;;((o79togK*_J{-UJgj!i?S_xATc&DxE z8dJb#qS#I=GIA~c63VGg=g80634TBtc5JFRUim~vCViv6&Rq$N=f05@tUQ|^{I18o zOq!y=FAuhtFm8;Z2(hWM$1YF$7{xFSmiP)&Ug!Ui5lqA5g%DQJmM;ctVkq)^bpdZC zTnO~Fy!Kxr?vUWQzjFgoK`#a@DA%|%od_HamGa#kiHS^wgfq#*gOsqJnFWs2pA1ei z=i?uG!w;JoWL)v}sDR{feBNh3r6j7TI)Z+m|S9;>U?;buP4GDnf!E=D)$z%XhLdS2VMYC?J zC#BcQ0g-J)#{6C6_>td|o*K6Y;o>cqpp ztQTZuuQfPo_Oq`4^v`)O23c$1YL~v$NMW`9ahw4qYB(XK7aJh?Td4H&+JiuN&K3Ce zl-QdX@RfPI4Z~*|g6JHt%C~-nl8gHep@M@y_};zqmYo*NB>T-N&|GW92ktFyjeFG$ ztZduUj=SqiUdRGO$7#kjiB{-S;9R19 zQ<4UU17kYdQ+RZGg`$0NP#eJl8(TV7d75kzD^W&uCc*5$052_kUFSgJv67MiKU9F? zR}lLPi|f>_kN`I@wN2E+N_I-YDlf>cFZ zd$%Xl`y48686{U6;`F!Xj1JAPQSq>NySl3B`DkM50#E@iHJYZTmU%LLek#bh*^S03 z-#f3Sn9|{tC z7}Y;~1!@LEs9I`Nd=~JPBp8(R`M%5uwDbm4dlGp=S6zHW%+>bA2Dn-ueqaUB0pTj~D$etPC$MCj8S=~CQEvjT938ZV= zBc`3Tb7K6ew-T)hv@sEZ$%58EUg1rELBF%xZ-A+Kld8dwWeKqv1cikkM5X#LT#1%W zzn5KiQT=^(ug%3`1h*0@hF%*|rS9@uRu?}?L32={ZX6|~V!G;uBxLEuXu%PV3%-W8 zwloOSjzDAB^EsFdi|VOPE`)I-oI)*!Sg>Ff0$*YDTX^V zLRF zQ^OBqL9|D+gQJ8>tk^5$$W`B0=G=g3QrhR{GJNLer9jiaXWdRDmOOlw?~D(%ETT&8 zh&qrK9i4tA<(57Kt)Cgb_bjo`O*J8QDm7iW{0XRyuf(&XVnuAjf?p>`zYs=l-(_H# zqK6ac5Syd8CwaiC!qu60O_=T^_GqZsQQZ3yl}wlg)UYcL$Q;_jsYy@WlN~3>{SJR) zecxsp(kB$^fL3fQ@4rF#=wsN|7x@9H%CcmOCb<#!)Ab=Bje(AP$XyheaK#WgLx#45 zp=eamDfb&x?3C?&3?@M$gms9>=?fXRftYnan2G5I0lO;=TZy!*6LDZ1cHpL8=BPLS zcY3r~9UCRwQ^>{{CkQlxfdD3*1Aym|+Tz<%{-~sdQ_MzZs?mnatzcoWv#~(Fgzqfg zH!5hpU<}*p;677p$L^4egh`XQ&~`S104$F$w_9-Nzs{)x*B2l&HdQjpNhkX#u`iMP zmyGuH6|bbBqsR$OeY|rUkQS+`NeUK8^vpOo4qNx#nb_Xz@V%De*BjGiQSv!6)tq&B zHj~$z`xVg|O>To=1kV6RB997%kiap4(|}*&{uN;9J-n!!WuDx>pkjmb-@b*q#t?m@ zM8@zVbFw)rdiARQcvHByBez3JMBH}JGkN}S5_7psIQ;|=!K@6kxG=(JPvKmr_~ZdE zeqyBVxf3tHCmJd$9g0l}v)ZrIG0V>a(zI1+qKef*;M@p}hsXSNroYFn>Y-nT6H|SR zK1B>NNhK1!f!Q7<{B-nsU;aNI&*jBcb571jj^XV%q6O$Z{~tR(qCi2*wwrdwoE#j> zHUY5BM}k2&5ZW~PRa-jKFt@jrc!$N%+?5fgTOJ}4@nLL1E9m$JK2g0tc2N=^{|tUz zeK|aS+I}tk9eyC*Y@dEKa6c5-N&EG7w*9Zp{9oP1qlQpxpVymH9lGogpYiYSF)u0C zu;NQZ0yG>Z9>aZi7YkE8axSGb@ZWe}&uwt|9~W_~>GEhJTFmnzEpCM{xHamYGeX$> z_Z-@9fe>Z4OxOoQTxY?|MOXIXlg>!Nm1x|vW&17VNtsixVYy*pfCjf^Jb`p9e=0VC zn;j~gn<+sj&j3@trR32o7(BQgV7QMooy@+J5ET^G1tTA+UEHDeT(rrbdGP_|Bez-v zvO0~x0gg5<8#j*xlWuDP1k(KnLy&S47l+f^%|W^1jXLZfRe&zTizww)<~TTWh)uy7 zA&#O4vUyh(>6P--e_P~TKt)2B$#bZ_4>2u{d}0hJ4D7bY-4u?tr?fjLH1iV*)e9-D z;#e3JNf3=y{pUub$fg{!UXVpShQ5(=+z|b%=qjQiJIeYgzidD26OT+Jl&4ThlS$rR z%qLV&{7{|scP~A}oF4AiEb!tVDs}8pOXBZqOP<8;{i2|Co4kUNy4Um(qOq7f@rb%F z4(B4OPTX4%=H{Us<;mH$@vX5B%%lV1Erua{9B1cbL4NYbko2j4h{XmUIZLEHZRbeVUJzR64K-wU}IwG@H6oyA?3|2Qn zFF@#5j!36s=NaF&j*r4PgL|mdg60aS<;kgRB)dlxnv#jjG+lOka|bP?b}nTcZ3ZaJ zfmS%WS3H>L4a8fOFjMvjX8+N&LraX=v|b2K6Ad>eHJ&bSev$x;F_mGd%~%Gs=KGJB zB7F(p?-JBGR5V#!gI6MX?H5tIs<9AOXLa!E$HJKQ#rrQ=t?e+!@6TxXi4U69 z;9yhzm(mcQKEwt~OH=QFSw7;5Tq?8QZma|8NfT`swIr=N%7^qvV!T3lJa;=BHZ2iM zj#^GwIZVtOh_9PsK0~gB26#O^c_UGu_FhxUz)_tR{!gOy=^C!AMi&{4GG|^)74^z4 z-bG2`IowoG5UmB?D=|e^c5oezf&)Q_P0l7{Yc_iJSc#2HU~bF!TEWm#rfVtNUWIPf zfjoa`FFe)!woVpEP)Rsn)gPuoB{pcn+=_)wSo3ZgvzCe%GFTb4Rix@+5*vup5zJ15 z*cr+h#zI2bP|P{VVA$zu2m?Zw(hjh+tccJY6HC4g1yx z&Md;HhD?i2@)^=dSloVM8=Te#%&0y?&MkFexA{;qwba-bnCcH{!|J{EYK^Eh)ePDo z>Ae!I_`2;q)R0w^M=W)rI~k;x`tXsk*9BTKo)YGf!M)nhNFs~CH+nbSN^gt(@z_fg z99c-%=u;_Mr#zbx;4T4_4kmfmXWLU@__zrAeewun%ziuj+vXOkk_koKi;u^~atNg! zIqa_@>$0O(h7ib2l9T}}@hPG2Q6x9;=-8Ep`@Kjg%t78%M&&p+SuI-YfM$g35Qxxh zz)Gqqw*44mA~vE~GZWO1%^IY61l_Hkuuo1PX@F`%H!0n4njm`u#%qt7bbY)?1!77v zWom4`N+a)u{X=9Q6;a|5+)doolr}aRVJVf_S3Wb<`gcqLzV=gvD_O#y$fM!0PLB`0 zE7diOlDOH4gvb?o+91dNzzGV_r=2p|#5a0suNiR5(S*5D&1;pb*R#E|u%yFn)j!+* zWKv8x7whBNM`1ZdVkEPu#mo4w4oD4U)7rPk`zOZ`atF&_>U^x#O)q7j_DUEuNT*$; zur5`N!j2}^do_m>Y&-EzAdGbg8FS&cM`km7liRQ~53-q^ZZ>&s*~~MDnN%^E8BkN- z!R8lf5BVHM1I^VbR1v`SDSsoZzQw}wPGJT$B1BK z(_ia>1#V1ExRQPYo{l=7BaGa)JLDyHq$~!{u{;ytBIRG6V$Eth+C~wLPBK%4!AyKb z!pdsY)#~Cp$BEsv$pnhZ)IFLXOZgZQ(D)?1Sh3}oKt(uF|0VxKbmJ;inh6hWP@o7w z4W1(0o@xzZiS~OX6_ut^dVy=f!BP%lNhNoOQ+2LuzA3KzU4=4Ad>LMHqd(WVuvTT4 zLm;Mji?r~~HNi`GgCJ#5_pfkR@>N^m~T1F6U`@HkAKcn>;X#F$phFJv5}HQPb4q zgkDEUU8+zH2|0AEkMXY<7*JNMtgq)sYW?2LlP-&i0`)_@K0WB~wjBVXiu`~&UlnZt zjz<$r54~ihQ9-zZBGAmaeuT9ewj>cIb#Q<)*lejqSsG&U&=4P#JpaIX--jkeyj~Zn zm6b+~k!fDk%StBjkm>prhlf@O_~mC3p+WRnt2{b@M|*6Iqy3{r-athspZZ^8&!TDH=uq}ujBF!3O1-fdk!6CHANRj=6 zRf@l|YalMo>++sN-#jQ$7y%#2D-;S`?a&^UX$IMem+{J+TAe$T`o89pun~aw>2bt_ zR0S)yc1tFRmXfGFi!9QA-{|0O)yz-y5tMr39C0T8UJ`>B1lG4rZX9OCG5Y(aSG^Ba zW++-idYzZ}Y*uTHM7UhpbfxpKZ6ykuYU15)`tNAxIy|gIA}uJ*?GmHNLC8{bB zAtmwAVw`W7N6tIjg=}lx_s1S|Y+w_EZ^827Z*p)hyd)q2vg4e$w-!mlRrs8|gwq6b zL_Hv(O4kpuUKewkyQLPX1nBV`yigVER8-p|Dg;N`5Ad4LfB_FBCBcrydfXciYTRp_ zMS@JL-Lxitix&IEW2dxhxJXkaRseW}cuOMN{M7Do1-`T9(m)YFY>D#r{npwcg_5+C zrHRD-i>FxWrBa+ zozP2dRzsfL{%mN)inMgiPyd^eq=YnE+7t{qjkQT9Z7vixkr-TPLV^yY{$ixWQ;{rcpGh?f^V%^rotnK=1y zD!cDCg7#6M5zeDz-?DEB9V`&@k>p=&+y-xw$U3Wd%u78AV?yXr6RH1e zsC;sml%f2i<*HT7Cur@~W_F&xyQprwd>0*MK&S0)0;JOuXzH&wiVP*WVJIb$6fj(P z>8Z%HsiB`vG>HXi`J<1Z@HrJb1*BrCPT&P_nX&c0a=(caxX%6YyX;cSH)~ZV^D46f ztKX=`!S1mqjihl_|NS!bw!VqMQh$YH&BSO?lK{E%o#Ps~ODl*Gy}050c1T&QVv7e8 z%nm!C#DVfd&GjV7pA&zJAb$lee%sm3>xvN2SxUpTt~~b88&)HbeOxS#GJi+;?u7rP zDtdy#m}Z4lahzRr=?-F;ARj184o0U;o;T5^ zBlph@WDWkO_q`}y&oLB4G}~fq0(N?3jJ0WLboZ9+CBTtRNDvsuwP*_{gjS+a++w|f z1pa#3(g#a1l}7+idWW!)sWL@x@MMThFnxB*cWP-DJx<_?q9{PPO3>2|NN67IJe&cW z>0Z(bPPgacettbizqUu45X_SP`E!i8Ce&}M<#W}hMZX&aD2S*=hA#a&q#GUjFdT)w zv;RZsj}St?#2%fPELR$LbrBz91vYV{TiHSFv^3Yfp19d-CZ`%^s|2C#`E-x^xhNaS z2<;8^*6&_wqoJlnTet>M$c_y~Nya9DCf9oIgQj>gC@hL*PZ$SSHSJrwid( zop4N|zfIiP;rbx~^!CM@MuLzi?H>G+s*A-NZ#p$siy-A0_Tfl}${O!d%lTM1O|vnO zdDNxkF#!j#gaLB_k zsPA8+v=as4GBAJDzl+CMRxj48~(!G3=vYY%RKd3}33hYqa2zQngjKJacCLMJ}oU4@*r3t5mfV9g#xYV~Nj{&Wv46ClQ%|yC-`A3sxVMy;fC5KX+ z>zD1R&0DXYYD7y_q=wL$uF6mXTRj-MZN@4wI`4ubqz|Kq7GHikn~IagDq~(@MrKkY zI0IZA@J6@1$o!3N72dAsyi4yQj@C3glr1ZxrNI^by`(B#M~Cz8^8VW9f@)0PS$Lf= zHbj!b0;=k-2!T9UP}Qa9?<}s;5!p#8AQDDYScr%r)i+W_!)QU>NqK%L?#<+)_XbqC z)L7opzUP1k^*wU>CG&H9@RFs0uF(J(FUO`Y-ynoKMM{e3NXEnCg27L!wxFpBa8v)o zf2OlXT_7(0XBY(dengcf7l@ENa4?EGb?#fX)OlT0u(*&;Dtu64UD~d?SgktfTGH1t&K3Fo&d8C&*DAjY;-Qk|$`1c_WZ-v^3w>{W1U9GeOrZPapPQ8RJNt|riimq6@DpS#t20q?<15cf+-41`u=A9G0J8%MkU zMnx7r4@yDQ!HXFU6SB8V&1eN^y0^Y5L!lzL%*b?ML_Z*p%o);b?igKreR9(YXQcZM zC8ggwye815=%2Ai73czK)Cp2*bu>pP3M^Tt?K;5D2nGafd1cd(vA(99PR zhj6oa4hFn+kLrC*`L@+X?1Eh*4=)ZyW7)im;SEdA11XCxS)}0x8ZRuPhK>w@it91y z8cya70u?b1C7ka4S~PMAiZC^{nCiM(@oZ00G6&5i3T9%wpGSSM`u||ZF_m%YX#6PW zbTVpu>0+LZS&`^BWYx3Xu-NQYN1Zr&3O2Y(l)&;^_t;I2<<)`!)sGGhMD7{A_8tmd$^#QgOOA=TfQYZS0EN+`X zfv;aQa>?Ego1ALn#_mgE&RQ?p)>)6w7|geFu~rI=R&M?Wb8oZ$JY!)P=&i_?DCq+s zycE)QSE7T7%X}CxW*hGH<<{H;k#hMdo{2AQrn*&qW__-Cf}d0G@Ae=x+Wv$0_KrPI z5)bCB2_CeSEOw0tQGsE|A5osm*tp2YHGO6XliR7I)~8DJQDCQnn-=_N#M(L%_q!wn zErjgQmnw0w-@)K5>A97Lp089ak}Ax+Ek`O1!iyQ0IHYkKrzOVkwqWJ5YmIGQbng9e z2lC+}Z~h_VA2$UD)KX5Qc!SMFYzxJO=fY5z@yC=gXv*T_m9vYk=Sf|ZG6s7nSz|gl z*4{}Q5`+Y>oI5x@O2p(@KX9$sc;EtzFj8NXz0lKxZtZ!Db>HXM2!$?Ge?67|?mFd) z4iN4o{iLzv`Pw{8P1~01+Z9EUim&MHC<=7D+tRiB@ll$chCP9G71o4W$a!~U?A846 z-ru`QjBEUsA=MMvEK@dwl(1!VtHKaRug6bhLVfQ6eeVNeLeJ37o;1R1+%WwEcnh#s zHTJ6dYpOu>Yk?$Q_(0=s@rNrGT!+n% zO`b;EsW_qHq2(S8{wIPZu2Z_wE(%1v0%B!3c8+=#@tf$0sw~?|6Pk!zW}{9p7^VC~ zDIpN2X{LnHq}WiU7gmQJ>Mm^I&iBuoRetvm^VLyNkc;N%@<-NKo7cO`D39Nlprwgk zR+5!dde$_8*>E8WM7ONc%_OBV)XKaC)Xf--SmUuK2E2d7p~FqW1$er!dyCZEw+S;S ze3f#wxfVtYI z_hyO2EK{gq>UNA6o$e}8g8U2CYl}K#WqGQ*yfP^`Dvnj`?6u~p(7A<>_+|#iaaB6j z)d{2T<3os#cYo)XoBR-QG!1k1*G2Zb#i-~*UXIY`suKS*bptV_lo;}jpQ#nshNk{c zRp&Qs)|u`%dL zooF7sJH6{0Szf~ccViIN`@JQy)u_iAG~FYWA<_Gz!kXVCY9f-RYWpsxvFOoJG1&!~ z*bxF+ot)Z2=AqdeD@}i4u-Ez&Gn6Pq8o|}hMogZ@T>2i;6(L@)ptyu|^NFMfiWcxl-?j5&MMw@il8-* zR*f`}oQK2Cb7y?shKA#E$?wW=8btcYD)eK0sUF*9%ivrP)G;D2i`KBDH^n_%qzEhA_)7(_*{(eB&K;up^9NC{ z#Ezc-`v68<2aeT%Y#}rWf;f2{Ul{aTe^MGld(0MI+J`u}G0szsM|R<{3E?c;X#tnE z=5)kLG)U1#bUYiMlzh$H^Qa#Qbt;##`Ks#h(IcaK_-~r3*N1l#q6faLnPiuApI(mO z?~?)@bN0qnX~xV6_B9S7X^E@k53VB$X^YJCO)L}=gkPe=Uv>Z=l%1goL?>omkxZc? z{H<%Z7p2g0Pxm@P_uZD^>|2xJTrak4m8Luag{;6N@e~{d82^L5JiiC%oKI&`DowgLmg5yQ=U|3 zr0mkW0M?n@nhs(tU`!<^oZ)5}S3h=uM{LhE{3_qSDftQ46hYzLO?adAkA5e!tc~qS zm+gu32B*R!Z;g7~cu=$Ey27hY`bC9k(XQ1G6_^~SA7`(R4{Obtipnh~fM{Ozh6k!^ zR&^iqCIWWvi6TEOX60?XW=#Os+R_IVXQh=O(NplHLP0xW7%-4b0U=9sBB;A&KLNsF4#i6QHle z{tRD`z*UixzEX}Q6Bx}u#>0Qxi5s^4G8+lkQN4fuR^iPB8pYmtSAa%T{?VR*jRvYei;xx@)RUBC~i43&DP zQ`U~H!;(;~9V1Uy0c8wVOu|z$Iyw^aQxUL$lgizqS4I%est2LrbgMP7zY@~!3O&C& z)3D2qHG=LQm5z6aYnHtYpmZZ{MPsl=HgzQRL)`-f24I&`NiKr;A|cUNp}#eXIECsI z~_pmym&7DV(zV!?E{!s%+&$V3bI2Ubxo$W6-n{W941MxfEU7Z~TL9S{CPP?j_ zqOzjgHNdaG@!+mkuIJ<7rN4s0np7&HdEgl)d5Tt-17k5Uex;7iS+w)9{3i;c4fRx} zu?PQ}o4sXZ@SyM2n<2{X(vIhS8hp2wB&%C1Yx$)T%g$}u9331Su8$sUUbcgRg6@AI zBgg9h|6%aGJU$<1%sct0!IYGy1oM3a)tl;g8|1X=^@T}TAV>$6q9=P0x)dJX@F0UD z@*HoNKdT|Zt23^?gY#PqQN(`{xgr_3#%kMT$6Y|&_frxn0kDB2*qgf!tyH*>F zLtn}Tt+s*C5)!UH3J{+wucyR@2S7-@xM#T%b4z`zJD_8%i8{-_6x!Sg@DwRp^AyFt z^pt!qTP(T!-*T^7w~Z41e{l5XO`89|K0JKp|Jx`pKrDkN*w70w=%4+ot%a}lg*;au zV?<9tuircUQHrrrnosKM;)%L8ZA-SN7v0k{9jyTRE(j=b5MzjS#QXo7-QvJF@5!8! ztrss^_TPrjDgE`CMKxA(*T31uSoc$Gf$8vI1#VEh{tu6ij}MaT|LE}O==JmZ-$wcU z_wLuN92QW80es#41qK*#H08d;9jbZDdjW_qRR;ezbdHr6y(hCFy$C-Rmal*0)XKYrDy_r`gj&BqX7x z2$rDaXcOPhejf|~65xwS$+8`9&D|%pNMHaA27{TwV8#!p0YQ$WNY5Zc@Z#_U00(Ua z)K8IfN#+i6zJL4HL5|$J9JCcuo+9VF<1D>Eo3PmYNW5%~kjOmC`9HFEgcj%#=ZKoW9dLzVQh3{+Xef~xSn0QV`2 zS;$87AITD^H!9^5V7>z^w??m3RrVK|FVW}Rg~&d$8Z!=eb)2SQ0;4w$XL^P6nD%3j zSx{j6KAXfWB2k)=oXS)H(eE7Oy_0%O%mNiU(t$*)uf^gm7Ak(JLaeHPnhytH~H22QA>m={`AuQIdBGJj{iQdE{lP#oZ&Z00I&G|fg+IOMb zMW0bbrJHwu$7a)tp+zi3TVxWab7P9T#iA%qXp|0-gX6g1#+Ow(L|;LtGIA(2XYB9A zeP;8L%(u}daBVSZWnw7yXj5)*u-U14mD^FNVPj=M<(qIkvqZNnyI3QvraP$fB~sDm ze*zhm`NhK{Be5;Yzl|NSzubNglJfdCLQ8J`kKYJ$8UD|*5iYN*xYexc{CQ- zwLaC~*q53#|NFM{);(?P|CS%`3MT*!_Wy%tJG({u|H0nDqy7Ibo_n+Z8yPRmYj?`U zv5qxZq$sulJctCkF1-G8TG#HW8Yd2@Hy1tjevu2Ky$&4f~ z*d)dYLC)X$-frLBamw;ZJso)63?PUM$dOIfWLncsnc= z?mD(b*7F?nn0VWd` z@z!fEFW(wP{rx*9DICXqy=cmU8MMVyUg1xLD4yb!45wjxiZW~5C92fW?*mEdc6>_& z>C!dG(R;Kiw&0TiAuH9Qh}LiJhhVE4{>zOUuG)3hvROT1?XI`@v+s^ykp|?JD%7F1vGV$+;~hz43Z|7NWA->1%S;AGX)=X< z`!tUip#mXMBfL#Z3ki?CtV$E^4_4zV(#8b6UVf0rfx5K$q8J2b$&q3Ks0gRs*uOnm zh45A$eB&lkiITP(N+lX@as5^8Eu17X2qz`_kZ%w;jK}Q+)Ky8bRX5u0aW$3K$5l_Q za4<_xbX-^cF6TOCfvdyoNYVqV@x4xb%RaTT-?oCZ3U61r7Xo>8Rfm$G9PN2~UwfTn zbcN?KJuUGsYf4{Xd0CZ4DddQRYx^k;vjThGp0^`o5ZD%e0Y+hPTct3}(yrKf6P!=i z*A7D2)m={q#u443+-w`N86{*yKEhcygt8zwKx_yH)WiBdpzCWiAU>XQA|caglwJA1 zB=UZ*E=wcyw>@u9sCf{y34$m%G)hS_#6AIx4B0da92p?R>pXpW0T}`lGGQ~wdrEX} z!4!vV^n^pW(aAKbnvJJVTUxJF$~B{}*7`Fr<9ynh{j%f!bjzn)%SZ#rnp zLJ#_kQg#lhp^$MV-?-1*@A+Sw^IsXYX0^Lt|6lX{&%NFK=Y{j%o&DY2$MfI2c<%E2 z7uvc|nVf;BjRzsKi3cDv*B1CDJsxA6j=hv+(W-ZL9OS43NBWO9a2diGQW6GG zMHY2;cAR|6EA_B{TRrSA(Zhb$!%|n&>Q^CrGVr|I6LVOZ+fT)elu^*N-9iOPo$1@d zS=w@l$feTI6k9_sQmofSx~7MI5*=VeqqNH1$5jT}1orrC!R%Gq79c&E>Kx1N(@LUi;L`Wb7p>#~<`t79(3sp)c zk9-KAzLsu(KTRN*k{O{(=VXRRQ=(rfT2H9A-bOxnSCXF#Sqj~3UQ~G<0c?dKepRTX zTsEy@WrF-HW3{^v(tYm1KW*ecnQHmgC~I+T1nMqWjB#GPup~3Fzjjsjx9h*{cI(z`n`#gd=ByZnPdR&0y!3`;;?`zt1F+;G@^g#TUj!6 z9|Z3xbjRw=`nUj@;czOmkt=J8P+aSEPyO|G^G_GPAG`mJ-G6^@|Mj){mcQse?TQ*-w<@>!n}I7!JJED< zc%%-)YYJwHK;Xguovf<&8nO}OKWSwCJcaQtRxpq!Q(+uu^tM=ksMY^l*?*LO`Kkt> z2K&$c!Sj;+=iu4%NBhrRJa>Qp^B*b!9}=un5GaX+xGIxJa!AF1Q#uHBPO>mGFNhwW zo@h?Z&7;3Et5rm+TFLf1E`4{^NtpVoeyMM#Ot4w~P5mmKPn{a4Q3lNHAj$*D8&U#B zh-+R1A7PNLL9@CrnQEtaUP!QCu>t#U#}Cux?LFimj8v)nR)$~c&! zIi7?n*RbeCcHD*4c^H!E^J$cl5h)#Yy%dNu&$%vC4pi}3JAG(=k*OMs+@ea8lkHE2 z$JOCcgI7`2<(f+8QkI}C@`nYy>KaD3T&n)gglxc=c`1*Wq>z6X6KQ>inJsd7^$mhf z)&WG2G4s$g?1`l&^vRB3=TN^NM}{M#^OIDNKX{H~h=QY|<5 zS&&$T$hO$-bt-+k(nJWV$`ecQ0U;t?%wvM!Jll3aZDtJG`{z_aailQWM6%^-2BB?L zxc+~$w0m61KMsP~QkM{pvo92$(28^Ap;emX~-jv^9tLNHyw<=F`T&7i%vITGd`El2wf{|B=j* z1==YhLM4utN8yQJ^R22i6t{yAr6G5*KOs)nWN%-%^IuE(Uj>7@t@Gdg{{CL+{CEHH z{P#|tyO;kBVIGq5<0Oz#$|}v!iuQELJltVra6?(C9E)smys1(f#*TxdAYcE5X1mrG z)tKSwr(?Ao9%)Wlid`mmxYG6o>DxWEdu9@?GbZ80`axm|FMihKin z<_`vvWlIF;&XgRZDc@?}gS3Jt5&Iw7t zX~3{_=I0ew+&bNSw<4lpwMG0UlV{h^ z^JYz3X}T&wW@)2}G3XaL2H4_~LO$G+U=gB|$uxxwULb%9@zWn8%vA&rkH^IKxQbf zJF|Xr8ufI}_c}kYD>5U=wgf~cLd;YB z5?#7VXetvl7MQMawI%7ulG2}&OvIc_NQwiTVud<2GxeH%6^7TrP7$nSv=vkTa)r~4 zhM=Wg^cig2|HPB9l3&UNyoix@b(1$`^2;;pE|~5`-`C2imgPEMtc?5k)IV+He@PiD zi~o)C|MQ)GQU2fEd5r&fC(oVxf4=${i%mdmIgv7u!^J+3Icm2RlR3G05fus%>H-_m z`?e_gc1Dtf21IbjWE%PC*&h5!C+E}QkbXptTbH`zMM8u`DbIAFo1)M9aVX|B z5ON9())S%)K!@_FXhZazXIDNsn-KFgAhrQ5H@@V&Zqb z&dE^U1(86qORWa(X@0-~c!z7NqVuY^i*YUrmJErSPV~o&R&<%#0*nF7OBvJCfi+x*cOZYjYKF!4N z8Fdtyms9t0lmrSt-YHF1Q%|vQYp1#eeKHq|(ddE|v#`_}mQ98pyQ#KIr&4szJ74wn z#!IOZ>bjTIaTu~I^Hv>@B9FyxA+I?yiJpMSFcy<(m{K<{WT=&hM#yKA0o*>*>9(6U zWq?z$Gn?af!8q~IHR^s-&RX=ysl zJN!8wWiD}LA`a(bXTKt7jAvpHGm_x2h*2&$zZvxTw!N8b3M~mR&D(CFqpvExEPobATe%=du;}b(j2(x`pGP$ds^jpR3MrDn-BAqGm^P4CvukiwZ@q zb4li{n9ik4^)wQMU^jh*SLv~KJgUCZ0M3{kZB8ppBr(>Lygh`t;l8U^IzqFS3-r|U0rG%hv` zqIs=l0bE#u5|SpA%!r^YI1dUFf`d8oL6i?#t;sxGiagacTzjoxH(F)3*C29Kw36VR zot~-~Kc`<2Q)k!dA}1u#C>=YfzXNl~#2kVTnXSQFe=l?%R!hG`vBVEfgSEEC!jr-b55~A)e0PB(QI7Xho)^qkQQ5h80X{8xe1G zC`2&+N0?#Q@z8r3h6v92hBV=+jQc}Uk|>98wLSw0Om~J=}6IL zfD#-9Y?2{Pf|1jST=X4dA;FOi>iw8N#Fmr^#S-!PWWYkMhui=cGZ5oUro=-hLlE;* zCdqyq@k<)ZC`nwa+!47FWChqM?oeJwkPAx!h<>A@8G>zYIE{R`44)`BRa|5uV$Jl$ zo+SB32D-F3BwyS*86sS(5{D0vv68^s56R- zYcofl;L|ym;JVWqJvNJ2*nhZg0DK|i6xifEro19hI>xHPlx!ErO%!X$kg5t+4tmc+ zXRso}xv@wK=u#s-2EtVfxQtOXeTv)gnE2A*q=xWBet2TBEZL#FVKKJ6dyP^@dAG~< z%@v4q0we4!gwRq#;t@=v;O&aR5-b+Zq;sP2X0v_|><4)PSPvcigB zG#UOV#i-(5KTT=Ky%9-&B=heRHW52dw$BSfbdXoro+?t0c59n`r&E2_HVh?1(`FJ* z5G5+du&{MGmoIUOK_3hmyPU?znF$d?YZEODgBe^!99=IEAdRpmMnk69soZMJ&z?+S znqO5W=jvln` z%c7uRx?k0^ZiEZS$6Qm^xD)#s4W8|j$S=9NsqB14Jdr|p021LrNCGT}1#y z8CbHqBZj`Uu0WRceW_ga_8oXn$&`i3KTnfvBwHc7A_>|O+s<(qk1^_ZyYlCo>4YTI zNBu6^n#OUt)Mph9@>i#BHA8vsQ(EHGbrr~nd_0rx2FGFe6HUR&=6v|@-oOQfZTc+4 zPo5^|pe=ASJd%@PA}?VrI6j^Zhast4desRyO9K~(dNZAry0-vi^_4VB`HfA2t-1y@ z<%AnT3*4W#?}3WNxQ&=lD6S}nn?4-TR7Ja$(vjXrm7>!^Hn) zf9YJ(7lJ$Al?+c2pf3vK7mu^>+&-y3jWY`5fh8Av#1)##Z7u2p^brnz4B(#i(e#{C z5#)*|Ix1jXshSn#%ldk>xYEKyQebA~TI$ml`2!Auts=$9UwZd5%gCS?ADj=48H3N1 z$eZd)6`;CjwWE2+-1f_R+VKDUcGYS-Km-5ZJvb=d|LFH0^S|89a}WGK3P_Tf_T|Y* zc21J{-NYmre3Ng|xg^^2|i1C#e2D}1M&PoEsLm9qcMS)?jynx;S05r7n6(JX*CJ)mqoSnq6%P5}i;D zn89AlHlCsdX{L?D^{x=Tr=8c(ODqj|GQ~`mqo_>HIwy&kGkp)(Q!wI$_#^-s1;U?2 zI^_r;Zk(p^VXrsI11);WONO!@j}toT2~2TsoKC_Gz@00W9sJd5W#~)tsPdM49Rc_2 zKiNTj+Y+?uMjkwY=YbRSOBKyk;o2%%Ha{;F@iZfmY%OY1%P$6_&*~B~G*}Ud0N$6b z;(poUN}K&(o{8Ps{m+A)a{iCqNB!?^o;%XLs>}cnU^F; zW$Yc1RITX6b}*gvOudCVu726_zEn-a#wMI-uixrELwgtORWy5t6CKcme2iI=BEdm4 zfa~j{&8^GnfcR+$$kCQMBg(z-?-%V*4AQH{c3@6gHMf#g!c@3{|A`3{7v#4igGIuj8d-K#3 zKpFO6_yRuBaY$in;o=WS5hv7NHDIF#oVUHeoP1xZ3VWkl3_xCN!&J^|q2=+r>q=}P zdGhC>ZiRjfKl4MtS|~NHnrSYH!y%R0)#VH}&fG#jiOhRa{#t5@l>p~fUojfxHDb)5 z=h){1)khz&p`~vJzl#r>g>(9Xn31 z4h@ei>%a@KM3q!03b2I012{wxi(FN@4awE}1QlF)FUh=b(;+zUE=!44dqoFuHGFW6 z%f2OKMiNeb6fX~tkou`g*;Hm0El%=k{z=t>t*y2ha6{E#J(!H7mEW>y@{ZA3l_Jn74x zI%*Nx;)I}${x^HipLLrh3SV{jLiIMotL(AUlX=7^IEJ&}WtmzTd`2)#vLxNDEgj@t zF(_Tb`wnw*D!2%!U0rj3&(sv9jj#z#C1A%4knCL22=-NlA}7~aJ|jNHy9dw2lsydX zE31Hw=YRdu`QP*1$M~Oj^4z)p_g)ec!UHxwK`0UNen|~alvwZX@ASv-v5}+-igBhtJudffq8&T%^y1R{(j2UIQ zk7YoA>1-IzQ9{HpNu=&F;2EPq8QUO!ViYGVkjl7F<7mPnd2tr5=hbH*R=6Pv*GY)s zHU$J2bX6;^XvH;3nr79QmO=uo)+T%p3|5ERJL#d-^#x;)VekStq(5Db3iBsopUkbZ0h=90`kS*ZX? z-?cDrVdTni?hRaM)4mV@Vg*a2;ILV|`wbaricti>$EK@4Dul?S6!vZL(wzuiv{o*2 zpQJS0+RG#r#OpM5EH`|Xzg6E1$z7u(?iu1cBYWZup6_-z{;{qFVw;%%7^dk)^ zPUgmKO?jpPQMrJ#DjO?H3NarRGPlO1q9eyGU|09RHX6I_+AaiH7Y&LjUZToj%C%LD zv!D++3Z7_-K(+?7u8CJGHy_G!bFaBu^`y6-3=OBnESR?8`Wev!TY!7Z$SgQt%_X_2 zBaWNmU0)KB^Su<#&8j4alPtTfFm|qQK3d{ zJYy`aQ5_TGlVi170Y_}V+Rey-F;%Y{>o=>fi|e0}IHW$1NZoMCCCX60P?fkiOSNjT zRj^()Ry5*@DPFU7Z1un%4Rq2ZlvM(qlnAaSIhJv?$;|j~^`Tq7;IwWdgvN9k$!j%3 z6z^M^!lV;d)u+W6`?DBw+U$U9v*oN&7--Y) z6^uC=Yz4ek3^^^qtl5mC2eHJwuV})lgK|Ryjt2XMn{P~Zy3880gt}Wa-rVAHvxab! zb!P5J%Pg##dTTb!iS@h0%;sYDgPhg8`wcT{a>=S0GvBXjhFjYH!=e#etNo|HbFg2$ z|GT%dzxQbWxr^r>?LUH&UVisq2^sx${YD@~reBT`$Q*6GB}jJrhPEKHsarA#mC?JL zK}gkKi$TbSRbvoZY{s!c)R=J^jY@?<)f<(*G=tDfoZ_PiD*5OUzz0=%Tk^{gO5avkPCOSxm9IKY>|HRxlUY zO_{{n(ls_q_F4 zn%1@PH}`oJ4GVxiY#S2{q4jL9YG0~^aZ~FO0R6&kORbF<^`hHtnlNr>dEMA@A=lLd z_vfk>qaWOCwl@)G-0-&ixK@3Zwg2Sh+Z%xz{J;9oOZK0=XOH*)?&i5a`_HMQq}wn8 z8ASTUSc39C)tiIzGB>jc8ExH;VW=9xOIe2u5H}11Qvs>cM3iZlS$R|aYKAJfy?)Dc zLq|g!hOV^0yQsRgO2dk0Z#MU6O(_?v#B9BqUoKv+*H)~JHHDZd_rf->C=3}BxfB(e zvzX7GZAYkRqBtK5kiD!yVIgt0nt|IjFDxF}mt<&IO?(cBPXm%A1tp?mVn_>2^H?q2xu+2PErl0Aapqql99dtQML^C{Nqmzh|xvW}o!&(9@ zHqz`cTdgVU$n{&rIW_uHZA0qX!&#tD*S4`N;5D17j3F*bF{>G^767`T<;t9_FWY>j zjU6SCaLFmC5i4)e7_wgVp!JAug?r>hf6fj>n>h%`%H^fGfNqhw#^RF5nC}XqJqrCq4H#arMcrm(siE3w7h2TaA4<5?efGZDQcrz=8j0JUa*XSNov&hjdC+XqZ8 zwPR`^nHrLa3(MT3hehRUGt#!DwfLxL}_hKkp00b!~ za6CNhOILwZ{^N!kOQkQ4yVeAqT5)jT!H*iIW%n=tTVUQ z%GGWBz>3D=YA>*|lVCu(X?$D?RhbE~8A)c**66W%`7yV~o=hI96)`#b)|dv1jM_MFQO8=F6jHzK z*H5#oW6s%P)XVIY*(nU*8~P6rpKy&)F6BARz~!1mTS{g?-yWgr2@k%EQ8b!J^^Lj$kfZ zMUgMd@(iz>I$b|=W>6xMyR)Ojus%{wbn-DtCRF(p6g27R1Kk=^SUq%C^j~G zJ<4h$$HiFXF;AJ6M4;EvNP(h}A)!E?Wb3wLuI$y=Q*yDQ)}B(`E=MC0kp!nC=(WFQ zsnY&8wJ(dQv8m1kIK|aX)cZZOkn8iUN~Q?+GV7S7Ff~(;%&A=?O2>*ih{-^Ihng=*<2bn{(M|Cce`i`szwPqa_!;iqL2XB z7@uKC79)&70~vbDEJ}Or6m6EPX6DaVT;1hLDN^f!88#}%G3`#ClPf=6eF@WeQ$FpU zmCm_0XE?htDwc!V%B&(IlD?QG35jx}qT>_|H#iD1&Y?I)!G5A!s>2#ox?r!O**lz= zPLeg<$aNTWk*mwTEFww!@I&+=(%y()@efgjrXw4dJr^^lFyM7-9KCD{fCT^KEB>U+ z*0Kc6I0(=a*A-%sP`8dYMRCOiL@#g@ctQ)yNh6yb5d1gB{v{p}?sYcM z#h7x$r*X`Zlp{VSVF=zTXo6FJOry~@N=S%PI#U~7{vJm`X9GoKB>kJWq)|cnk)r>< z>!G(%I7cjknxac6CJ72@M7)mo^8D9xu|0J*&_*Ztn;|>0u z^x$9pVm#`JfAmj2i+VYr0roGaF=#Ek^VH*4ap$Qwz?Yq;UOI_8PycUc1HHouWmAq$ zUcTZTFHYF+#7{dO4G8YZatZsr!RTuO~JMkB@r+ z^La02G4**bltq74^t2($bir~xO4u|OEJe~73fYMIXh6~{LZYlAvYyxJY;2&5pZ@yt ztke1Jx8H@1yro`^zv+Q<|!b$PS1k?BW&%C}H zkO9S!+uw1MXM3GaJPpHB7E-^luYl~~9AOFmG^?1Ma)C(o~#FA)G|%6WJem($Dh_;UvNH4ni~~(*Cfxr&@gu=ZNc0M-qsj z%&hyW9ki9-@xeUf6uj$oIsq9>4RjCWVPFY0ax8H0LWgM1rs#@I!vKZ!l87&y5JWzv z2}U#;vScEcgWM6gIZ5)EP|)^qglNQ59Qi~68<4}!Mn;w<#cfzD-=>!hf&ZG>-$2In zBXcG?8%Pda^+<8t4Rk8_Jx@vGlYC{VBj83n>2p(AUWmIImS-YC;IY%;DNFE(ya+Mp zO|?OB7J%oX%YGJlO@A@v;=VX60-04QO`#21|BlFWhg z!$u&!L`KWvBaP}hA^Xn;prb89wiLp$u5KW+vl|FyRzy)qJJtM1<{2slE@8l;V^hJY z-V4?FN_lu9P9jc08HTk8QEyCHhDHdhj&CE*CIqE)Lbw2Mg(Fy$BT-w*FNt(Th#BW} zKtr0&WwRjRj0sJ65gS4V(zCmfbMl_T6})#{w_0#jSXo_aMJU7r5~>{v$8r0rathzZ z_>U>cq~CltK7B&jl?rX>{fq|B_DSStmo=}iJJz6sILt@vd7d&bl4y3AU0c=)#p&_+ z`TMtLFS8FwS{1)f*yPZ7i4>y2)of^gS%5A*J95OzL|lr0P<^+scq(Bxc}eCATf8)E z(rp`5H?4A)#_MaqUuVNSumH3cR+PQ?n^qHgXC7Uu1@`9c#jA5K{g_(X*bR<`cXsaf zaCoP`!trq1Xtzx+fj2%VhPgQz3XU{ni7$3e#)QKb^(`1jsq0`q)@b_4ZhgGre5g33J?XmeEr!%CtG#o zW6Y8i8DNe!w}b-gry*3#eW81#S2(FFg_5^abQs-E;Mt5`w6*JrQ-_Tg1cPI~^CDCS(S7boG);d{AxKToEY)8vY(E9W!gl`@4ouJ(b2JdbJ4*s0 z2pWg+7!OEFeOOT-;f~pajYveq%wOTTl!L_%FeaH@%rN398has#H6V$y)xn|ERIhfq zP-sR;g1SzWsXGQl7O&sH;~j4o#FfDta5*DOn~M;y(?MCRSdM*(_5VX>J* zlZ!@ln=k6OjSRJyBxFbu&8U81!yyHuBNPjmKNXq{%-Q0_Gu!=jw)g9Vj^qUQHnKn6 zDJQOvIpJNkOw^}nBqvXgA!TT`r>Ny;PKMJEg*3VZ>*?Qg+oDa+G}xxolqD30yq6Hp z!WnTz_jcjmJvU}Nb@Q&sneKgSLTodd$_j&!je4>Sam7fWO?S5IrcC|0*ZUT>HRX2M zF?=)s%V+WYuVNe9v;8zXs&Ig&QJ`Gek7MkQi3YQc^sS>^ZwGCO0*?CRbpP5Bv@^kT zAVa}@fd*iClaD@$Vfp)P5{Fc((0c1oAiT~$6#zC!F|2seRlV1#QV6G=4xr?)*Sos9 z@-TGKW67u&$|Ah?)5(ihZ_dHB^xID7=O`qc=bPnVuFdy?V~6+(2}UwXh-C0ILRSe* z;k22vVJcA62`En!I+&&wdUT&CM`i)Rmm}mHpQDp=2Yq*ZesaFud4F>8!`q)P(EH=F zv*R}xC$G-Y+cWgy?VFb;7bkDuoTInjqvJRKL_eOqdAW@Ul_tH9f^~AyK{|o0-Rqna zVl}Q!UD7B^eH7woG{qx=Mr=ls2oB##GND}Vl{gAIA)U}vam3Paya#mf{P;XRkI%h7 R|1SUl|NnpRLr?$^2LR(f(q{kw diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index bf1f650..11eae71 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -26,11 +26,7 @@ spec: {{- end }} serviceAccountName: {{ include "chart.serviceAccountName" . }} securityContext: - {{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion }} - seccompProfile: - type: RuntimeDefault {{- toYaml .Values.podSecurityContext | nindent 8 }} - {{- end }} containers: - name: {{ .Chart.Name }} securityContext: From 4b2d4a53bf13a1e55474dbb61794335cedd95a73 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 21:30:08 -0700 Subject: [PATCH 08/25] Add configmap and secrets so the deploy deploys them to the cluster --- chart/templates/configmap.yaml | 9 +++++++++ chart/templates/deployment.yaml | 7 +++++++ chart/templates/secret.yaml | 9 +++++++++ ops/staging-deploy.tmpl.yaml | 3 ++- 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 chart/templates/configmap.yaml create mode 100644 chart/templates/secret.yaml diff --git a/chart/templates/configmap.yaml b/chart/templates/configmap.yaml new file mode 100644 index 0000000..3a9b44b --- /dev/null +++ b/chart/templates/configmap.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "chart.fullname" . }}-cm +data: +{{- range $key, $value := .Values.env.configmap }} + {{ $key }}: "{{ $value }}" +{{- end }} \ No newline at end of file diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 11eae71..c8c2a99 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -15,6 +15,8 @@ spec: metadata: {{- with .Values.podAnnotations }} annotations: + checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }} {{- toYaml . | nindent 8 }} {{- end }} labels: @@ -47,6 +49,11 @@ spec: port: http resources: {{- toYaml .Values.resources | nindent 12 }} + envFrom: + - configMapRef: + name: {{ include "chart.fullname" . }}-cm + - secretRef: + name: {{ include "chart.fullname" . }}-secret {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} diff --git a/chart/templates/secret.yaml b/chart/templates/secret.yaml new file mode 100644 index 0000000..50910b9 --- /dev/null +++ b/chart/templates/secret.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "chart.fullname" . }}-secret +data: +{{- range $key, $value := .Values.env.secret }} + {{ $key }}: {{ $value | b64enc }} +{{- end }} \ No newline at end of file diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index a2e232c..d23dda9 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -69,8 +69,9 @@ env: DB_HOST: pg-postgresql.staging-postgres.svc.cluster.local DB_NAME: slack-scibot-staging DB_USER: postgres + SLACK_OAUTH_SCOPE: users:read,channels:read,groups:read,chat:write,commands,incoming-webhook + secret: DB_PASS: $POSTGRES_PASSWORD SLACK_CLIENT_ID: $SLACK_CLIENT_ID SLACK_CLIENT_SECRET: $SLACK_CLIENT_SECRET - SLACK_OAUTH_SCOPE: users:read,channels:read,groups:read,chat:write,commands,incoming-webhook SLACK_SIGNING_SECRET: $SLACK_SIGNING_SECRET \ No newline at end of file From 0af972748af421fe0a1a7801262f72003e7056d5 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 21:37:19 -0700 Subject: [PATCH 09/25] Updates to configure the variables correctly witht he actions doing the envsubst --- chart/templates/secret.yaml | 2 +- ops/staging-deploy.tmpl.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/chart/templates/secret.yaml b/chart/templates/secret.yaml index 50910b9..08a52b1 100644 --- a/chart/templates/secret.yaml +++ b/chart/templates/secret.yaml @@ -5,5 +5,5 @@ metadata: name: {{ include "chart.fullname" . }}-secret data: {{- range $key, $value := .Values.env.secret }} - {{ $key }}: {{ $value | b64enc }} + {{ $key }}: {{ $value |b64enc }} {{- end }} \ No newline at end of file diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index d23dda9..2236e65 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -68,10 +68,10 @@ env: configmap: DB_HOST: pg-postgresql.staging-postgres.svc.cluster.local DB_NAME: slack-scibot-staging - DB_USER: postgres - SLACK_OAUTH_SCOPE: users:read,channels:read,groups:read,chat:write,commands,incoming-webhook - secret: DB_PASS: $POSTGRES_PASSWORD + DB_USER: postgres SLACK_CLIENT_ID: $SLACK_CLIENT_ID SLACK_CLIENT_SECRET: $SLACK_CLIENT_SECRET - SLACK_SIGNING_SECRET: $SLACK_SIGNING_SECRET \ No newline at end of file + SLACK_OAUTH_SCOPE: users:read,channels:read,groups:read,chat:write,commands,incoming-webhook + SLACK_SIGNING_SECRET: $SLACK_SIGNING_SECRET + secret: \ No newline at end of file From 9df6c92778e43b7d8d2f7654c922da3e2a567c67 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 21:46:48 -0700 Subject: [PATCH 10/25] YAML indents, shakes fist at sky in anger --- chart/templates/deployment.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index c8c2a99..00684c0 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -50,10 +50,10 @@ spec: resources: {{- toYaml .Values.resources | nindent 12 }} envFrom: - - configMapRef: - name: {{ include "chart.fullname" . }}-cm - - secretRef: - name: {{ include "chart.fullname" . }}-secret + - configMapRef: + name: {{ include "chart.fullname" . }}-cm + - secretRef: + name: {{ include "chart.fullname" . }}-secret {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} From 538c52273316268d4838a356d7b1d67cd22564e4 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 22:03:52 -0700 Subject: [PATCH 11/25] Stop it, really! lol --- chart/templates/deployment.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 00684c0..c8c2a99 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -50,10 +50,10 @@ spec: resources: {{- toYaml .Values.resources | nindent 12 }} envFrom: - - configMapRef: - name: {{ include "chart.fullname" . }}-cm - - secretRef: - name: {{ include "chart.fullname" . }}-secret + - configMapRef: + name: {{ include "chart.fullname" . }}-cm + - secretRef: + name: {{ include "chart.fullname" . }}-secret {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} From d356631763419830bd2f7b8d0635a64a25411fa6 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 22:08:12 -0700 Subject: [PATCH 12/25] I thought i tired this one already --- chart/templates/deployment.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index c8c2a99..9769324 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -51,9 +51,9 @@ spec: {{- toYaml .Values.resources | nindent 12 }} envFrom: - configMapRef: - name: {{ include "chart.fullname" . }}-cm + name: {{ include "chart.fullname" . }}-cm - secretRef: - name: {{ include "chart.fullname" . }}-secret + name: {{ include "chart.fullname" . }}-secret {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} From d1f7fd7d08c6c6880879681b789273cf72ef9dea Mon Sep 17 00:00:00 2001 From: April Rieger Date: Sun, 22 Oct 2023 23:02:31 -0700 Subject: [PATCH 13/25] Updates --- .env | 8 ++++---- config/database.yml | 26 +++++++++++++------------- docker-compose.yaml | 8 +++----- ops/staging-deploy.tmpl.yaml | 12 ++++++++---- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/.env b/.env index 35d1c5b..f2effd2 100644 --- a/.env +++ b/.env @@ -1,9 +1,9 @@ RAILS_HOST_NAME=local3000.notch8.cloud BASE_URL=https://${RAILS_HOST_NAME} -DATABASE_URL="postgres://${DB_USER}:${DB_PASSWORD}@db/${DB_NAME}?pool=30" -DB_NAME=scibot -DB_PASSWORD=testing123 -DB_USER=postgres +DATABASE_URL="postgres://${DATABASE_USER}:${DATABASE_PASSWORD}@db/${DATABASE_NAME}?pool=30" +DATABASE_NAME=scibot +DATABASE_PASSWORD=testing123 +DATABASE_USER=postgres RAILS_ENV=development RAILS_SECRET_TOKEN= SLACK_CLIENT_ID= diff --git a/config/database.yml b/config/database.yml index bb50dc0..cc106d8 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,18 +1,18 @@ -default: &default - adapter: postgresql - encoding: unicode +# Hi - please dont edit this file directly, instead make changes in your .env file + +login: &login + adapter: <%= ENV['DATABASE_ADAPTER'] || 'postgresql' %> + host: <%= ENV['DATABASE_HOST'] %> + username: <%= ENV['DATABASE_USER'] %> + password: <%= ENV['DATABASE_PASSWORD'] %> + database: <%= ENV['DATABASE_NAME'] %> pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + timeout: 5000 + encoding: unicode development: - <<: *default - url: <%= ENV['DATABASE_URL'] %> - database: <%= ENV['DATABASE_NAME'] %> + <<: *login test: - <<: *default - url: <%= ENV['DATABASE_URL'] %> - database: slack_rails_bot_starter_test - -production: - url: <%= ENV['DATABASE_URL'] %> - database: <%= ENV['DATABASE_NAME'] %> + <<: *login + database: <%= ENV['DATABASE_TEST_NAME'] || 'slack_scibot_test' %> diff --git a/docker-compose.yaml b/docker-compose.yaml index 7efb68d..430fa18 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -30,10 +30,8 @@ services: env_file: - .env environment: - - POSTGRES_DB=${DB_NAME} - - POSTGRES_PASSWORD=${DB_PASSWORD} - - POSTGRES_USER=${DB_USER} - - VIRTUAL_PORT=5432 - - VIRTUAL_HOST=db.scibot.test + - POSTGRES_DB=${DATABASE_NAME} + - POSTGRES_PASSWORD=${DATABASE_PASSWORD} + - POSTGRES_USER=${DATABASE_USER} volumes: - db:/var/lib/postgresql/data diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index 2236e65..c942b47 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -66,10 +66,14 @@ externalPostgresql: env: configmap: - DB_HOST: pg-postgresql.staging-postgres.svc.cluster.local - DB_NAME: slack-scibot-staging - DB_PASS: $POSTGRES_PASSWORD - DB_USER: postgres + RAILS_HOST_NAME: slack-scibot.notch8.cloud + BASE_URL: https://${RAILS_HOST_NAME} + DATABASE_HOST: pg-postgresql.staging-postgres.svc.cluster.local + DATABASE_NAME: slack-scibot-staging + DATABASE_PASSWORD: $POSTGRES_PASSWORD + DATABASE_USER: postgres + RAILS_ENV: production + RAILS_SECRET_TOKEN: $RAILS_SECRET_TOKEN SLACK_CLIENT_ID: $SLACK_CLIENT_ID SLACK_CLIENT_SECRET: $SLACK_CLIENT_SECRET SLACK_OAUTH_SCOPE: users:read,channels:read,groups:read,chat:write,commands,incoming-webhook From 7c7ca953a81bf02555974c49532ba3d65e0a8403 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 13:28:47 -0700 Subject: [PATCH 14/25] Needed to add the external connection to the postgres service in the _helpers for the magic to happen --- chart/templates/_helpers.tpl | 49 ++++++++++++++++++++++++++++++++++++ ops/staging-deploy.tmpl.yaml | 9 ++++--- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl index 7ba5edc..3cd7343 100644 --- a/chart/templates/_helpers.tpl +++ b/chart/templates/_helpers.tpl @@ -60,3 +60,52 @@ Create the name of the service account to use {{- default "default" .Values.serviceAccount.name }} {{- end }} {{- end }} + +{{- define "chart.postgresql.fullname" -}} +{{- printf "%s-%s" .Release.Name "postgresql" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "chart.postgresql.host" -}} +{{- if .Values.postgresql.enabled }} +{{- include "chart.postgresql.fullname" . }} +{{- else }} +{{- .Values.externalPostgresql.host }} +{{- end }} +{{- end -}} + + +{{- define "chart.postgresql.database" -}} +{{- if .Values.postgresql.enabled }} +{{- .Values.postgresql.auth.database }} +{{- else }} +{{- .Values.externalPostgresql.database | default ( include "chart.fullname" . ) }} +{{- end }} +{{- end -}} + +{{- define "chart.postgresql.username" -}} +{{- if .Values.postgresql.enabled }} +{{- .Values.postgresql.auth.username }} +{{- else }} +{{- .Values.externalPostgresql.username | default "postgres" }} +{{- end }} +{{- end -}} + +{{- define "chart.postgresql.password" -}} +{{- if .Values.postgresql.enabled }} +{{- .Values.postgresql.auth.password }} +{{- else }} +{{- .Values.externalPostgresql.password }} +{{- end }} +{{- end -}} + +{{- define "chart.postgresql.port" -}} +{{- if .Values.postgresql.enabled }} +{{- .Values.postgresql.containerPorts.postgresql | default 5432 }} +{{- else }} +{{- .Values.externalPostgresql.port | default 5432 }} +{{- end }} +{{- end -}} + +{{- define "chart.postgresql.url" -}} +{{- printf "postgresql://%s:%s@%s/%s?pool=5" ( include "chart.postgresql.username" . ) ( include "chart.postgresql.password" . ) ( include "chart.postgresql.host" . ) ( include "chart.postgresql.database" . ) -}} +{{- end -}} \ No newline at end of file diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index c942b47..1af6370 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -58,10 +58,13 @@ ingress: - slack-scibot.notch8.cloud secretName: slack-scibot-tls -# database configuration for an external postgresql +postgresql: + enabled: false + +# database configuration for an external postgresql; +# ignored if `postgresql.enabled` is true externalPostgresql: host: pg-postgresql.staging-postgres.svc.cluster.local - username: postgres password: $POSTGRES_PASSWORD env: @@ -76,6 +79,6 @@ env: RAILS_SECRET_TOKEN: $RAILS_SECRET_TOKEN SLACK_CLIENT_ID: $SLACK_CLIENT_ID SLACK_CLIENT_SECRET: $SLACK_CLIENT_SECRET - SLACK_OAUTH_SCOPE: users:read,channels:read,groups:read,chat:write,commands,incoming-webhook + SLACK_OAUTH_SCOPE: "users:read,channels:read,groups:read,chat:write,commands,incoming-webhook" SLACK_SIGNING_SECRET: $SLACK_SIGNING_SECRET secret: \ No newline at end of file From 683dd9433df2e47bb8b8da28ff608d33224dd31b Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 14:53:27 -0700 Subject: [PATCH 15/25] Add the ability to start the rails server & create a db --- .env | 5 +++-- chart/templates/deployment.yaml | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.env b/.env index f2effd2..7637cb7 100644 --- a/.env +++ b/.env @@ -1,9 +1,10 @@ -RAILS_HOST_NAME=local3000.notch8.cloud +RAILS_HOST_NAME=scibot.test BASE_URL=https://${RAILS_HOST_NAME} -DATABASE_URL="postgres://${DATABASE_USER}:${DATABASE_PASSWORD}@db/${DATABASE_NAME}?pool=30" +DATABASE_URL="postgres://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}/${DATABASE_NAME}?pool=30" DATABASE_NAME=scibot DATABASE_PASSWORD=testing123 DATABASE_USER=postgres +DATABASE_HOST=db RAILS_ENV=development RAILS_SECRET_TOKEN= SLACK_CLIENT_ID= diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 9769324..4a62bdd 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -29,6 +29,23 @@ spec: serviceAccountName: {{ include "chart.serviceAccountName" . }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + initContainers: + - name: db-create + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + command: ["sh", "-c", "rails db:create"] + envFrom: + - configMapRef: + name: {{ include "chart.fullname" . }}-cm + - secretRef: + name: {{ include "chart.fullname" . }}-secret + - name: db-migrate + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + command: ["sh", "-c", "rails db:migrate"] + envFrom: + - configMapRef: + name: {{ include "chart.fullname" . }}-cm + - secretRef: + name: {{ include "chart.fullname" . }}-secret containers: - name: {{ .Chart.Name }} securityContext: From 1564788b3e6cd0896c460aa5120c4b53ed5736c2 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 15:54:05 -0700 Subject: [PATCH 16/25] Updates --- docker-compose.yaml | 1 + ops/staging-deploy.tmpl.yaml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 430fa18..1845b9d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -33,5 +33,6 @@ services: - POSTGRES_DB=${DATABASE_NAME} - POSTGRES_PASSWORD=${DATABASE_PASSWORD} - POSTGRES_USER=${DATABASE_USER} + - POSTGRES_HOST=${DATABASE_HOST} volumes: - db:/var/lib/postgresql/data diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index 1af6370..5c65f22 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -51,7 +51,7 @@ ingress: annotations: { kubernetes.io/ingress.class: "nginx", nginx.ingress.kubernetes.io/proxy-body-size: "0", - cert-manager.io/cluster-issuer: letsencrypt-production + cert-manager.io/cluster-issuer: letsencrypt-prod } tls: - hosts: @@ -70,7 +70,7 @@ externalPostgresql: env: configmap: RAILS_HOST_NAME: slack-scibot.notch8.cloud - BASE_URL: https://${RAILS_HOST_NAME} + BASE_URL: https://slack-scibot.notch8.cloud DATABASE_HOST: pg-postgresql.staging-postgres.svc.cluster.local DATABASE_NAME: slack-scibot-staging DATABASE_PASSWORD: $POSTGRES_PASSWORD From 27cd2441a0d846730afd2f5631eee4718466c378 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 16:16:00 -0700 Subject: [PATCH 17/25] Updates --- chart/templates/deployment.yaml | 40 ++++++++++++++++++++++++++------- ops/entrypoint.sh | 11 +++++++++ 2 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 ops/entrypoint.sh diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 4a62bdd..adbbce5 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -26,6 +26,10 @@ spec: imagePullSecrets: {{- toYaml . | nindent 8 }} {{- end }} + volumes: + - name: shared + persistentVolumeClaim: + claimName: {{ template "chart.name" . }}-shared serviceAccountName: {{ include "chart.serviceAccountName" . }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} @@ -52,18 +56,38 @@ spec: {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} + # Use sub-path for individual folders + volumeMounts: + - mountPath: /app/public/assets + name: shared + subPath: assets + - mountPath: /app/public/system + name: shared + subPath: system + command: ["/bin/bash", "./ops/entrypoint.sh"] + args: ["bundle", "exec", "puma", "-p", "3000"] + readinessProbe: + tcpSocket: + port: 3000 + initialDelaySeconds: 30 + periodSeconds: 10 + livenessProbe: + tcpSocket: + port: 3000 + initialDelaySeconds: 60 + periodSeconds: 120 ports: - name: http containerPort: {{ .Values.service.port }} protocol: TCP - livenessProbe: - httpGet: - path: / - port: http - readinessProbe: - httpGet: - path: / - port: http + # livenessProbe: + # httpGet: + # path: / + # port: 3000 + # readinessProbe: + # httpGet: + # path: / + # port: 3000 resources: {{- toYaml .Values.resources | nindent 12 }} envFrom: diff --git a/ops/entrypoint.sh b/ops/entrypoint.sh new file mode 100644 index 0000000..4e49645 --- /dev/null +++ b/ops/entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/bash -l +set -e + +# Remove a potentially pre-existing server.pid for Rails. +rm -f /app/tmp/pids/server.pid + +bundle check || bundle install + +echo "Starting $@" +# Then exec the container's main process (what's set as CMD in the Dockerfile). +exec "$@" \ No newline at end of file From f6ba00ef38e9e853aaa60e47548dc8cddb55a012 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 16:24:05 -0700 Subject: [PATCH 18/25] Updates --- ops/staging-deploy.tmpl.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index 5c65f22..ce8612b 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -42,6 +42,11 @@ service: type: ClusterIP port: 80 +shared: + storage: + size: 1Gi + className: nfs + ingress: enabled: true hosts: From bb24a372d559766445a2925c78d8624c0736d3f6 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 16:32:57 -0700 Subject: [PATCH 19/25] Updates --- chart/templates/deployment.yaml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index adbbce5..42a3043 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -26,10 +26,6 @@ spec: imagePullSecrets: {{- toYaml . | nindent 8 }} {{- end }} - volumes: - - name: shared - persistentVolumeClaim: - claimName: {{ template "chart.name" . }}-shared serviceAccountName: {{ include "chart.serviceAccountName" . }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} @@ -56,14 +52,6 @@ spec: {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} - # Use sub-path for individual folders - volumeMounts: - - mountPath: /app/public/assets - name: shared - subPath: assets - - mountPath: /app/public/system - name: shared - subPath: system command: ["/bin/bash", "./ops/entrypoint.sh"] args: ["bundle", "exec", "puma", "-p", "3000"] readinessProbe: From 16150ab4d84dfdf935c2a2a5cc97186d60aae65d Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 20:57:11 -0700 Subject: [PATCH 20/25] chmod +x the entrypoint.sh script --- db/seed.rb | 42 ++++++++++++++++++++++++------------------ ops/entrypoint.sh | 0 2 files changed, 24 insertions(+), 18 deletions(-) mode change 100644 => 100755 ops/entrypoint.sh diff --git a/db/seed.rb b/db/seed.rb index 8e5d735..568ebf9 100644 --- a/db/seed.rb +++ b/db/seed.rb @@ -2,26 +2,32 @@ group.description = "SoftServ DevOps Team" end -Group.find_or_create_by(name: 'gcsupport') do |group| - group.description = "Glass Canvas Support Team" -end +# Group.find_or_create_by(name: 'gcsupport') do |group| +# group.description = "Glass Canvas Support Team" +# end -Group.find_or_create_by(name: 'gcdev') do |group| - group.description = "Glass Canvas Dev Team" -end +# Group.find_or_create_by(name: 'gcdev') do |group| +# group.description = "Glass Canvas Dev Team" +# end -Member.find_or_create_by(handle: 'rob') do |member| - member.name = "Rob Kauufman" - member.group = Group.find_by(name: 'devops') - member.member_id = "U0E347KGF" -end +# Member.find_or_create_by(handle: 'rob') do |member| +# member.name = "Rob Kauufman" +# member.group = Group.find_by(name: 'devops') +# member.member_id = "U0E347KGF" +# end -Member.find_or_create_by(handle: 'crystal') do |member| - member.name = "Crystal Richardson" - member.group = Group.find_by(name: 'devops') -end +# Member.find_or_create_by(handle: 'crystal') do |member| +# member.name = "Crystal Richardson" +# member.group = Group.find_by(name: 'devops') +# end -Member.find_or_create_by(handle: 'stefan') do |member| - member.name = "Stefan" - member.group = Group.find_by(name: 'gcdev') +# Member.find_or_create_by(handle: 'stefan') do |member| +# member.name = "Stefan" +# member.group = Group.find_by(name: 'gcdev') +# end + +Member.find_or_create_by(handle: 'april') do |member| + member.name = "April Rieger" + member.group = Group.find_by(name: 'devops') + member.member_id = "U02QC5MTU8N" end diff --git a/ops/entrypoint.sh b/ops/entrypoint.sh old mode 100644 new mode 100755 From e2cbf24959cc116b473b396e457f7e54f5b6cd85 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 21:21:39 -0700 Subject: [PATCH 21/25] ugh k8s v1.18.ooolllllddddddaf --- chart/templates/deployment.yaml | 2 +- ops/staging-deploy.tmpl.yaml | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 42a3043..85ecf44 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -66,7 +66,7 @@ spec: periodSeconds: 120 ports: - name: http - containerPort: {{ .Values.service.port }} + containerPort: 3000 protocol: TCP # livenessProbe: # httpGet: diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index ce8612b..4bfa2fe 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -40,12 +40,9 @@ securityContext: {} service: type: ClusterIP - port: 80 + # port: 80 # need for r2-besties + port: http -shared: - storage: - size: 1Gi - className: nfs ingress: enabled: true @@ -53,6 +50,7 @@ ingress: - host: slack-scibot.notch8.cloud paths: - path: / + pathType: ImplementationSpecific annotations: { kubernetes.io/ingress.class: "nginx", nginx.ingress.kubernetes.io/proxy-body-size: "0", From fb929429dbfa0c7940ac9533d83401fc72f63ead Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 21:31:47 -0700 Subject: [PATCH 22/25] http, 80, 3000, ports --- chart/templates/service.yaml | 4 +++- ops/staging-deploy.tmpl.yaml | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/chart/templates/service.yaml b/chart/templates/service.yaml index dfc5b3a..3e86cd0 100644 --- a/chart/templates/service.yaml +++ b/chart/templates/service.yaml @@ -8,7 +8,9 @@ spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} - targetPort: http + ports: + - port: 80 # Service port + targetPort: 3000 # Container port protocol: TCP name: http selector: diff --git a/ops/staging-deploy.tmpl.yaml b/ops/staging-deploy.tmpl.yaml index 4bfa2fe..6b48fbb 100644 --- a/ops/staging-deploy.tmpl.yaml +++ b/ops/staging-deploy.tmpl.yaml @@ -40,8 +40,7 @@ securityContext: {} service: type: ClusterIP - # port: 80 # need for r2-besties - port: http + port: 80 ingress: From 9fc9a63cc098aeb7b47ee7e3cacf8e3ecbffda37 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Mon, 23 Oct 2023 21:35:39 -0700 Subject: [PATCH 23/25] typo --- chart/templates/service.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/chart/templates/service.yaml b/chart/templates/service.yaml index 3e86cd0..c5a64ca 100644 --- a/chart/templates/service.yaml +++ b/chart/templates/service.yaml @@ -8,8 +8,6 @@ spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} - ports: - - port: 80 # Service port targetPort: 3000 # Container port protocol: TCP name: http From a8f9d1d30d8fca4939499d08445e7608771aefd0 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Tue, 24 Oct 2023 11:23:42 -0700 Subject: [PATCH 24/25] Updates readme and adds seeds back after confirming configuration with soley my user --- README.md | 14 +++++++------- db/seed.rb | 42 ++++++++++++++++++------------------------ 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 61166aa..0f67ea1 100644 --- a/README.md +++ b/README.md @@ -22,14 +22,14 @@ The default branch `master` uses Mongoid as database adapter. For ActiveRecord, - `commands` - `incoming-webhook` -### Still yet to do: https://api.slack.com/apps/A062693KZRB +Slack Link to Slack-Scibot, will need to authenticate via Slack login to the workspace it is configured to work with: https://api.slack.com/apps/A062693KZRB - **BASE_URL** stands for https://slackbot-hosted-domain.com hereafter. - Use **BASE_URL** for **Redirect**. + **BASE_URL** stands for https://slack-scibot.notch8.cloud hereafter. + Use **https://slack-scibot.notch8.cloud** for **Redirect**. -3. Activate **Interactivity & Shortcuts** and add this url: `BASE_URL/api/slack/action` -4. Activate **Slash Commands** adding two slash commands `/ping`, `/quiz` and use this url: `BASE_URL/api/slack/command` -5. Activate **Event Subscriptions** subscribing to the event type `member_joined_channel` and add this url: `BASE_URL/api/slack/event`(This step needs the application to be running :D so you can skip this and come back a few mins later) +3. Activate **Interactivity & Shortcuts** and add this url: `https://slack-scibot.notch8.cloud/api/slack/action` +4. Activate **Slash Commands** adding two slash commands `/ping`, `/quiz` and use this url: `https://slack-scibot.notch8.cloud/api/slack/command` +5. Activate **Event Subscriptions** subscribing to the event type `member_joined_channel` and add this url: `https://slack-scibot.notch8.cloud/api/slack/event`(This step needs the application to be running :D so you can skip this and come back a few mins later) 6. Navigate to the **App Home** page and toggle **Always Show My Bot as Online** (according to your reference) #### Install dependencies and prepare `.env` file @@ -51,7 +51,7 @@ Grab the infomations for `.env` from **Basic Information** section. rails s ``` -Open **BASE_URL** in your browser. +Open **https://slack-scibot.notch8.cloud** in your browser. ## Deployment diff --git a/db/seed.rb b/db/seed.rb index 568ebf9..578c0b5 100644 --- a/db/seed.rb +++ b/db/seed.rb @@ -2,32 +2,26 @@ group.description = "SoftServ DevOps Team" end -# Group.find_or_create_by(name: 'gcsupport') do |group| -# group.description = "Glass Canvas Support Team" -# end - -# Group.find_or_create_by(name: 'gcdev') do |group| -# group.description = "Glass Canvas Dev Team" -# end - -# Member.find_or_create_by(handle: 'rob') do |member| -# member.name = "Rob Kauufman" -# member.group = Group.find_by(name: 'devops') -# member.member_id = "U0E347KGF" -# end +Group.find_or_create_by(name: 'gcsupport') do |group| + group.description = "Glass Canvas Support Team" +end -# Member.find_or_create_by(handle: 'crystal') do |member| -# member.name = "Crystal Richardson" -# member.group = Group.find_by(name: 'devops') -# end +Group.find_or_create_by(name: 'gcdev') do |group| + group.description = "Glass Canvas Dev Team" +end -# Member.find_or_create_by(handle: 'stefan') do |member| -# member.name = "Stefan" -# member.group = Group.find_by(name: 'gcdev') -# end +Member.find_or_create_by(handle: 'rob') do |member| + member.name = "Rob Kaufman" + member.group = Group.find_by(name: 'devops') + member.member_id = "U0E347KGF" +end -Member.find_or_create_by(handle: 'april') do |member| - member.name = "April Rieger" +Member.find_or_create_by(handle: 'crystal') do |member| + member.name = "Crystal Richardson" member.group = Group.find_by(name: 'devops') - member.member_id = "U02QC5MTU8N" +end + +Member.find_or_create_by(handle: 'stefan') do |member| + member.name = "Stefan" + member.group = Group.find_by(name: 'gcdev') end From 9ab692ef1519c414996c00f8c81487e5633a9382 Mon Sep 17 00:00:00 2001 From: April Rieger Date: Tue, 24 Oct 2023 11:44:42 -0700 Subject: [PATCH 25/25] Get rubocop added in the app by adding gem, and by adding to CI. I ran it locally and there are 303 offenses detected, 282 offenses autocorrectable, but that will go in another pr --- .github/workflows/build-test-lint.yaml | 10 ++++----- Gemfile | 2 ++ Gemfile.lock | 28 ++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-test-lint.yaml b/.github/workflows/build-test-lint.yaml index 8513e0d..b6d5eb3 100644 --- a/.github/workflows/build-test-lint.yaml +++ b/.github/workflows/build-test-lint.yaml @@ -29,8 +29,8 @@ jobs: # with: # webTarget: - # lint: - # needs: build - # uses: scientist-softserv/actions/.github/workflows/lint.yaml@v0.0.14 - # with: - # webTarget: \ No newline at end of file + lint: + needs: build + uses: scientist-softserv/actions/.github/workflows/lint.yaml@v0.0.14 + with: + webTarget: web \ No newline at end of file diff --git a/Gemfile b/Gemfile index 4269f1a..8714fe2 100644 --- a/Gemfile +++ b/Gemfile @@ -40,5 +40,7 @@ group :development do gem 'spring-watcher-listen', '~> 2.0.0' end +gem 'rubocop' + # Windows does not include zoneinfo files, so bundle the tzinfo-data gem # gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock index 4ff396b..df9b522 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -66,11 +66,13 @@ GEM i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) + ast (2.4.2) async (2.6.2) console (~> 1.10) fiber-annotation io-event (~> 1.1) timers (~> 4.1) + base64 (0.1.1) bootsnap (1.15.0) msgpack (~> 1.2) builder (3.2.4) @@ -136,10 +138,12 @@ GEM i18n (1.14.1) concurrent-ruby (~> 1.0) io-event (1.2.2) + json (2.6.3) kaminari-core (1.2.2) kaminari-grape (1.0.1) grape kaminari-core (~> 1.0) + language_server-protocol (3.17.0.3) listen (3.7.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) @@ -183,6 +187,10 @@ GEM pagy_cursor (0.6.0) activerecord (>= 5) pagy (>= 6, < 7) + parallel (1.23.0) + parser (3.2.2.4) + ast (~> 2.4.1) + racc pg (1.4.5) puma (6.0.1) nio4r (~> 2.0) @@ -223,16 +231,34 @@ GEM rake (>= 12.2) thor (~> 1.0) zeitwerk (~> 2.5) + rainbow (3.1.1) rake (13.0.6) rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) + regexp_parser (2.8.2) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) + rexml (3.2.6) roar (1.1.1) representable (~> 3.0) + rubocop (1.57.1) + base64 (~> 0.1.1) + json (~> 2.3) + language_server-protocol (>= 3.17.0) + parallel (~> 1.10) + parser (>= 3.2.2.4) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.28.1, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.29.0) + parser (>= 3.2.1.0) + ruby-progressbar (1.13.0) ruby2_keywords (0.0.5) slack-ruby-bot-server (2.1.0) async @@ -264,6 +290,7 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) + unicode-display_width (2.5.0) websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -283,6 +310,7 @@ DEPENDENCIES pg puma (~> 6.0.1) rails (~> 7.0.4) + rubocop slack-ruby-bot-server-events spring spring-watcher-listen (~> 2.0.0)