From 266bee9290b7b5e8611c4ef9e80f842004fbd015 Mon Sep 17 00:00:00 2001 From: Michael Kebe <michael.kebe@gmail.com> Date: Mon, 20 Jan 2025 18:09:41 +0000 Subject: [PATCH] feat: add automatic namespace creation (when it doesn't exist) --- README.md | 1 + kicker.json | 6 ++++++ templates/gitlab-ci-k8s.yml | 15 +++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/README.md b/README.md index f1ba038..ad9d4b2 100644 --- a/README.md +++ b/README.md @@ -395,6 +395,7 @@ The Kubernetes template uses some global configuration used throughout all jobs. | `scripts-dir` / `K8S_SCRIPTS_DIR` | directory where k8s scripts (hook scripts) are located | `.` _(root project dir)_ | | `kustomize-enabled` / `K8S_KUSTOMIZE_ENABLED` | Set to `true` to force using [Kustomize](https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/) | _none_ (disabled) | | `kustomize-args` / `K8S_KUSTOMIZE_ARGS` | Additional [`kubectl kustomize` options](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#kustomize)<br/>_for example: `--enable-helm`_ | _none_ | +| `create-namespace` / `K8S_CREATE_NAMESPACE_ENABLED` | Set to `true` to enable automatic namespace creation | `false` | | `DOCKER_CONTAINER_STABLE_IMAGE` | Docker image name to use for staging/prod | **has to be defined when not chaining execution from Docker template** | | `DOCKER_CONTAINER_UNSTABLE_IMAGE` | Docker image name to use for review | **has to be defined when not chaining execution from Docker template** | diff --git a/kicker.json b/kicker.json index 5baa735..cf95473 100644 --- a/kicker.json +++ b/kicker.json @@ -58,6 +58,12 @@ "name": "K8S_KUSTOMIZE_ARGS", "description": "Additional [`kubectl kustomize` options](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#kustomize)\n\n_For example: `--enable-helm`_", "advanced": true + }, + { + "name": "K8S_CREATE_NAMESPACE_ENABLED", + "description": "Set to `true` to enable automatic namespace creation", + "type": "boolean", + "advanced": true } ], "features": [ diff --git a/templates/gitlab-ci-k8s.yml b/templates/gitlab-ci-k8s.yml index 2412c6c..3840a94 100644 --- a/templates/gitlab-ci-k8s.yml +++ b/templates/gitlab-ci-k8s.yml @@ -43,6 +43,10 @@ spec: _For example: `--enable-helm`_ default: '' + create-namespace-enabled: + description: Creates the namespace, if it doesn't exist + type: boolean + default: false score-disabled: description: Disable kube-score type: boolean @@ -181,6 +185,7 @@ variables: K8S_ENVIRONMENT_URL: $[[ inputs.environment-url ]] K8S_KUSTOMIZE_ENABLED: $[[ inputs.kustomize-enabled ]] K8S_KUSTOMIZE_ARGS: $[[ inputs.kustomize-args ]] + K8S_CREATE_NAMESPACE_ENABLED: $[[ inputs.create-namespace-enabled ]] K8S_SCORE_DISABLED: $[[ inputs.score-disabled ]] K8S_SCORE_EXTRA_OPTS: $[[ inputs.score-extra-opts ]] K8S_REVIEW_SPACE: $[[ inputs.review-space ]] @@ -490,6 +495,16 @@ stages: kubectl config use-context gitlab-k8s-cluster fi + if ! kubectl get namespace "$k8s_namespace" > /dev/null 2>&1; then + if [[ "${K8S_CREATE_NAMESPACE_ENABLED}" == "true" ]] + then + log_info "--- Namespace \\e[33;1m${k8s_namespace}\\e[0m does not exist: create..." + kubectl create namespace "$k8s_namespace" --save-config + else + log_warn "--- Namespace \\e[33;1m${k8s_namespace}\\e[0m does not exist: set K8S_CREATE_NAMESPACE_ENABLED=true to enable automatic namespace creation" + fi + fi + kubectl config set-context --current --namespace="$k8s_namespace" log_info "--- \\e[32mlogin\\e[0m" -- GitLab