diff --git a/alfa-client/Jenkinsfile.storybook b/alfa-client/Jenkinsfile.storybook new file mode 100644 index 0000000000000000000000000000000000000000..b589706023ff460ecc9ec5c164b431b464c8c610 --- /dev/null +++ b/alfa-client/Jenkinsfile.storybook @@ -0,0 +1,248 @@ +pipeline { + agent { + node { + label 'ozgcloud-jenkins-build-agent' + } + } + + environment { + BLUE_OCEAN_URL = "https://jenkins.infra.ozg-cloud.systems/job/storybook/job/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/" + RELEASE_REGEX = /\d+.\d+.\d+/ + SNAPSHOT_REGEX = /\d+.\d+.\d+-SNAPSHOT/ + FAILED_STAGE = "" + SH_SUCCESS_STATUS_CODE = 0 + + } + + options { + timeout(time: 1, unit: 'HOURS') + disableConcurrentBuilds() + buildDiscarder(logRotator(numToKeepStr: '5')) + } + + stages { + stage('Check Version') { + steps { + script { + FAILED_STAGE = env.STAGE_NAME + dir('alfa-client') { + VERSION = getPackagejsonVersion() + } + } + } + } + + stage('build storybook and its docker image') { + steps { + script { + FAILED_STAGE=env.STAGE_NAME + + dir('alfa-client') { + + withNPM(npmrcConfig: 'a4272a20-bb67-4cf7-8ce5-a1c3ac66613c') { + sh 'npm cache verify' + sh 'npm install' + sh 'npm run ci-storybook' + } + + + + + } + + } + } + } + + stage('Tag and Push Docker image') { + steps { + script { + FAILED_STAGE=env.STAGE_NAME + IMAGE_TAG = generateImageTag() + + tagAndPushDockerImage(IMAGE_TAG) + + if (isMasterBranch()) { + tagAndPushDockerImage('snapshot-latest') + } + } + } + } + + stage('Test, build and deploy Helm Chart') { + steps { + script { + HELM_CHART_VERSION = generateHelmChartVersion() + + dir('alfa-client/libs/design-system') { + sh "./run_helm_test.sh" + } + + dir('alfa-client/libs/design-system/main/helm') { + + sh "helm package --version=${HELM_CHART_VERSION} ." + + deployHelmChart(HELM_CHART_VERSION) + } + } + } + } + + stage('Trigger Dev rollout') { + when { + branch 'master' + } + steps { + script { + FAILED_STAGE = env.STAGE_NAME + + cloneGitopsRepo() + + setNewGitopsVersion() + pushGitopsRepo() + } + } + } + } + + post { + failure { + script { + if (isMasterBranch()) { + sendFailureMessage() + } + } + } + } +} + + + +String generateImageTag() { + def imageTag = "${env.BRANCH_NAME}-${VERSION}" + + if (isMasterBranch()) { + imageTag += "-${env.GIT_COMMIT.take(7)}" + } + + return imageTag +} + +Void cloneGitopsRepo() { + withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) { + sh 'git clone https://${USER}:${TOKEN}@git.ozg-sh.de/ozgcloud-devops/gitops.git' + } + configureGit() +} + +Void configureGit() { + final email = "jenkins@ozg-sh.de" + final name = "jenkins" + + dir("gitops") { + sh "git config user.email '${email}'" + sh "git config user.name '${name}'" + } +} + + + +Void setNewGitopsVersion() { + dir("gitops") { + def envFile = "dev/application/values/storybook-values.yaml" + + def envVersions = readYaml file: envFile + + envVersions.storybook.image.tag = IMAGE_TAG + envVersions.storybook.helm.version = HELM_CHART_VERSION + + writeYaml file: envFile, data: envVersions, overwrite: true + + if (hasValuesFileChanged()) { + sh "git add ${envFile}" + sh "git commit -m 'jenkins rollout dev storybook version ${IMAGE_TAG}'" + } + } +} + +Boolean hasValuesFileChanged() { + return sh (script: "git status | grep 'dev/application/values/storybook-values.yaml'", returnStatus: true) == env.SH_SUCCESS_STATUS_CODE as Integer +} + + +Void pushGitopsRepo() { + withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) { + dir("gitops") { + if (hasUnpushedCommits()) { + sh 'git push https://${USER}:${TOKEN}@git.ozg-sh.de/ozgcloud-devops/gitops.git' + } + } + } +} + +Boolean hasUnpushedCommits() { + return sh (script: "git cherry -v | grep .", returnStatus: true) == env.SH_SUCCESS_STATUS_CODE as Integer +} + +Void tagAndPushDockerImage(String newTag){ + withCredentials([usernamePassword(credentialsId: 'jenkins-nexus-login', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) { + sh 'docker login docker.ozg-sh.de -u ${USER} -p ${PASSWORD}' + + sh "docker tag docker.ozg-sh.de/storybook:build-latest docker.ozg-sh.de/storybook:${newTag}" + sh "docker push docker.ozg-sh.de/storybook:${newTag}" + } +} +String getPackagejsonVersion() { + def packageJSON = readJSON file: 'package.json' + def packageJSONVersion = packageJSON.version + echo packageJSONVersion + return packageJSONVersion +} + +Void deployHelmChart(String helmChartVersion) { + withCredentials([usernamePassword(credentialsId: 'jenkins-nexus-login', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]){ + + result = sh script: '''curl -u $USERNAME:$PASSWORD https://nexus.ozg-sh.de/service/rest/v1/components?repository=ozg-base-apps-snapshot -F file=@storybook-'''+helmChartVersion+'''.tgz''', returnStdout: true + + if (result != '') { + error(result) + } + } +} +String generateHelmChartVersion() { + def chartVersion = "${VERSION}" + + if (isMasterBranch()) { + chartVersion += "-${env.GIT_COMMIT.take(7)}" + } + else { + chartVersion += "-${env.BRANCH_NAME}" + } + + return chartVersion.replaceAll("_", "-") +} + +Boolean isMasterBranch() { + return env.BRANCH_NAME == 'master' +} + +Void sendFailureMessage() { + def room = '' + def data = """{"msgtype":"m.text", \ + "body":"storybook: Build Failed. Stage: ${FAILED_STAGE} Build-ID: ${env.BUILD_NUMBER} Link: ${BLUE_OCEAN_URL}", \ + "format": "org.matrix.custom.html", \ + "formatted_body":"storybook: Build Failed. Stage: ${FAILED_STAGE} Build-ID: <a href='${BLUE_OCEAN_URL}'>${env.BUILD_NUMBER}</a>"}""" + + if (isMasterBranch()) { + room = "!iQPAvQIiRwRpNOszjw:matrix.ozg-sh.de" + } + + sh "curl -XPOST -H 'authorization: Bearer ${getElementAccessToken()}' -d '${data}' https://matrix.ozg-sh.de/_matrix/client/v3/rooms/$room/send/m.room.message" +} + + +String getElementAccessToken() { + withCredentials([string(credentialsId: 'element-login-json', variable: 'LOGIN_JSON')]) { + return readJSON ( text: sh (script: '''curl -XPOST -d \"$LOGIN_JSON\" https://matrix.ozg-sh.de/_matrix/client/v3/login''', returnStdout: true)).access_token + } +} diff --git a/alfa-client/apps/admin/src/test/helm/deployment_ozgcloud_base_values_test.yaml b/alfa-client/apps/admin/src/test/helm/deployment_ozgcloud_base_values_test.yaml index da65f0a3297ad7f4ea15eab169824106dfba7492..6dbb84123ca23ff9e55d34392cff78b1ca64afb8 100644 --- a/alfa-client/apps/admin/src/test/helm/deployment_ozgcloud_base_values_test.yaml +++ b/alfa-client/apps/admin/src/test/helm/deployment_ozgcloud_base_values_test.yaml @@ -33,6 +33,9 @@ set: tests: - it: should fail on missing environment + set: + ozgcloud: + environment: dev asserts: - failedTemplate: errorMessage: ozgcloud.environment muss angegeben sein diff --git a/alfa-client/libs/design-system/Dockerfile b/alfa-client/libs/design-system/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..db2112bd5fa7878771e6c2a1fac73bd58feb4e09 --- /dev/null +++ b/alfa-client/libs/design-system/Dockerfile @@ -0,0 +1,5 @@ +FROM nginxinc/nginx-unprivileged:stable-alpine + + +COPY dist/storybook /usr/share/nginx/html/ +COPY libs/design-system/nginx.conf /etc/nginx/nginx.conf \ No newline at end of file diff --git a/alfa-client/libs/design-system/main/helm/Chart.yaml b/alfa-client/libs/design-system/main/helm/Chart.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fcdc7922e7386ee8ab01671dd283b5df3778f037 --- /dev/null +++ b/alfa-client/libs/design-system/main/helm/Chart.yaml @@ -0,0 +1,30 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +apiVersion: v1 +appVersion: '1.0' +description: A Helm chart for storybook +name: storybook +version: 0.0.0-MANAGED-BY-JENKINS +icon: https://simpleicons.org/icons/helm.svg diff --git a/alfa-client/libs/design-system/main/helm/templates/_helpers.tpl b/alfa-client/libs/design-system/main/helm/templates/_helpers.tpl new file mode 100644 index 0000000000000000000000000000000000000000..08da97368b065f836fbcc316b69c38c77e7a47a9 --- /dev/null +++ b/alfa-client/libs/design-system/main/helm/templates/_helpers.tpl @@ -0,0 +1,81 @@ + +{{/* error check 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec) */}} +{{/* Namespace */}} +{{- define "app.namespace" -}} +{{- if gt (len (.Release.Namespace)) 63 -}} +{{- fail (printf ".Release.Namespace %s ist zu lang (max. 63 Zeichen)" .Release.Namespace) -}} +{{- end -}} +{{ printf "%s" .Release.Namespace }} +{{- end -}} + +{{/* Chart: Name + Version */}} +{{- define "app.chart" -}} +{{- if gt (len (printf "%s-%s" .Chart.Name .Chart.Version)) 63 -}} +{{- fail (printf ".Chart.Name-.Chart.Version %s-%s ist zu lang (max. 63 Zeichen)" .Chart.Name .Chart.Version) -}} +{{- end -}} +{{ printf "%s-%s" .Chart.Name .Chart.Version }} +{{- end -}} + +{{/* Managed-by -> On Helm, this value is always Helm */}} +{{- define "app.managedBy" -}} +{{- if gt (len (.Release.Service)) 63 -}} +{{- fail (printf ".Release.Service %s ist zu lang (max. 63 Zeichen)" .Release.Service) -}} +{{- end -}} +{{ printf "%s" .Release.Service }} +{{- end -}} + + +{{/* Default Labels: Helm recommended best-practice labels https://helm.sh/docs/chart_best_practices/labels/ */}} +{{- define "app.defaultLabels" }} +app.kubernetes.io/instance: storybook +app.kubernetes.io/managed-by: {{ include "app.managedBy" . }} +app.kubernetes.io/name: {{ .Release.Name }} +app.kubernetes.io/namespace: {{ include "app.namespace" . }} +app.kubernetes.io/part-of: ozgcloud +app.kubernetes.io/version: {{ .Chart.Version }} +helm.sh/chart: {{ include "app.chart" . }} +{{- end -}} + +{{- define "app.matchLabels" }} +app.kubernetes.io/name: {{ .Release.Name }} +app.kubernetes.io/namespace: {{ include "app.namespace" . }} +{{- end -}} + + +{{- define "app.serviceAccountName" -}} +{{ printf "%s" ( (.Values.serviceAccount).name | default "storybook-service-account" ) }} +{{- end -}} + + +{{- define "app.baseDomain" -}} +{{- printf "%s.%s" (include "app.ozgcloudBezeichner" . ) (include "app.baseUrl" . ) }} +{{- end -}} + +{{- define "app.ozgcloudBezeichner" -}} +{{- required "ozgcloud.bezeichner muss angegeben sein" (.Values.ozgcloud).bezeichner -}} +{{- if lt 46 (len (.Values.ozgcloud).bezeichner) -}} +{{ fail (printf "ozgcloud.bezeichner %s ist zu lang (max. 46 Zeichen)" (.Values.ozgcloud).bezeichner) }} +{{- end -}} +{{- end -}} + +{{- define "app.baseUrl" -}} +{{- required "baseUrl muss angegeben sein" .Values.baseUrl }} +{{- end -}} + +{{- define "app.getCustomList" -}} +{{- with (.Values.env).customList -}} +{{- if kindIs "map" . -}} +{{ include "app.dictToList" . }} +{{- else if kindIs "slice" . -}} +{{ . | toYaml }} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- define "app.dictToList" -}} +{{- $customList := list -}} +{{- range $key, $value := . -}} +{{- $customList = append $customList (dict "name" $key "value" $value) }} +{{- end -}} +{{- $customList | toYaml -}} +{{- end -}} \ No newline at end of file diff --git a/alfa-client/libs/design-system/main/helm/templates/deployment.yaml b/alfa-client/libs/design-system/main/helm/templates/deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7daf47c5c1e9f110de1a378b984698d9130c3c69 --- /dev/null +++ b/alfa-client/libs/design-system/main/helm/templates/deployment.yaml @@ -0,0 +1,122 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }} + namespace: {{ include "app.namespace" . }} + labels: + {{- include "app.defaultLabels" . | indent 4 }} +spec: + progressDeadlineSeconds: 600 + replicas: {{ .Values.replicaCount }} + revisionHistoryLimit: 10 + selector: + matchLabels: + {{- include "app.matchLabels" . | indent 6 }} + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + labels: + {{- include "app.defaultLabels" . | indent 8 }} + component: storybook + spec: + {{- if (.Values.serviceAccount).create }} + serviceAccountName: {{ include "app.serviceAccountName" . }} + {{- end }} + topologySpreadConstraints: + - maxSkew: 1 + topologyKey: kubernetes.io/hostname + whenUnsatisfiable: ScheduleAnyway + labelSelector: + matchLabels: + app.kubernetes.io/name: {{ .Release.Name }} + + containers: + - env: + {{- with include "app.getCustomList" . }} +{{ . | indent 8 }} + {{- end }} + + image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}" + imagePullPolicy: Always + name: storybook + + startupProbe: + httpGet: + path: / + port: 8080 + scheme: HTTP + timeoutSeconds: 3 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 8080 + scheme: HTTP + timeoutSeconds: 3 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 3 + + resources: + {{- with .Values.resources }} +{{ toYaml . | indent 10 }} + {{- end }} + securityContext: + allowPrivilegeEscalation: false + privileged: false + readOnlyRootFilesystem: false + runAsNonRoot: true + {{- with (.Values.securityContext).runAsUser }} + runAsUser: {{ . }} + {{- end }} + {{- with (.Values.securityContext).runAsGroup }} + runAsGroup: {{ . }} + {{- end }} + stdin: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + tty: true + + + dnsConfig: {} + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: {{ required "imagePullSecret must be set" .Values.imagePullSecret }} + restartPolicy: Always + {{- with .Values.hostAliases }} + hostAliases: +{{ toYaml . | indent 8 }} + {{- end }} + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 diff --git a/alfa-client/libs/design-system/main/helm/templates/ingress.yaml b/alfa-client/libs/design-system/main/helm/templates/ingress.yaml new file mode 100644 index 0000000000000000000000000000000000000000..05882a4bd3278a2170632c8e70319e2011b1823f --- /dev/null +++ b/alfa-client/libs/design-system/main/helm/templates/ingress.yaml @@ -0,0 +1,39 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ .Release.Name }} + namespace: {{ include "app.namespace" . }} + annotations: + {{- if (.Values.ingress).certManagerAnnotations -}} + {{- range (.Values.ingress).certManagerAnnotations }} +{{ . | indent 4 }} + {{- end }} + {{- else if (.Values.ingress).use_staging_cert }} + cert-manager.io/cluster-issuer: letsencrypt-staging + {{- else }} + cert-manager.io/cluster-issuer: letsencrypt-prod + {{- end }} +spec: + {{- if and (.Values.ingress).className (ne (.Values).cluster_env "dataport") }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: storybook + port: + number: 8080 + + host: {{ include "app.baseDomain" . }} + tls: + - hosts: + - {{ include "app.baseDomain" . }} + {{- if (.Values.ingress).tlsSecretName }} + secretName: {{ (.Values.ingress).tlsSecretName }} + {{- else if ne (.Values).cluster_env "dataport" }} + secretName: {{ .Values.ozgcloud.bezeichner }}-{{ .Release.Name }}-tls + {{- end }} \ No newline at end of file diff --git a/alfa-client/libs/design-system/main/helm/templates/network_policy.yaml b/alfa-client/libs/design-system/main/helm/templates/network_policy.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9e281036f63a8e3bdaeb45223007d484a80af2c3 --- /dev/null +++ b/alfa-client/libs/design-system/main/helm/templates/network_policy.yaml @@ -0,0 +1,44 @@ +{{- if not (.Values.networkPolicy).disabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: network-policy-storybook + namespace: {{ .Release.Namespace }} +spec: + podSelector: + matchLabels: + {{- include "app.matchLabels" . | indent 6 }} + policyTypes: + - Ingress + - Egress + ingress: + - ports: + - port: 8080 +{{- with (.Values.networkPolicy).additionalIngressConfigLocal }} +{{ toYaml . | indent 2 }} +{{- end }} +{{- with (.Values.networkPolicy).additionalIngressConfigGlobal }} +{{ toYaml . | indent 2 }} +{{- end }} + egress: + - to: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: {{ required "networkPolicy.dnsServerNamespace must be set" (.Values.networkPolicy).dnsServerNamespace }} + ports: + - port: 53 + protocol: UDP + - port: 53 + protocol: TCP + - port: 5353 + protocol: UDP + - port: 5353 + protocol: TCP +{{- with (.Values.networkPolicy).additionalEgressConfigLocal }} +{{ toYaml . | indent 2 }} +{{- end }} +{{- with (.Values.networkPolicy).additionalEgressConfigGlobal }} +{{ toYaml . | indent 2 }} +{{- end }} + +{{- end }} \ No newline at end of file diff --git a/alfa-client/libs/design-system/main/helm/templates/service.yaml b/alfa-client/libs/design-system/main/helm/templates/service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a4a152fab1b685e2df235e8b067db58d5c5a995d --- /dev/null +++ b/alfa-client/libs/design-system/main/helm/templates/service.yaml @@ -0,0 +1,43 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }} + namespace: {{ include "app.namespace" . }} + labels: + {{- include "app.defaultLabels" . | indent 4 }} + component: storybook-service +spec: + type: ClusterIP + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 8080 + + selector: + {{- include "app.matchLabels" . | indent 4 }} + component: storybook \ No newline at end of file diff --git a/alfa-client/libs/design-system/main/helm/values.yaml b/alfa-client/libs/design-system/main/helm/values.yaml new file mode 100644 index 0000000000000000000000000000000000000000..68df0d24e6ecee39af5ae05d521a2f89dec67f22 --- /dev/null +++ b/alfa-client/libs/design-system/main/helm/values.yaml @@ -0,0 +1,6 @@ +image: + repo: docker.ozg-sh.de + name: storybook + tag: 0.1.0 # [default: latest] +replicaCount: 1 + diff --git a/alfa-client/libs/design-system/nginx.conf b/alfa-client/libs/design-system/nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..add779e6030ab68ebb8f5dde211d26f25e69a2e4 --- /dev/null +++ b/alfa-client/libs/design-system/nginx.conf @@ -0,0 +1,58 @@ +# Verarbeitungsreihenfolge von location rules: +# -------------------------------------------------------------------------------------------------------------------------------------------- +# Search-Order Modifier Description Match-Type Stops-search-on-match +# -------------------------------------------------------------------------------------------------------------------------------------------- +# 1st = The URI must match the specified pattern exactly Simple-string Yes +# 2nd ^~ The URI must begin with the specified pattern Simple-string Yes +# 3rd (None) The URI must begin with the specified pattern Simple-string No +# 4th ~ The URI must be a case-sensitive match to the specified Rx Perl-Compatible-Rx Yes (first match) +# 4th ~* The URI must be a case-insensitive match to the specified Rx Perl-Compatible-Rx Yes (first match) +# N/A @ Defines a named location block. Simple-string Yes +# -------------------------------------------------------------------------------------------------------------------------------------------- +# +# Regex Matches werden bevorzugt verwendet. +# Mehr: https://stackoverflow.com/a/59846239/1546181 +pid /tmp/nginx.pid; +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include mime.types; + server_tokens off; + access_log off; + error_log stderr crit; + + server { + listen 8080; + server_name localhost; + + + + location / { + root /usr/share/nginx/html/design-system; + index index.html index.htm; + } + + + + client_body_temp_path /tmp/client_temp; + proxy_temp_path /tmp/proxy_temp_path; + fastcgi_temp_path /tmp/fastcgi_temp; + uwsgi_temp_path /tmp/uwsgi_temp; + scgi_temp_path /tmp/scgi_temp; + + gzip on; + gzip_min_length 1000; + gzip_proxied expired no-cache no-store private auth; + gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; + + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + } +} diff --git a/alfa-client/libs/design-system/project.json b/alfa-client/libs/design-system/project.json index bcec7a688f84eefe1731c08cc4fa56e21e415975..bc681e80f5d762322adf47a62dba25464c0a7a0d 100644 --- a/alfa-client/libs/design-system/project.json +++ b/alfa-client/libs/design-system/project.json @@ -48,6 +48,21 @@ "quiet": true } } + }, + "container": { + "executor": "@nx-tools/nx-container:build", + "dependsOn": ["build"], + "options": { + "engine": "docker", + "push": false, + "metadata": { + "images": ["docker.ozg-sh.de/storybook"], + "load": true, + "tags": [ + "build-latest" + ] + } + } } } } diff --git a/alfa-client/libs/design-system/run_helm_test.sh b/alfa-client/libs/design-system/run_helm_test.sh new file mode 100755 index 0000000000000000000000000000000000000000..03f7485f84e6da1fd27bb3e24303172c4a09111c --- /dev/null +++ b/alfa-client/libs/design-system/run_helm_test.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e +set -x + +helm template ./main/helm/ -f ./test/helm-linter-values.yaml +helm lint -f test/helm-linter-values.yaml ./main/helm/ +cd main/helm && helm unittest -f '../../test/helm/*.yaml' . + diff --git a/alfa-client/libs/design-system/test/helm-linter-values.yaml b/alfa-client/libs/design-system/test/helm-linter-values.yaml new file mode 100644 index 0000000000000000000000000000000000000000..88a8eb17a808af1c3314ac178a0db55672280ae6 --- /dev/null +++ b/alfa-client/libs/design-system/test/helm-linter-values.yaml @@ -0,0 +1,36 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +baseUrl: test.sh.ozg-cloud.de + +ozgcloud: + bundesland: sh + bezeichner: helm + environment: test + +imagePullSecret: test-image-secret + +networkPolicy: + dnsServerNamespace: dummy-dns + diff --git a/alfa-client/libs/design-system/test/helm/deployment_63_char_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_63_char_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..09d03963a7eeb081a86cc2e28590feaf82c7385f --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/deployment_63_char_test.yaml @@ -0,0 +1,53 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test deployment less than 63 chars +release: + name: storybook + namespace: sh-helm-test + +templates: + - templates/deployment.yaml +set: + imagePullSecret: test-image-secret + +tests: + - it: should fail on .Release.Namespace length longer than 63 characters + release: + namespace: test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 + asserts: + - failedTemplate: + errorMessage: .Release.Namespace test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen) + - it: should not fail on .Release.Namespace length less than 63 characters + asserts: + - notFailedTemplate: {} + - it: should fail on .Chart.Name-.Chart.Version length longer than 63 characters + chart: + version: 1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 + asserts: + - failedTemplate: + errorMessage: .Chart.Name-.Chart.Version storybook-1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen) + - it: should not fail on .Chart.Name-.Chart.Version length less than 63 characters + asserts: + - notFailedTemplate: {} \ No newline at end of file diff --git a/alfa-client/libs/design-system/test/helm/deployment_env_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_env_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..006e6c299885077afddf976b14b59bb0718dbd9a --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/deployment_env_test.yaml @@ -0,0 +1,70 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test deployment container environments +templates: + - templates/deployment.yaml +set: + imagePullSecret: test-image-secret + +tests: + - it: check customList as list + set: + env.customList: + - name: my_test_environment_name + value: "A test value" + - name: test_environment + value: "B test value" + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: my_test_environment_name + value: "A test value" + - contains: + path: spec.template.spec.containers[0].env + content: + name: test_environment + value: "B test value" + - it: check customList as dict + set: + env.customList: + my_test_environment_name: "A test value" + test_environment: "B test value" + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: my_test_environment_name + value: "A test value" + - contains: + path: spec.template.spec.containers[0].env + content: + name: test_environment + value: "B test value" + + - it: no env exist by default + asserts: + - isEmpty: + path: spec.template.spec.containers[0].env diff --git a/alfa-client/libs/design-system/test/helm/deployment_host_aliases_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_host_aliases_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2df27950bdc08c277a14b952b82ebb96cb08e9b3 --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/deployment_host_aliases_test.yaml @@ -0,0 +1,52 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: deployment host aliases +release: + name: storybook + namespace: sh-helm-test +templates: + - templates/deployment.yaml +set: + imagePullSecret: test-image-secret +tests: + - it: should not set spec.template.spec.hostAliases + asserts: + - isNull: + path: spec.template.spec.hostAliases + - it: should set spec.template.spec.hostAliases + set: + hostAliases: + - ip: "127.0.0.1" + hostname: + - "eins" + - "zwei" + asserts: + - contains: + path: spec.template.spec.hostAliases + content: + ip: "127.0.0.1" + hostname: + - "eins" + - "zwei" diff --git a/alfa-client/libs/design-system/test/helm/deployment_ozgcloud_base_values_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_ozgcloud_base_values_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8c4e08d29e5cd804dc358818f84be4b36caae501 --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/deployment_ozgcloud_base_values_test.yaml @@ -0,0 +1,47 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test ozgcloud base values +release: + name: storybook + namespace: sh-helm-test +templates: + - templates/deployment.yaml + + +tests: + - it: should fail on missing imagePullSecret + set: + ozgcloud: + environment: dev + asserts: + - failedTemplate: + errorMessage: imagePullSecret must be set + - it: should not fail on given environment + set: + ozgcloud: + environment: dev + imagePullSecret: test-image-secret + asserts: + - notFailedTemplate: {} diff --git a/alfa-client/libs/design-system/test/helm/deployment_resources_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_resources_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c1823ac3b5de1ccb782f5cf89d76853def332c98 --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/deployment_resources_test.yaml @@ -0,0 +1,60 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test deployment container resources +release: + name: storybook +templates: + - templates/deployment.yaml +set: + imagePullSecret: test-image-secret + +tests: + - it: should generate resources when values set + set: + resources: + limits: + cpu: 11m + memory: 22Mi + requests: + cpu: 33m + memory: 44Mi + asserts: + - equal: + path: spec.template.spec.containers[0].resources.limits.cpu + value: 11m + - equal: + path: spec.template.spec.containers[0].resources.limits.memory + value: 22Mi + - equal: + path: spec.template.spec.containers[0].resources.requests.cpu + value: 33m + - equal: + path: spec.template.spec.containers[0].resources.requests.memory + value: 44Mi + - it: should not generate resources when values not set + asserts: + - isEmpty: + path: spec.template.spec.containers[0].resources + diff --git a/alfa-client/libs/design-system/test/helm/deployment_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1c76b61107630a97e9d5f69cb4f52b5aed907bcb --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/deployment_test.yaml @@ -0,0 +1,250 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: deployment_test +release: + name: storybook + namespace: storybook +templates: + - templates/deployment.yaml +set: + imagePullSecret: image-pull-secret +tests: + - it: validate deployment root configuration + asserts: + - isAPIVersion: + of: apps/v1 + - isKind: + of: Deployment + - it: validate metadata + asserts: + - equal: + path: metadata.name + value: storybook + - equal: + path: metadata.namespace + value: storybook + - equal: + path: metadata.labels["app.kubernetes.io/instance"] + value: storybook + - equal: + path: metadata.labels["app.kubernetes.io/name"] + value: storybook + - equal: + path: metadata.labels["app.kubernetes.io/namespace"] + value: storybook + - equal: + path: metadata.labels["app.kubernetes.io/part-of"] + value: ozgcloud + - equal: + path: metadata.labels["app.kubernetes.io/version"] + value: 0.0.0-MANAGED-BY-JENKINS + - equal: + path: metadata.labels["helm.sh/chart"] + value: storybook-0.0.0-MANAGED-BY-JENKINS + - it: validate spec root configuration + asserts: + - equal: + path: spec.progressDeadlineSeconds + value: 600 + - equal: + path: spec.replicas + value: 1 + - equal: + path: spec.revisionHistoryLimit + value: 10 + - it: validate spec selector + asserts: + - equal: + path: spec.selector.matchLabels["app.kubernetes.io/name"] + value: storybook + - equal: + path: spec.selector.matchLabels["app.kubernetes.io/namespace"] + value: storybook + - it: validate rolling updates + asserts: + - equal: + path: spec.strategy.rollingUpdate.maxSurge + value: 1 + - equal: + path: spec.strategy.rollingUpdate.maxUnavailable + value: 0 + - equal: + path: spec.strategy.type + value: RollingUpdate + - it: validate spec template metadata + asserts: + - equal: + path: spec.template.metadata.labels.component + value: storybook + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/instance"] + value: storybook + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/name"] + value: storybook + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/namespace"] + value: storybook + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/part-of"] + value: ozgcloud + - equal: + path: spec.template.metadata.labels["app.kubernetes.io/version"] + value: 0.0.0-MANAGED-BY-JENKINS + - equal: + path: spec.template.metadata.labels["helm.sh/chart"] + value: storybook-0.0.0-MANAGED-BY-JENKINS + - it: validate spec template spec topology spread constraints + asserts: + - equal: + path: spec.template.spec.topologySpreadConstraints[0].maxSkew + value: 1 + - equal: + path: spec.template.spec.topologySpreadConstraints[0].topologyKey + value: kubernetes.io/hostname + - equal: + path: spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable + value: ScheduleAnyway + - equal: + path: spec.template.spec.topologySpreadConstraints[0].labelSelector.matchLabels["app.kubernetes.io/name"] + value: storybook + - it: validate image name + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: "docker.ozg-sh.de/storybook:0.1.0" + - isAPIVersion: + of: apps/v1 + - it: validate image pull policy + asserts: + - equal: + path: spec.template.spec.containers[0].imagePullPolicy + value: Always + - it: validate container name + asserts: + - equal: + path: spec.template.spec.containers[0].name + value: storybook + - it: validate readiness probe + asserts: + - equal: + path: spec.template.spec.containers[0].readinessProbe.failureThreshold + value: 3 + - equal: + path: spec.template.spec.containers[0].readinessProbe.httpGet.path + value: / + - equal: + path: spec.template.spec.containers[0].readinessProbe.httpGet.port + value: 8080 + - equal: + path: spec.template.spec.containers[0].readinessProbe.httpGet.scheme + value: HTTP + - equal: + path: spec.template.spec.containers[0].readinessProbe.periodSeconds + value: 10 + - equal: + path: spec.template.spec.containers[0].readinessProbe.successThreshold + value: 1 + - equal: + path: spec.template.spec.containers[0].readinessProbe.timeoutSeconds + value: 3 + - it: validate startup probe + asserts: + - equal: + path: spec.template.spec.containers[0].startupProbe.failureThreshold + value: 3 + - equal: + path: spec.template.spec.containers[0].startupProbe.httpGet.path + value: / + - equal: + path: spec.template.spec.containers[0].startupProbe.httpGet.port + value: 8080 + - equal: + path: spec.template.spec.containers[0].startupProbe.httpGet.scheme + value: HTTP + - equal: + path: spec.template.spec.containers[0].startupProbe.failureThreshold + value: 3 + - equal: + path: spec.template.spec.containers[0].startupProbe.periodSeconds + value: 10 + - equal: + path: spec.template.spec.containers[0].startupProbe.successThreshold + value: 1 + - equal: + path: spec.template.spec.containers[0].startupProbe.timeoutSeconds + value: 3 + - it: validate container security context + asserts: + - equal: + path: spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation + value: false + - equal: + path: spec.template.spec.containers[0].securityContext.privileged + value: false + - equal: + path: spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem + value: false + - equal: + path: spec.template.spec.containers[0].securityContext.runAsNonRoot + value: true + + - it: validate container root config + asserts: + - equal: + path: spec.template.spec.containers[0].stdin + value: true + - equal: + path: spec.template.spec.containers[0].terminationMessagePath + value: /dev/termination-log + - equal: + path: spec.template.spec.containers[0].terminationMessagePolicy + value: File + - equal: + path: spec.template.spec.containers[0].tty + value: true + - it: validate spec template spec root config + asserts: + - equal: + path: spec.template.spec.dnsConfig + value: {} + - equal: + path: spec.template.spec.dnsPolicy + value: ClusterFirst + - equal: + path: spec.template.spec.imagePullSecrets[0].name + value: image-pull-secret + - equal: + path: spec.template.spec.restartPolicy + value: Always + - equal: + path: spec.template.spec.schedulerName + value: default-scheduler + - equal: + path: spec.template.spec.securityContext + value: {} + - equal: + path: spec.template.spec.terminationGracePeriodSeconds + value: 30 \ No newline at end of file diff --git a/alfa-client/libs/design-system/test/helm/ingress_tests.yaml b/alfa-client/libs/design-system/test/helm/ingress_tests.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a6d662510d9e6d214d958042372987813bffb840 --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/ingress_tests.yaml @@ -0,0 +1,101 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test ingress.yaml +release: + name: storybook + namespace: sh-helm-test +templates: + - templates/ingress.yaml +set: + ozgcloud: + bezeichner: helm + baseUrl: test.by.ozg-cloud.de + +tests: + - it: check ingress kind + asserts: + - isKind: + of: Ingress + - it: should create ingress tls + asserts: + - equal: + path: spec.tls[0].secretName + value: helm-storybook-tls + + - it: should not create ingress tls/ingressClass + set: + cluster_env: dataport + asserts: + - isNull: + path: spec.ingressClassName + - isNull: + path: spec.tls[0].secretName + + - it: should use default letsencrypt-prod cluster-issuer + asserts: + - equal: + path: metadata.annotations["cert-manager.io/cluster-issuer"] + value: letsencrypt-prod + + - it: should use letsencrypt-staging cluster-issuer + set: + ingress.use_staging_cert: true + asserts: + - equal: + path: metadata.annotations["cert-manager.io/cluster-issuer"] + value: letsencrypt-staging + + - it: should use letsencrypt-prod cluster-issuer + set: + ingress.use_staging_cert: false + asserts: + - equal: + path: metadata.annotations["cert-manager.io/cluster-issuer"] + value: letsencrypt-prod + + - it: should create tls hosts name correctly + asserts: + - equal: + path: spec.tls[0].hosts[0] + value: helm.test.by.ozg-cloud.de + + + - equal: + path: spec.rules[0].http.paths[0] + value: + path: / + pathType: Prefix + backend: + service: + name: storybook + port: + number: 8080 + + + - it: should set hostname + asserts: + - equal: + path: spec.rules[0].host + value: helm.test.by.ozg-cloud.de \ No newline at end of file diff --git a/alfa-client/libs/design-system/test/helm/network_policy_test.yaml b/alfa-client/libs/design-system/test/helm/network_policy_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7e828b00c019b1f771e7c6adc373b09a431e0a76 --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/network_policy_test.yaml @@ -0,0 +1,163 @@ +# +# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: network policy storybook test +release: + name: storybook + namespace: by-helm-test +templates: + - templates/network_policy.yaml +set: + networkPolicy: + dnsServerNamespace: kube-system + ssoPublicIp: 1.1.1.1/32 +tests: + - it: should match apiVersion + asserts: + - isAPIVersion: + of: networking.k8s.io/v1 + - it: should match kind + asserts: + - isKind: + of: NetworkPolicy + - it: validate metadata + asserts: + - equal: + path: metadata + value: + name: network-policy-storybook + namespace: by-helm-test + + + - it: should add egress rule to dns service + set: + networkPolicy: + dnsServerNamespace: test-dns-namespace + asserts: + - contains: + path: spec.egress + content: + to: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: test-dns-namespace + ports: + - port: 53 + protocol: UDP + - port: 53 + protocol: TCP + - port: 5353 + protocol: UDP + - port: 5353 + protocol: TCP + + - it: should add additionalIngressConfig local + set: + networkPolicy: + ssoPublicIp: 51.89.117.53/32 + dnsServerNamespace: test-namespace-dns + additionalIngressConfigLocal: + - from: + - podSelector: + matchLabels: + component: client2 + asserts: + - contains: + path: spec.ingress + content: + from: + - podSelector: + matchLabels: + component: client2 + - it: should add additionalIngressConfig global + set: + networkPolicy: + ssoPublicIp: 51.89.117.53/32 + dnsServerNamespace: test-namespace-dns + additionalIngressConfigGlobal: + - from: + - podSelector: + matchLabels: + component: client2 + asserts: + - contains: + path: spec.ingress + content: + from: + - podSelector: + matchLabels: + component: client2 + + - it: should add additionalEgressConfig local + set: + networkPolicy: + ssoPublicIp: 51.89.117.53/32 + dnsServerNamespace: test-dns-namespace + additionalEgressConfigLocal: + - to: + - ipBlock: + cidr: 1.2.3.4/32 + asserts: + - contains: + path: spec.egress + content: + to: + - ipBlock: + cidr: 1.2.3.4/32 + + - it: should add additionalEgressConfig global + set: + networkPolicy: + ssoPublicIp: 51.89.117.53/32 + dnsServerNamespace: test-dns-namespace + additionalEgressConfigGlobal: + - to: + - ipBlock: + cidr: 1.2.3.4/32 + asserts: + - contains: + path: spec.egress + content: + to: + - ipBlock: + cidr: 1.2.3.4/32 + + + - it: test network policy disabled + set: + networkPolicy: + disabled: true + asserts: + - hasDocuments: + count: 0 + + - it: test network policy unset should be disabled + set: + networkPolicy: + ssoPublicIp: 1.1.1.1 + disabled: false + dnsServerNamespace: test-dns-server-namespace + asserts: + - hasDocuments: + count: 1 diff --git a/alfa-client/libs/design-system/test/helm/service_test.yaml b/alfa-client/libs/design-system/test/helm/service_test.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fd3ae830b640f34e4540828d884dd4fb0aa2df46 --- /dev/null +++ b/alfa-client/libs/design-system/test/helm/service_test.yaml @@ -0,0 +1,66 @@ +# +# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den +# Ministerpräsidenten des Landes Schleswig-Holstein +# Staatskanzlei +# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung +# +# Lizenziert unter der EUPL, Version 1.2 oder - sobald +# diese von der Europäischen Kommission genehmigt wurden - +# Folgeversionen der EUPL ("Lizenz"); +# Sie dürfen dieses Werk ausschließlich gemäß +# dieser Lizenz nutzen. +# Eine Kopie der Lizenz finden Sie hier: +# +# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 +# +# Sofern nicht durch anwendbare Rechtsvorschriften +# gefordert oder in schriftlicher Form vereinbart, wird +# die unter der Lizenz verbreitete Software "so wie sie +# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - +# ausdrücklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschränkungen +# unter der Lizenz sind dem Lizenztext zu entnehmen. +# + +suite: test service +release: + name: storybook + namespace: sh-helm-test +templates: + - templates/service.yaml +tests: + - it: should have the label component with correct value + asserts: + - isKind: + of: Service + - isAPIVersion: + of: v1 + - equal: + path: metadata.labels.component + value: storybook-service + - it: should be of type ClusterIP + asserts: + - equal: + path: spec.type + value: ClusterIP + + - it: selector should contain the component label with correct value + asserts: + - equal: + path: spec.selector.component + value: storybook + + - it: selector should contain helm recommended labels name and namespace + asserts: + - equal: + path: spec.selector + value: + app.kubernetes.io/name: storybook + app.kubernetes.io/namespace: sh-helm-test + component: storybook + + - it: check component label for service + asserts: + - equal: + path: metadata.labels["component"] + value: storybook-service \ No newline at end of file diff --git a/alfa-client/package.json b/alfa-client/package.json index 941615e48c676d90e015854377c3441e18a98a3e..dc0151bac5d9d6567a481c5009ca1a0bebdccd54 100644 --- a/alfa-client/package.json +++ b/alfa-client/package.json @@ -43,7 +43,8 @@ "cypress:install": "npx cypress install", "cypress:open": "npx cypress open --project apps/alfa-e2e", "workspace-generator": "nx workspace-generator", - "storybook": "nx storybook design-system" + "storybook": "nx storybook design-system", + "ci-storybook": "nx build-storybook design-system && nx container design-system" }, "private": true, "dependencies": {