diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c7c25e9..f174de0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,243 +14,99 @@ #You should have received a copy of the GNU Affero General Public License #along with this program. If not, see . stages: -- lint -- build -- test -- sonarqube-check -- oci-build -- deploy -- deploy-dev + - lint + - sonarqube-check + - test + - build + - package + - deploy + lint-frontend: image: node:lts stage: lint - rules: - - changes: - - frontend/**/* script: - - cd frontend - - npm i - - npm run lint-no-fix + - cd frontend + - npm i + - npm run lint-no-fix + rules: + - changes: + - frontend/**/* + lint-data-manager: stage: lint image: golangci/golangci-lint:latest - rules: - - changes: - - services/data-manager/**/* script: - - cd services/data-manager - - go mod download - - golangci-lint --version - - golangci-lint run -v --skip-dirs=migrations --timeout=5m + - cd services/data-manager + - go mod download + - golangci-lint --version + - golangci-lint run -v --skip-dirs=migrations --timeout=5m + rules: + - changes: + - services/data-manager/**/* + lint-ical: stage: lint image: golangci/golangci-lint:latest - rules: - - changes: - - services/ical/**/* script: - - cd services/ical - - go mod download - - golangci-lint --version - - golangci-lint run -v --skip-dirs=migrations --timeout=5m -build-data-manager: - image: golang:alpine - stage: build + - cd services/ical + - go mod download + - golangci-lint --version + - golangci-lint run -v --skip-dirs=migrations --timeout=5m rules: - - changes: - - services/data-manager/**/* - script: - - cd services/data-manager - - go build -o htwkalender - artifacts: - paths: - - data-manager/htwkalender - - data-manager/go.sum - - data-manager/go.mod -build-ical: - image: golang:alpine - stage: build - rules: - - changes: - - services/ical/**/* - script: - - cd services/ical - - go build -o htwkalender-ical - artifacts: - paths: - - data-manager/htwkalender-ical - - data-manager/go.sum - - data-manager/go.mod + - changes: + - services/ical/**/* + sonarqube-data-manager: stage: sonarqube-check image: name: sonarsource/sonar-scanner-cli:5.0 entrypoint: - - '' + - '' variables: SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" GIT_DEPTH: '0' cache: key: "${CI_JOB_NAME}" paths: - - ".sonar/cache" + - ".sonar/cache" script: - - cd services/data-manager - - sonar-scanner + - cd services/data-manager + - sonar-scanner allow_failure: true - only: - - merge_requests - - master - - main - - develop -build-frontend: - image: node:lts - stage: build rules: - - changes: - - frontend/**/* - script: - - cd frontend - - npm i - - npm run build - artifacts: - paths: - - frontend/build + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + - if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "main" || $CI_COMMIT_REF_NAME == "develop"' + test-data-manager: image: golang:alpine stage: test - rules: - - changes: - - services/data-manager/**/* script: - - cd services/data-manager - - go test -v ./... - dependencies: - - build-data-manager + - cd services/data-manager + - go test -v ./... + rules: + - changes: + - services/data-manager/**/* + test-ical: image: golang:alpine stage: test - rules: - - changes: - - services/ical/**/* script: - - cd services/ical - - go test -v ./... - dependencies: - - build-ical + - cd services/ical + - go test -v ./... + rules: + - changes: + - services/ical/**/* + test-frontend: image: node:lts stage: test - rules: - - changes: - - frontend/**/* script: - - cd frontend - - npm i - - npm run test + - cd frontend + - npm i + - npm run test dependencies: - lint-frontend -build-data-manager-image: - stage: oci-build - image: docker:latest - services: - - docker:dind - tags: - - image - variables: - IMAGE_TAG: "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG-data-manager" - before_script: - - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - script: - - docker build --pull -t $IMAGE_TAG -f ./services/data-manager/Dockerfile --target - prod ./services - - docker push $IMAGE_TAG - rules: - - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "development" - changes: - - services/data-manager/**/* -build-ical-image: - stage: oci-build - image: docker:latest - services: - - docker:dind - tags: - - image - variables: - IMAGE_TAG: "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG-ical" - before_script: - - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - script: - - docker build --pull -t $IMAGE_TAG -f ./services/ical/Dockerfile --target prod - ./services - - docker push $IMAGE_TAG - rules: - - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "development" - changes: - - services/ical/**/* -build-frontend-image: - stage: oci-build - image: docker:latest - services: - - docker:dind - tags: - - image - variables: - IMAGE_TAG: "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG-frontend" - before_script: - - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - - cd ./frontend - script: - - docker build --pull -t $IMAGE_TAG -f ./Dockerfile --target prod . - - docker push $IMAGE_TAG - rules: - - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "development" - changes: - - frontend/**/* -deploy-dev: - stage: deploy-dev - image: alpine:latest - before_script: - - apk add --no-cache openssh-client sed - - eval $(ssh-agent -s) - - ssh-add <(echo "$CI_SSH_KEY" | tr -d '\r') - script: - - sed -i -e "s|DOCKER_REGISTRY_REPO|$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG|" docker-compose.dev.yml - - 'scp -P $CI_SSH_PORT -o StrictHostKeyChecking=no -o LogLevel=ERROR ./docker-compose.dev.yml - ./reverseproxy.dev.conf $CI_SSH_USER@$CI_SSH_DEV_HOST:/home/$CI_SSH_USER/docker/htwkalender/ - ' - - 'ssh -p $CI_SSH_PORT -o StrictHostKeyChecking=no -o LogLevel=ERROR $CI_SSH_USER@$CI_SSH_DEV_HOST - "cd /home/$CI_SSH_USER/docker/htwkalender/ && docker login -u $CI_REGISTRY_USER - -p $CI_REGISTRY_PASSWORD $CI_REGISTRY && docker compose -f ./docker-compose.dev.yml - down && docker compose -f ./docker-compose.dev.yml up -d --remove-orphans && docker - logout" - - ' - rules: - - if: $CI_COMMIT_BRANCH == "development" -deploy-all: - stage: deploy - image: alpine:latest - before_script: - - apk add --no-cache openssh-client sed # install dependencies - - eval $(ssh-agent -s) # set some ssh variables - - ssh-add <(echo "$CI_SSH_KEY" | tr -d '\r') - script: - # replace some placeholders - - sed -i -e "s|DOCKER_REGISTRY_REPO|$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG|" docker-compose.prod.yml - # upload necessary files to the server - - > - scp -P $CI_SSH_PORT -o StrictHostKeyChecking=no -o LogLevel=ERROR ./docker-compose.prod.yml ./reverseproxy.conf - $CI_SSH_USER@$CI_SSH_HOST:/home/$CI_SSH_USER/docker/htwkalender/ - # ssh to the server and start the service - - > - ssh -p $CI_SSH_PORT -o StrictHostKeyChecking=no -o LogLevel=ERROR $CI_SSH_USER@$CI_SSH_HOST - "cd /home/$CI_SSH_USER/docker/htwkalender/ && - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY && - docker compose -f ./docker-compose.prod.yml down && docker compose -f ./docker-compose.prod.yml up -d --remove-orphans && docker logout && - docker exec --user root htwkalender-htwkalender-frontend-1 /bin/sh -c \"echo 'google-site-verification: $GOOGLE_VERIFICATION.html' > ./$GOOGLE_VERIFICATION.html\" " - rules: - - if: $CI_COMMIT_BRANCH == "main" include: -- template: Security/Dependency-Scanning.gitlab-ci.yml + - local: 'charts/ci-build-deploy.yml' + - template: Security/Dependency-Scanning.gitlab-ci.yml diff --git a/charts/.helmignore b/charts/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/charts/.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/charts/Chart.yaml b/charts/Chart.yaml new file mode 100644 index 0000000..2ee4660 --- /dev/null +++ b/charts/Chart.yaml @@ -0,0 +1,7 @@ +apiVersion: v2 +name: htwkalender +description: The Helm chart for the HTWKalender +version: 0.0.1 +appVersion: "0.0.1" +type: application + diff --git a/charts/ci-build-deploy.yml b/charts/ci-build-deploy.yml new file mode 100644 index 0000000..a2a2f47 --- /dev/null +++ b/charts/ci-build-deploy.yml @@ -0,0 +1,262 @@ +.build-image: + stage: build + image: docker:latest + services: + - docker:dind + tags: + - image + #variables: + # DOCKER_HOST: tcp://docker:2376 + # DOCKER_TLS_CERTDIR: "/certs" + # DOCKER_TLS_VERIFY: 1 + # DOCKER_CERT_PATH: "/certs/client" + before_script: + - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY + script: + - | + docker build --pull \ + -t $IMAGE_TAG \ + -f $DOCKERFILE \ + --target $BUILD_TARGET \ + $BUILD_PATH + - docker push "$IMAGE_TAG" + artifacts: + paths: + - .env_file + expire_in: 1 hour + +.build-data-manager-image: + extends: .build-image + variables: + BUILD_TARGET: "prod" + BUILD_PATH: "./services" + DOCKERFILE: "./services/data-manager/Dockerfile" + after_script: + - echo "export DATA_MANAGER_IMAGE=$IMAGE_TAG" >> .env_file + +build-data-manager-image-dev: + extends: .build-data-manager-image + variables: + IMAGE_TAG: "$CI_REGISTRY_IMAGE/data-manager:dev" + rules: + - if: $CI_COMMIT_BRANCH == "development" + changes: + - services/data-manager/**/* + +build-data-manager-image-prod: + extends: .build-data-manager-image + variables: + IMAGE_TAG: "$CI_REGISTRY_IMAGE/data-manager:latest" + rules: + - if: $CI_COMMIT_BRANCH == "main" + changes: + - services/data-manager/**/* + +.build-ical-image: + extends: .build-image + variables: + BUILD_TARGET: "prod" + BUILD_PATH: "./services" + DOCKERFILE: "./services/ical/Dockerfile" + after_script: + - echo "export ICAL_IMAGE=$IMAGE_TAG" >> .env_file + +build-ical-image-dev: + extends: .build-ical-image + variables: + IMAGE_TAG: "$CI_REGISTRY_IMAGE/ical:dev" + needs: + - job: build-data-manager-image-dev + rules: + - if: $CI_COMMIT_BRANCH == "development" + changes: + - services/ical/**/* + +build-ical-image-prod: + extends: .build-ical-image + variables: + IMAGE_TAG: "$CI_REGISTRY_IMAGE/ical:latest" + needs: + - job: build-data-manager-image-prod + rules: + - if: $CI_COMMIT_BRANCH == "main" + changes: + - services/ical/**/* + +.build-frontend-image: + extends: .build-image + variables: + BUILD_TARGET: "prod" + BUILD_PATH: "./frontend" + DOCKERFILE: "./frontend/Dockerfile" + after_script: + - echo "export FRONTEND_IMAGE=$IMAGE_TAG" >> .env_file + +build-frontend-image-dev: + extends: .build-frontend-image + variables: + IMAGE_TAG: "$CI_REGISTRY_IMAGE/frontend:dev" + needs: + - job: build-ical-image-dev + rules: + - if: $CI_COMMIT_BRANCH == "development" + changes: + - frontend/**/* + +build-frontend-image-prod: + extends: .build-frontend-image + variables: + IMAGE_TAG: "$CI_REGISTRY_IMAGE/frontend:latest" + needs: + - job: build-ical-image-prod + rules: + - if: $CI_COMMIT_BRANCH == "main" + changes: + - frontend/**/* + +.package-helm-chart: + stage: package + image: + name: alpine/helm:3 + entrypoint: [""] + variables: + CHARTS_DIR: $CI_PROJECT_DIR/charts + VALUES_FILE: $CI_PROJECT_DIR/charts/values.yaml + CHART_FILE: $CI_PROJECT_DIR/charts/Chart.yaml + before_script: + - apk add --no-cache gettext + - echo "HELM_ARTIFACT_JOB_NAME=$CI_JOB_NAME" >> .env_file + - echo "PROJECT_URL=$PROJECT_URL" >> .env_file + - echo "PROJECT_NAME=$PROJECT_NAME" >> .env_file + - source .env_file + - echo "Updating deployment URLs..." + - yq e -i '(.dataManager.image.name) = env(DATA_MANAGER_IMAGE)' $VALUES_FILE + - yq e -i '(.ical.image.name) = env(ICAL_IMAGE)' $VALUES_FILE + - yq e -i '(.frontend.image.name) = env(FRONTEND_IMAGE)' $VALUES_FILE + - yq e -i '(.frontend.host) = env(PROJECT_URL)' $VALUES_FILE + after_script: + - yq e -i 'explode(.)' "$VALUES_FILE" + - helm dependency update $CHARTS_DIR + - helm package $CHARTS_DIR --destination ./ + artifacts: + paths: + - "*.tgz" + - .env_file + expire_in: 1 hour + +package-helm-chart-dev: + extends: .package-helm-chart + variables: + PROJECT_URL: $PROJECT_URL_DEV + PROJECT_NAME: $CI_PROJECT_NAME-dev + script: + - yq e -i '(.production) = false' $VALUES_FILE + needs: + - build-frontend-image-dev + rules: + - if: '$CI_COMMIT_BRANCH == "development"' + changes: + - services/data-manager/**/* + - services/ical/**/* + - frontend/**/* + +package-helm-chart-prod: + extends: .package-helm-chart + variables: + PROJECT_URL: $PROJECT_URL_PROD + PROJECT_NAME: $CI_PROJECT_NAME + script: + - yq e -i '(.frontend.googleSiteVerification) = env(GOOGLE_VERIFICATION)' $VALUES_FILE + - | + cat < configmap-google.yaml + {{- if .Values.production }} + apiVersion: v1 + kind: ConfigMap + metadata: + name: configmap-google + namespace: $PROJECT_NAME + data: + $GOOGLE_VERIFICATION.html: | + google-site-verification: $GOOGLE_VERIFICATION.html + {{- end }} + EOF + - envsubst < configmap-google.yaml > $CHARTS_DIR/templates/configmap-google.yaml + needs: + - build-frontend-image-prod + rules: + - if: '$CI_COMMIT_BRANCH == "main"' + changes: + - services/data-manager/**/* + - services/ical/**/* + - frontend/**/* + +trigger_deploy: + stage: deploy + image: alpine:latest + before_script: + - apk add --no-cache curl + - source .env_file + script: + - echo "Triggering deploy pipeline ..." + - | + curl -X POST \ + -F "token=$CI_DEPLOY_REPO_TRIGGER_TOKEN" \ + -F "ref=$CI_DEPLOY_REPO_REF" \ + -F "variables[UPSTREAM_PROJECT_NAME]=$PROJECT_NAME" \ + -F "variables[UPSTREAM_PROJECT_ID]=$CI_PROJECT_ID" \ + -F "variables[UPSTREAM_COMMIT_REF_NAME]=$CI_COMMIT_REF_NAME" \ + -F "variables[UPSTREAM_HELM_ARTIFACT_JOB_NAME]=$HELM_ARTIFACT_JOB_NAME" \ + -F "variables[UPSTREAM_REGISTRY_PATH]=$CI_REGISTRY_IMAGE" \ + "$CI_API_V4_URL/projects/$CI_DEPLOY_REPO_ID/trigger/pipeline" + - "echo 'The $PROJECT_NAME can be viewed on: $PROJECT_URL'" + rules: + - if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "development"' + +deploy-dev: + stage: deploy + image: alpine:latest + before_script: + - apk add --no-cache openssh-client sed + - eval $(ssh-agent -s) + - ssh-add <(echo "$CI_SSH_KEY" | tr -d '\r') + script: + - sed -i -e "s|DOCKER_REGISTRY_REPO|$CI_REGISTRY_IMAGE|" docker-compose.dev.yml + - sed -i -e "s|DEV_TAG|dev|" docker-compose.dev.yml + - 'scp -P $CI_SSH_PORT -o StrictHostKeyChecking=no -o LogLevel=ERROR ./docker-compose.dev.yml + ./reverseproxy.dev.conf $CI_SSH_USER@$CI_SSH_DEV_HOST:/home/$CI_SSH_USER/docker/htwkalender/ + + ' + - 'ssh -p $CI_SSH_PORT -o StrictHostKeyChecking=no -o LogLevel=ERROR $CI_SSH_USER@$CI_SSH_DEV_HOST + "cd /home/$CI_SSH_USER/docker/htwkalender/ && docker login -u $CI_REGISTRY_USER + -p $CI_REGISTRY_PASSWORD $CI_REGISTRY && docker compose -f ./docker-compose.dev.yml + down && docker compose -f ./docker-compose.dev.yml up -d --remove-orphans && docker + logout" + + ' + rules: + - if: $CI_COMMIT_BRANCH == "development" + +deploy-main: + stage: deploy + image: alpine:latest + before_script: + - apk add --no-cache openssh-client sed # install dependencies + - eval $(ssh-agent -s) # set some ssh variables + - ssh-add <(echo "$CI_SSH_KEY" | tr -d '\r') + script: + # replace some placeholders + - sed -i -e "s|DOCKER_REGISTRY_REPO|$CI_REGISTRY_IMAGE|" docker-compose.prod.yml + - sed -i -e "s|PROD_TAG|latest|" docker-compose.prod.yml + # upload necessary files to the server + - > + scp -P $CI_SSH_PORT -o StrictHostKeyChecking=no -o LogLevel=ERROR ./docker-compose.prod.yml ./reverseproxy.conf + $CI_SSH_USER@$CI_SSH_HOST:/home/$CI_SSH_USER/docker/htwkalender/ + # ssh to the server and start the service + - > + ssh -p $CI_SSH_PORT -o StrictHostKeyChecking=no -o LogLevel=ERROR $CI_SSH_USER@$CI_SSH_HOST + "cd /home/$CI_SSH_USER/docker/htwkalender/ && + docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY && + docker compose -f ./docker-compose.prod.yml down && docker compose -f ./docker-compose.prod.yml up -d --remove-orphans && docker logout && + docker exec --user root htwkalender-htwkalender-frontend-1 /bin/sh -c \"echo 'google-site-verification: $GOOGLE_VERIFICATION.html' > ./$GOOGLE_VERIFICATION.html\" " + rules: + - if: $CI_COMMIT_BRANCH == "main" diff --git a/charts/templates/_helpers.tpl b/charts/templates/_helpers.tpl new file mode 100644 index 0000000..a22e998 --- /dev/null +++ b/charts/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "htwkalender.name" -}} +{{- default .Release.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 "htwkalender.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 "htwkalender.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "htwkalender.labels" -}} +helm.sh/chart: {{ include "htwkalender.chart" . }} +{{ include "htwkalender.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "htwkalender.selectorLabels" -}} +app.kubernetes.io/name: {{ include "htwkalender.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "htwkalender.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "htwkalender.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/charts/templates/deployment-data-manager.yaml b/charts/templates/deployment-data-manager.yaml new file mode 100644 index 0000000..29b1cb0 --- /dev/null +++ b/charts/templates/deployment-data-manager.yaml @@ -0,0 +1,50 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "htwkalender.name" . }}-data-manager + namespace: {{ .Release.Namespace }} + labels: + {{- include "htwkalender.labels" . | nindent 4 }} + component: data-manager + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.dataManager.replicas }} + selector: + matchLabels: + {{- include "htwkalender.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "htwkalender.labels" . | nindent 8 }} + component: data-manager + spec: + securityContext: + fsGroup: 1000 + runAsUser: 1000 + runAsGroup: 1000 + containers: + - name: {{ .Chart.Name }}-data-manager + image: "{{ .Values.dataManager.image.name }}" + imagePullPolicy: {{ .Values.dataManager.image.pullPolicy }} + ports: + - name: data-manager + containerPort: {{ .Values.dataManager.service.targetPort }} + protocol: TCP + volumeMounts: + {{- if .Values.persistence.enabled }} + - name: {{ include "htwkalender.name" . }}-storage + mountPath: /htwkalender-data-manager/data + {{- end }} + volumes: + {{- if .Values.persistence.enabled }} + - name: {{ include "htwkalender.name" . }}-storage + persistentVolumeClaim: + claimName: {{ include "htwkalender.name" . }}-storage + {{- end }} diff --git a/charts/templates/deployment-frontend.yaml b/charts/templates/deployment-frontend.yaml new file mode 100644 index 0000000..52bebc4 --- /dev/null +++ b/charts/templates/deployment-frontend.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "htwkalender.name" . }}-frontend + namespace: {{ .Release.Namespace }} + labels: + {{- include "htwkalender.labels" . | nindent 4 }} + component: frontend + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.frontend.replicas }} + selector: + matchLabels: + {{- include "htwkalender.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "htwkalender.labels" . | nindent 8 }} + component: frontend + spec: + containers: + - name: {{ .Chart.Name }}-frontend + image: "{{ .Values.frontend.image.name }}" + imagePullPolicy: {{ .Values.frontend.image.pullPolicy }} + ports: + - name: frontend + containerPort: {{ .Values.frontend.service.targetPort }} + protocol: TCP + volumeMounts: + {{- if .Values.production }} + - name: configmap-google + mountPath: /{{ .Values.frontend.googleSiteVerification }}.html + subPath: {{ .Values.frontend.googleSiteVerification }}.html + readOnly: true + {{- end }} + {{- if .Values.production }} + volumes: + - name: configmap-google + configMap: + name: configmap-google + {{- end }} + \ No newline at end of file diff --git a/charts/templates/deployment-ical.yaml b/charts/templates/deployment-ical.yaml new file mode 100644 index 0000000..6454d8a --- /dev/null +++ b/charts/templates/deployment-ical.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "htwkalender.name" . }}-ical + namespace: {{ .Release.Namespace }} + labels: + {{- include "htwkalender.labels" . | nindent 4 }} + component: ical + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.ical.replicas }} + selector: + matchLabels: + {{- include "htwkalender.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "htwkalender.labels" . | nindent 8 }} + component: ical + spec: + containers: + - name: {{ .Chart.Name }}-ical + image: "{{ .Values.ical.image.name }}" + imagePullPolicy: {{ .Values.ical.image.pullPolicy }} + ports: + - name: ical + containerPort: {{ .Values.ical.service.targetPort }} + protocol: TCP + env: + - name: DATA_MANAGER_URL + value: {{ .Values.dataManager.service.name }} \ No newline at end of file diff --git a/charts/templates/pvc-data-manager.yaml b/charts/templates/pvc-data-manager.yaml new file mode 100644 index 0000000..41c876e --- /dev/null +++ b/charts/templates/pvc-data-manager.yaml @@ -0,0 +1,16 @@ +{{- if .Values.persistence.enabled }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "htwkalender.name" . }}-storage + namespace: {{ .Release.Namespace }} +spec: + {{- with .Values.persistence.accessModes }} + accessModes: + {{- toYaml . | nindent 4 }} + {{- end }} + resources: + requests: + storage: {{ .Values.persistence.size }} + storageClassName: {{ .Values.persistence.storageClassName }} +{{- end }} \ No newline at end of file diff --git a/charts/templates/service-data-manager.yaml b/charts/templates/service-data-manager.yaml new file mode 100644 index 0000000..331f2b0 --- /dev/null +++ b/charts/templates/service-data-manager.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.dataManager.service.name }} + labels: + {{- include "htwkalender.labels" . | nindent 4 }} + namespace: {{ .Release.Namespace }} +spec: + type: ClusterIP + selector: + {{- include "htwkalender.selectorLabels" . | nindent 4 }} + component: data-manager + ports: + - port: {{ .Values.dataManager.service.port }} + targetPort: {{ .Values.dataManager.service.targetPort }} + protocol: TCP + name: data-manager diff --git a/charts/templates/service-frontend.yaml b/charts/templates/service-frontend.yaml new file mode 100644 index 0000000..924fafa --- /dev/null +++ b/charts/templates/service-frontend.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.frontend.service.name }} + labels: + {{- include "htwkalender.labels" . | nindent 4 }} + namespace: {{ .Release.Namespace }} +spec: + type: ClusterIP + selector: + {{- include "htwkalender.selectorLabels" . | nindent 4 }} + component: frontend + ports: + - port: {{ .Values.frontend.service.port }} + targetPort: {{ .Values.frontend.service.targetPort }} + protocol: TCP + name: frontend diff --git a/charts/templates/service-ical.yaml b/charts/templates/service-ical.yaml new file mode 100644 index 0000000..f93cd47 --- /dev/null +++ b/charts/templates/service-ical.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.ical.service.name }} + labels: + {{- include "htwkalender.labels" . | nindent 4 }} + namespace: {{ .Release.Namespace }} +spec: + type: ClusterIP + selector: + {{- include "htwkalender.selectorLabels" . | nindent 4 }} + component: ical + ports: + - port: {{ .Values.ical.service.port }} + targetPort: {{ .Values.ical.service.targetPort }} + protocol: TCP + name: ical diff --git a/charts/values.yaml b/charts/values.yaml new file mode 100644 index 0000000..4f3468c --- /dev/null +++ b/charts/values.yaml @@ -0,0 +1,127 @@ +production: true + +dataManager: + name: data-manager + replicas: 1 + image: + name: "PLACEHOLDER" + pullPolicy: &PULL_POLICY Always + service: + name: &service_data_manager htwkalender-data-manager + port: &service_data_manager_port 80 + targetPort: 8090 +ical: + name: ical + replicas: 2 + image: + name: "PLACEHOLDER" + pullPolicy: *PULL_POLICY + service: + name: &service_ical htwkalender-ical + port: &service_ical_port 80 + targetPort: 8091 +frontend: + name: frontend + host: &frontend_host "FRONTEND_URL" + googleSiteVerification: "PLACEHOLDER" + replicas: 1 + image: + name: "PLACEHOLDER" + pullPolicy: *PULL_POLICY + service: + name: &service_frontend htwkalender-frontend + port: &service_frontend_port 80 + targetPort: 8000 + +persistence: + enabled: true + accessModes: + - ReadWriteOnce + storageClassName: "PLACEHOLDER" + size: 19Gi + +# This is to setup the liveness and readiness probes more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ +livenessProbe: + httpGet: + path: / + port: http +readinessProbe: + httpGet: + path: / + port: http + +ingress: + hosts: + - host: *frontend_host + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: *service_frontend + port: + number: *service_frontend_port + - path: /api/feed/room + pathType: ImplementationSpecific + backend: + service: + name: *service_ical + port: + number: *service_ical_port + - path: /api/feed + pathType: ImplementationSpecific + backend: + service: + name: *service_ical + port: + number: *service_ical_port + - path: /api + pathType: ImplementationSpecific + backend: + service: + name: *service_data_manager + port: + number: *service_data_manager_port + - path: /api/modules + pathType: ImplementationSpecific + backend: + service: + name: *service_data_manager + port: + number: *service_data_manager_port + - path: /api/events/types + pathType: ImplementationSpecific + backend: + service: + name: *service_data_manager + port: + number: *service_data_manager_port + - path: /api/rooms + pathType: ImplementationSpecific + backend: + service: + name: *service_data_manager + port: + number: *service_data_manager_port + - path: /api/schedule + pathType: ImplementationSpecific + backend: + service: + name: *service_data_manager + port: + number: *service_data_manager_port + - path: /api/courses + pathType: ImplementationSpecific + backend: + service: + name: *service_data_manager + port: + number: *service_data_manager_port + - path: /_ + pathType: ImplementationSpecific + backend: + service: + name: *service_data_manager + port: + number: *service_data_manager_port diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 8a30288..e2c3dcc 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -16,8 +16,7 @@ services: htwkalender-data-manager: - image: DOCKER_REGISTRY_REPO-data-manager # DOCKER_REGISTRY_REPO will be replaced by CI - command: "--http=0.0.0.0:8090 --dir=/htwkalender-data-manager/data/pb_data" + image: DOCKER_REGISTRY_REPO/data-manager:DEV_TAG # DOCKER_REGISTRY_REPO will be replaced by CI pull_policy: always restart: always volumes: @@ -26,7 +25,7 @@ services: - "net" htwkalender-ical: - image: DOCKER_REGISTRY_REPO-ical # DOCKER_REGISTRY_REPO will be replaced by CI + image: DOCKER_REGISTRY_REPO/ical:DEV_TAG # DOCKER_REGISTRY_REPO will be replaced by CI pull_policy: always restart: always environment: @@ -37,7 +36,7 @@ services: - htwkalender-data-manager htwkalender-frontend: - image: DOCKER_REGISTRY_REPO-frontend # DOCKER_REGISTRY_REPO will be replaced by CI + image: DOCKER_REGISTRY_REPO/frontend:DEV_TAG # DOCKER_REGISTRY_REPO will be replaced by CI pull_policy: always restart: always depends_on: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 061692b..51aba43 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -16,8 +16,7 @@ services: htwkalender-data-manager: - image: DOCKER_REGISTRY_REPO-data-manager # DOCKER_REGISTRY_REPO will be replaced by CI - command: "--http=0.0.0.0:8090 --dir=/htwkalender-data-manager/data/pb_data" + image: DOCKER_REGISTRY_REPO/data-manager:PROD_TAG # DOCKER_REGISTRY_REPO will be replaced by CI pull_policy: always restart: always volumes: @@ -26,7 +25,7 @@ services: - "net" htwkalender-ical: - image: DOCKER_REGISTRY_REPO-ical # DOCKER_REGISTRY_REPO will be replaced by CI + image: DOCKER_REGISTRY_REPO/ical:PROD_TAG # DOCKER_REGISTRY_REPO will be replaced by CI pull_policy: always restart: always environment: @@ -37,7 +36,7 @@ services: - htwkalender-data-manager htwkalender-frontend: - image: DOCKER_REGISTRY_REPO-frontend # DOCKER_REGISTRY_REPO will be replaced by CI + image: DOCKER_REGISTRY_REPO/frontend:PROD_TAG # DOCKER_REGISTRY_REPO will be replaced by CI pull_policy: always restart: always depends_on: diff --git a/docker-compose.yml b/docker-compose.yml index c78b9ac..ec91052 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,8 +19,7 @@ services: build: dockerfile: ./data-manager/Dockerfile context: ./services - target: dev # prod - command: "--http=0.0.0.0:8090 --dir=/htwkalender-data-manager/data/pb_data" + target: prod ports: - "8090:8090" - "50051:50051" @@ -33,7 +32,7 @@ services: build: dockerfile: ./ical/Dockerfile context: ./services - target: dev # prod + target: prod environment: - DATA_MANAGER_URL=htwkalender-data-manager depends_on: @@ -43,7 +42,7 @@ services: build: dockerfile: Dockerfile context: ./frontend - target: dev + target: prod command: "npm run dev" # open port 8000 ports: diff --git a/services/data-manager/Dockerfile b/services/data-manager/Dockerfile index 0799b2d..d24ec91 100644 --- a/services/data-manager/Dockerfile +++ b/services/data-manager/Dockerfile @@ -48,34 +48,4 @@ RUN chmod +x main EXPOSE 8090 ENTRYPOINT ["./main", "serve"] - - -FROM golang:1.23 AS dev - -# Set the Current Working Directory inside the container -WORKDIR /htwkalender-data-manager - -ARG USER=ical -RUN adduser "$USER" && \ - chown "$USER":"$USER" ./ \ - && mkdir -p /htwkalender-data-manager/data \ - && chown "$USER":"$USER" /htwkalender-data-manager/data - -# Copy go mod and sum files -COPY go.mod go.sum ./ -RUN go mod download - -# Copy the source from the current directory to the Working Directory inside the container -COPY data-manager/. ./data-manager -COPY common/. ./common - -# Build the Go app -RUN CGO_ENABLED=1 GOOS=linux go build -o /htwkalender-data-manager data-manager/main.go - -# Expose port 8091 to the outside world -EXPOSE 8091 - -USER $USER - -# Entry point -ENTRYPOINT ["./main", "serve"] \ No newline at end of file +CMD ["--http=0.0.0.0:8090", "--dir=/htwkalender-data-manager/data/pb_data"] diff --git a/services/ical/Dockerfile b/services/ical/Dockerfile index 446d796..5093bb6 100644 --- a/services/ical/Dockerfile +++ b/services/ical/Dockerfile @@ -47,26 +47,3 @@ COPY --chown=$USER:$USER --from=build /htwkalender-ical ./ EXPOSE 8091 ENTRYPOINT ["./main"] - - -FROM golang:1.23 AS dev - -# Set the Current Working Directory inside the container -WORKDIR /htwkalender-ical - -# Copy go mod and sum files -COPY go.mod go.sum ./ -RUN go mod download - -# Copy the source from the current directory to the Working Directory inside the container -COPY ical/. ./ical -COPY common/. ./common - -# Build the Go app -RUN CGO_ENABLED=1 GOOS=linux go build -o /htwkalender-ical ical/main.go - -# Expose port 8091 to the outside world -EXPOSE 8091 - -# Entry point -ENTRYPOINT ["./main"] \ No newline at end of file