From 520bfbb5491e062b6621c49f05fa01d77d1ddd18 Mon Sep 17 00:00:00 2001 From: Lars Scheibling Date: Sun, 19 Mar 2023 22:43:41 +0000 Subject: [PATCH] Created chart and CI/CD --- .gitlab-ci.yml | 22 ++++++++++++++++++ .../.disabled-templates}/resourcequota.yaml | 0 {chart => Chart}/.helmignore | 0 {chart => Chart}/Chart.yaml | 2 +- {chart => Chart}/README.md | 0 {chart => Chart}/templates/NOTES.txt | 0 {chart => Chart}/templates/_helpers.tpl | 0 {chart => Chart}/templates/certificate.yaml | 0 {chart => Chart}/templates/configmap.yaml | 7 ++++-- {chart => Chart}/templates/database.yaml | 0 {chart => Chart}/templates/deployment.yaml | 7 +++--- .../templates/externalsecret.yaml | 0 {chart => Chart}/templates/ingress.yaml | 0 .../templates/persistentvolume.yaml | 4 ++-- .../templates/persistentvolumeclaim.yaml | 7 ++++-- {chart => Chart}/templates/service.yaml | 0 .../templates/tests/site-live.yaml | 0 {chart => Chart}/values.yaml | 2 +- cloudypress-0.5.0.tgz | Bin 0 -> 9649 bytes 19 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 .gitlab-ci.yml rename {chart/disabled-templates => Chart/.disabled-templates}/resourcequota.yaml (100%) rename {chart => Chart}/.helmignore (100%) rename {chart => Chart}/Chart.yaml (89%) rename {chart => Chart}/README.md (100%) rename {chart => Chart}/templates/NOTES.txt (100%) rename {chart => Chart}/templates/_helpers.tpl (100%) rename {chart => Chart}/templates/certificate.yaml (100%) rename {chart => Chart}/templates/configmap.yaml (98%) rename {chart => Chart}/templates/database.yaml (100%) rename {chart => Chart}/templates/deployment.yaml (94%) rename {chart => Chart}/templates/externalsecret.yaml (100%) rename {chart => Chart}/templates/ingress.yaml (100%) rename {chart => Chart}/templates/persistentvolume.yaml (90%) rename {chart => Chart}/templates/persistentvolumeclaim.yaml (80%) rename {chart => Chart}/templates/service.yaml (100%) rename {chart => Chart}/templates/tests/site-live.yaml (100%) rename {chart => Chart}/values.yaml (99%) create mode 100644 cloudypress-0.5.0.tgz diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..7b75cb5 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,22 @@ +variables: + HELM_CHART_VERSION: "0.5.1" + +stages: + - deploy + +default: + image: cloudyne/kubectl-helm:latest + tags: + - kubernetes + - cluster01 + +deploy: + stage: deploy + script: + - 'sed -i "s/version:.*/version: ${HELM_CHART_VERSION}/"' + - helm package ./Chart + - | + curl --request POST \ + --user gitlab-ci-token:$CI_JOB_TOKEN \ + --form "chart=@cloudypress-${HELM_CHART_VERSION}.tgz" \ + "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/helm/api/stable/charts"' diff --git a/chart/disabled-templates/resourcequota.yaml b/Chart/.disabled-templates/resourcequota.yaml similarity index 100% rename from chart/disabled-templates/resourcequota.yaml rename to Chart/.disabled-templates/resourcequota.yaml diff --git a/chart/.helmignore b/Chart/.helmignore similarity index 100% rename from chart/.helmignore rename to Chart/.helmignore diff --git a/chart/Chart.yaml b/Chart/Chart.yaml similarity index 89% rename from chart/Chart.yaml rename to Chart/Chart.yaml index 501b5e7..27e62af 100644 --- a/chart/Chart.yaml +++ b/Chart/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: cloudypress description: A helm chart for deploying Wordpress on Cloudyne Hosting type: application -version: 0.1.5 +version: "0.5.0" appVersion: "6.1.1" diff --git a/chart/README.md b/Chart/README.md similarity index 100% rename from chart/README.md rename to Chart/README.md diff --git a/chart/templates/NOTES.txt b/Chart/templates/NOTES.txt similarity index 100% rename from chart/templates/NOTES.txt rename to Chart/templates/NOTES.txt diff --git a/chart/templates/_helpers.tpl b/Chart/templates/_helpers.tpl similarity index 100% rename from chart/templates/_helpers.tpl rename to Chart/templates/_helpers.tpl diff --git a/chart/templates/certificate.yaml b/Chart/templates/certificate.yaml similarity index 100% rename from chart/templates/certificate.yaml rename to Chart/templates/certificate.yaml diff --git a/chart/templates/configmap.yaml b/Chart/templates/configmap.yaml similarity index 98% rename from chart/templates/configmap.yaml rename to Chart/templates/configmap.yaml index 5354cfb..f0400ee 100644 --- a/chart/templates/configmap.yaml +++ b/Chart/templates/configmap.yaml @@ -10,8 +10,11 @@ data: SMTP_FORCE_FROM: "noreply@customer.v3.nu" SMTP_FROM_NAME: "V3 Customer Mailer" WP_ENV: "production" - WP_HOME: {{ .Values.site.url }} - WP_SITEURL: {{ .Values.site.url }}/wp + {{- if .Values.site.overrideMainUrl }} + WP_HOME: "https://{{ .Values.site.overrideMainUrl }}" + {{- else }} + WP_HOME: "https://{{ .Values.site.url }}" + {{- end }} {{- if and .Values.site.init .Values.site.init.composerPackage }} RUN_COMPOSER: 'true' diff --git a/chart/templates/database.yaml b/Chart/templates/database.yaml similarity index 100% rename from chart/templates/database.yaml rename to Chart/templates/database.yaml diff --git a/chart/templates/deployment.yaml b/Chart/templates/deployment.yaml similarity index 94% rename from chart/templates/deployment.yaml rename to Chart/templates/deployment.yaml index 5812eb7..ecf667b 100644 --- a/chart/templates/deployment.yaml +++ b/Chart/templates/deployment.yaml @@ -59,13 +59,13 @@ spec: - secretRef: name: {{ include "..fullname" . }}-db-auth - secretRef: - name: global-secrets-ext + name: global-secrets containers: - name: wordpress securityContext: runAsUser: 65534 {{- if .Values.global }} - image: {{ .Values.global.initImage | default "ghcr.io/cloudynes/php-nginx" }}:{{ .Values.global.imagetag | default "latest" }} + image: {{ .Values.global.serverImage | default "ghcr.io/cloudynes/php-nginx" }}:{{ .Values.global.imagetag | default "latest" }} {{- else }} image: ghcr.io/cloudynes/php-nginx:latest {{- end }} @@ -78,6 +78,7 @@ spec: subPath: nginx.conf - name: serverconfig mountPath: /usr/local/etc/php-fpm.d/www.conf + subPath: www.conf {{- if and .Values.site .Values.site.storage .Values.site.storage.cloud .Values.site.storage.cloud.folders }} {{- range $v := .Values.site.storage.cloud.folders }} - name: cloud @@ -91,7 +92,7 @@ spec: - secretRef: name: {{ include "..fullname" . }}-db-auth - secretRef: - name: global-secrets-ext + name: global-secrets resources: {{- if and .Values.customer .Values.customer.package .Values.customer.package.cpu }} requests: diff --git a/chart/templates/externalsecret.yaml b/Chart/templates/externalsecret.yaml similarity index 100% rename from chart/templates/externalsecret.yaml rename to Chart/templates/externalsecret.yaml diff --git a/chart/templates/ingress.yaml b/Chart/templates/ingress.yaml similarity index 100% rename from chart/templates/ingress.yaml rename to Chart/templates/ingress.yaml diff --git a/chart/templates/persistentvolume.yaml b/Chart/templates/persistentvolume.yaml similarity index 90% rename from chart/templates/persistentvolume.yaml rename to Chart/templates/persistentvolume.yaml index bde11de..16d88bd 100644 --- a/chart/templates/persistentvolume.yaml +++ b/Chart/templates/persistentvolume.yaml @@ -17,8 +17,8 @@ spec: volumeAttributes: containername: {{ .Values.site.storage.cloud.container }} csi.storage.k8s.io/pv/name: pv-{{ include "..fullname" . }} - csi.storage.k8s.io/pvc/namespace: {{ .Values.customer.name }} - secretnamespace: {{ .Values.customer.name }} + csi.storage.k8s.io/pvc/namespace: {{ include "..fullname" . }} + secretnamespace: {{ include "..fullname" . }} skuName: {{ .Values.site.storage.cloud.type }} volumeHandle: {{ .Values.site.storage.cloud.class }}-retain_{{ include "..fullname" . }} mountOptions: diff --git a/chart/templates/persistentvolumeclaim.yaml b/Chart/templates/persistentvolumeclaim.yaml similarity index 80% rename from chart/templates/persistentvolumeclaim.yaml rename to Chart/templates/persistentvolumeclaim.yaml index ec507a9..ad227d5 100644 --- a/chart/templates/persistentvolumeclaim.yaml +++ b/Chart/templates/persistentvolumeclaim.yaml @@ -9,11 +9,14 @@ metadata: {{- include "..labels" . | nindent 8 }} name: pvc-{{ include "..fullname" . }} spec: + volumeMode: Filesystem + volumeName: pv-{{ include "..fullname" . }} accessModes: - ReadWriteOnce resources: requests: storage: {{ .Values.customer.package.disk }} + +{{- if and .Values.site .Values.site.storage .Values.site.storage.cloud }} storageClassName: {{ .Values.site.storage.cloud.class }}-retain - volumeMode: Filesystem - volumeName: pv-{{ include "..fullname" . }} \ No newline at end of file +{{- end }} \ No newline at end of file diff --git a/chart/templates/service.yaml b/Chart/templates/service.yaml similarity index 100% rename from chart/templates/service.yaml rename to Chart/templates/service.yaml diff --git a/chart/templates/tests/site-live.yaml b/Chart/templates/tests/site-live.yaml similarity index 100% rename from chart/templates/tests/site-live.yaml rename to Chart/templates/tests/site-live.yaml diff --git a/chart/values.yaml b/Chart/values.yaml similarity index 99% rename from chart/values.yaml rename to Chart/values.yaml index d671459..a9dc390 100644 --- a/chart/values.yaml +++ b/Chart/values.yaml @@ -95,7 +95,7 @@ global: initImage: ghcr.io/cloudynes/php-init # The tag to use for the above images - imageTag: latest + imageTag: fpm8.0-alpine3.16 # The database instance where the database will be provisioned dbInstance: "kincaid" diff --git a/cloudypress-0.5.0.tgz b/cloudypress-0.5.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..119c724b6d5417f94a2489bb6871ca5d468d3a6a GIT binary patch literal 9649 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 literal 0 HcmV?d00001