diff --git a/.devcontainer/ci/Dockerfile b/.devcontainer/ci/Dockerfile deleted file mode 100644 index e6e945b4..00000000 --- a/.devcontainer/ci/Dockerfile +++ /dev/null @@ -1,2 +0,0 @@ -# Ref: https://github.com/devcontainers/ci/issues/191 -FROM mcr.microsoft.com/devcontainers/base:alpine diff --git a/.devcontainer/ci/devcontainer.json b/.devcontainer/ci/devcontainer.json deleted file mode 100644 index b38aa2b5..00000000 --- a/.devcontainer/ci/devcontainer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json", - "name": "Flux Cluster Template (CI)", - "build": { - "dockerfile": "./Dockerfile", - "context": "." - }, - "features": { - "./features": {} - }, - "customizations": { - "vscode": { - "settings": { - "terminal.integrated.profiles.linux": { - "bash": { - "path": "/usr/bin/fish" - } - }, - "terminal.integrated.defaultProfile.linux": "fish" - }, - "extensions": [ - "redhat.ansible", - "redhat.vscode-yaml" - ] - } - } -} diff --git a/.devcontainer/ci/features/devcontainer-feature.json b/.devcontainer/ci/features/devcontainer-feature.json deleted file mode 100644 index 5f771e34..00000000 --- a/.devcontainer/ci/features/devcontainer-feature.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Flux Cluster Template (Tools)", - "id": "cluster-template", - "version": "1.0.0", - "description": "Install Tools" -} diff --git a/.devcontainer/ci/features/install.sh b/.devcontainer/ci/features/install.sh deleted file mode 100644 index 82bd4162..00000000 --- a/.devcontainer/ci/features/install.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash -set -e -set -o noglob - -apk add --no-cache \ - bash bind-tools ca-certificates curl python3 \ - py3-pip moreutils jq git iputils openssh-client \ - starship fzf fish - -apk add --no-cache \ - --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community \ - age helm kubectl sops - -sudo apk add --no-cache \ - --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing \ - lsd - -for app in \ - "budimanjojo/talhelper!" \ - "cilium/cilium-cli!!?as=cilium&type=script" \ - "cli/cli!!?as=gh&type=script" \ - "cloudflare/cloudflared!!?as=cloudflared&type=script" \ - "derailed/k9s!!?as=k9s&type=script" \ - "direnv/direnv!!?as=direnv&type=script" \ - "fluxcd/flux2!!?as=flux&type=script" \ - "go-task/task!!?as=task&type=script" \ - "helmfile/helmfile!!?as=helmfile&type=script" \ - "kubecolor/kubecolor!!?as=kubecolor&type=script" \ - "kubernetes-sigs/krew!!?as=krew&type=script" \ - "kubernetes-sigs/kustomize!!?as=kustomize&type=script" \ - "stern/stern!!?as=stern&type=script" \ - "siderolabs/talos!!?as=talosctl&type=script" \ - "yannh/kubeconform!!?as=kubeconform&type=script" \ - "mikefarah/yq!!?as=yq&type=script" -do - echo "=== Installing ${app} ===" - curl -fsSL "https://i.jpillora.com/${app}" | bash -done - -# Create the fish configuration directory -mkdir -p /home/vscode/.config/fish/{completions,conf.d} - -# Setup autocompletions for fish -for tool in cilium flux helm helmfile k9s kubectl kustomize talhelper talosctl; do - $tool completion fish > /home/vscode/.config/fish/completions/$tool.fish -done -gh completion --shell fish > /home/vscode/.config/fish/completions/gh.fish -stern --completion fish > /home/vscode/.config/fish/completions/stern.fish -yq shell-completion fish > /home/vscode/.config/fish/completions/yq.fish - -# Add hooks into fish -tee /home/vscode/.config/fish/conf.d/hooks.fish > /dev/null < /dev/null < /dev/null < /dev/null <&1 - preconditions: - - { msg: "Missing kubeconfig", sh: "test -f {{.KUBECONFIG_FILE}}" } - - { msg: "Missing Flux Kustomization for app {{.path}}", sh: "test -f {{.KUBERNETES_DIR}}/apps/{{.path}}/ks.yaml" } - - reconcile: - desc: Force update Flux to pull in changes from your Git repository - cmd: flux --kubeconfig {{.KUBECONFIG_FILE}} reconcile --namespace flux-system kustomization cluster --with-source - preconditions: - - { msg: "Missing kubeconfig", sh: "test -f {{.KUBECONFIG_FILE}}" } - - github-deploy-key: - cmds: - - kubectl create namespace flux-system --dry-run=client -o yaml | kubectl --kubeconfig {{.KUBECONFIG_FILE}} apply --filename - - - sops --decrypt {{.GITHUB_DEPLOY_KEY_FILE}} | kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --filename - - preconditions: - - { msg: "Missing kubeconfig", sh: "test -f {{.KUBECONFIG_FILE}}" } - - { msg: "Missing Sops Age key file", sh: "test -f {{.AGE_FILE}}" } - - { msg: "Missing Github deploy key file", sh: "test -f {{.GITHUB_DEPLOY_KEY_FILE}}" } diff --git a/.taskfiles/Kubernetes/Taskfile.yaml b/.taskfiles/Kubernetes/Taskfile.yaml deleted file mode 100644 index e4f52e0c..00000000 --- a/.taskfiles/Kubernetes/Taskfile.yaml +++ /dev/null @@ -1,35 +0,0 @@ ---- -# yaml-language-server: $schema=https://taskfile.dev/schema.json -version: "3" - -vars: - KUBECONFORM_SCRIPT: "{{.SCRIPTS_DIR}}/kubeconform.sh" - -tasks: - - resources: - desc: Gather common resources in your cluster, useful when asking for support - cmds: - - for: { var: resource } - cmd: kubectl get {{.ITEM}} {{.CLI_ARGS | default "-A"}} - vars: - resource: >- - nodes - gitrepositories - kustomizations - helmrepositories - helmreleases - certificates - certificaterequests - ingresses - pods - - kubeconform: - desc: Validate Kubernetes manifests with kubeconform - cmd: bash {{.KUBECONFORM_SCRIPT}} {{.KUBERNETES_DIR}} - preconditions: - - { msg: "Missing kubeconform script", sh: "test -f {{.KUBECONFORM_SCRIPT}}" } - - .reset: - internal: true - cmd: rm -rf {{.KUBERNETES_DIR}} diff --git a/.taskfiles/Repository/Taskfile.yaml b/.taskfiles/Repository/Taskfile.yaml deleted file mode 100644 index a0572db8..00000000 --- a/.taskfiles/Repository/Taskfile.yaml +++ /dev/null @@ -1,39 +0,0 @@ ---- -# yaml-language-server: $schema=https://taskfile.dev/schema.json -version: "3" - -tasks: - - clean: - desc: Clean files and directories no longer needed after cluster bootstrap - cmds: - # Clean up CI - - rm -rf {{.ROOT_DIR}}/.github/tests - - rm -rf {{.ROOT_DIR}}/.github/workflows/e2e.yaml - # Move bootstrap directory to gitignored directory - - mv {{.BOOTSTRAP_DIR}} {{.PRIVATE_DIR}}/bootstrap-{{now | date "150405"}} - - mv {{.MAKEJINJA_CONFIG_FILE}} {{.PRIVATE_DIR}}/makejinja-{{now | date "150405"}}.toml - # Update renovate.json5 - - sed -i {{if eq OS "darwin"}}''{{end}} 's/(..\.j2)\?//g' {{.ROOT_DIR}}/.github/renovate.json5 - preconditions: - - { msg: "Missing bootstrap directory", sh: "test -d {{.BOOTSTRAP_DIR}}" } - - { msg: "Missing private directory", sh: "test -d {{.PRIVATE_DIR}}" } - - { msg: "Missing Renovate config file", sh: "test -f {{.ROOT_DIR}}/.github/renovate.json5" } - - reset: - desc: Reset templated configuration files - prompt: Reset templated configuration files... continue? - cmds: - - task: :ansible:.reset - - task: :kubernetes:.reset - - task: :sops:.reset - - task: :talos:.reset - - force-reset: - desc: Reset repo back to HEAD - prompt: Reset repo back to HEAD... continue? - cmds: - - task: reset - - git reset --hard HEAD - - git clean -f -d - - git pull origin main diff --git a/.taskfiles/Sops/Taskfile.yaml b/.taskfiles/Sops/Taskfile.yaml deleted file mode 100644 index 37395765..00000000 --- a/.taskfiles/Sops/Taskfile.yaml +++ /dev/null @@ -1,41 +0,0 @@ ---- -# yaml-language-server: $schema=https://taskfile.dev/schema.json -version: "3" - -vars: - SOPS_CONFIG_FILE: "{{.ROOT_DIR}}/.sops.yaml" - -tasks: - - age-keygen: - desc: Initialize Age Key for Sops - cmd: age-keygen --output {{.AGE_FILE}} - status: - - test -f "{{.AGE_FILE}}" - - encrypt: - desc: Encrypt all Kubernetes SOPS secrets that are not already encrypted - cmds: - - for: { var: file } - task: .encrypt-file - vars: - file: "{{.ITEM}}" - vars: - file: - sh: | - if [ -d "{{.KUBERNETES_DIR}}" ]; then - find "{{.KUBERNETES_DIR}}" -type f -name "*.sops.*" -exec grep -L "ENC\[AES256_GCM" {} \; - fi - - .encrypt-file: - internal: true - cmd: sops --encrypt --in-place {{.file}} - requires: - vars: ["file"] - preconditions: - - { msg: "Missing Sops config file", sh: "test -f {{.SOPS_CONFIG_FILE}}" } - - { msg: "Missing Sops Age key file", sh: "test -f {{.AGE_FILE}}" } - - .reset: - internal: true - cmd: rm -rf {{.SOPS_CONFIG_FILE}} diff --git a/.taskfiles/Talos/Taskfile.yaml b/.taskfiles/Talos/Taskfile.yaml deleted file mode 100644 index 0ffeeec4..00000000 --- a/.taskfiles/Talos/Taskfile.yaml +++ /dev/null @@ -1,109 +0,0 @@ ---- -# yaml-language-server: $schema=https://taskfile.dev/schema.json -version: "3" - -vars: - TALOS_DIR: "{{.KUBERNETES_DIR}}/bootstrap/talos" - TALHELPER_SECRET_FILE: "{{.TALOS_DIR}}/talhelper.sops.yaml" - TALHELPER_CONFIG_FILE: "{{.TALOS_DIR}}/talconfig.yaml" - -env: - TALOSCONFIG: "{{.TALOS_DIR}}/clusterconfig/talosconfig" - -tasks: - - bootstrap: - desc: Bootstrap the Talos cluster - dir: "{{.TALOS_DIR}}" - cmds: - - task: bootstrap-gensecret - - task: bootstrap-genconfig - - task: bootstrap-apply - - task: bootstrap-install - - task: fetch-kubeconfig - - task: bootstrap-apps - - talosctl health --server=false - - bootstrap-gensecret: - desc: Generate the Talos secrets - dir: "{{.TALOS_DIR}}" - cmds: - - talhelper gensecret > {{.TALHELPER_SECRET_FILE}} - - task: :sops:.encrypt-file - vars: - file: "{{.TALHELPER_SECRET_FILE}}" - preconditions: - - { msg: "Missing talhelper config file", sh: "test -f {{.TALHELPER_CONFIG_FILE}}" } - status: - - test -f "{{.TALHELPER_SECRET_FILE}}" - - bootstrap-genconfig: - desc: Generate the Talos configs - dir: "{{.TALOS_DIR}}" - cmd: talhelper genconfig - preconditions: - - { msg: "Missing talhelper config file", sh: "test -f {{.TALHELPER_CONFIG_FILE}}" } - - bootstrap-apply: - desc: Apply the Talos config on a node - dir: "{{.TALOS_DIR}}" - cmd: talhelper gencommand apply --extra-flags=--insecure | bash - preconditions: - - { msg: "Missing talhelper config file", sh: "test -f {{.TALHELPER_CONFIG_FILE}}" } - - bootstrap-install: - desc: Install the Talos cluster - dir: "{{.TALOS_DIR}}" - cmds: - - echo "Installing Talos... ignore the errors and be patient" - - until talhelper gencommand bootstrap | bash; do sleep 10; done - - sleep 10 - preconditions: - - { msg: "Missing talhelper config file", sh: "test -f {{.TALHELPER_CONFIG_FILE}}" } - - bootstrap-apps: - desc: Bootstrap core apps needed for Talos - dir: "{{.TALOS_DIR}}" - cmds: - - until kubectl --kubeconfig {{.KUBECONFIG_FILE}} wait --for=condition=Ready=False nodes --all --timeout=600s; do sleep 10; done - - helmfile --file ./apps/helmfile.yaml apply --skip-diff-on-install --suppress-diff - - until kubectl --kubeconfig {{.KUBECONFIG_FILE}} wait --for=condition=Ready nodes --all --timeout=600s; do sleep 10; done - preconditions: - - { msg: "Missing kubeconfig", sh: "test -f {{.KUBECONFIG_FILE}}" } - - upgrade-talos: - desc: Upgrade talos on a node - cmd: talosctl --nodes {{.node}} upgrade --image {{.image}} --preserve=true --reboot-mode=default - requires: - vars: ["node", "image"] - preconditions: - - { msg: "Node not found", sh: "talosctl --nodes {{.node}} get machineconfig" } - - upgrade-k8s: - desc: Upgrade k8s on a node - cmd: talosctl --nodes {{.node}} upgrade-k8s --to {{.to}} - requires: - vars: ["node", "to"] - preconditions: - - { msg: "Node not found", sh: "talosctl --nodes {{.node}} get machineconfig" } - - fetch-kubeconfig: - desc: Generate talos kubeconfig - dir: "{{.TALOS_DIR}}" - cmd: until talhelper gencommand kubeconfig --extra-flags "--force" | bash; do sleep 10; done - - soft-nuke: - desc: Resets nodes back to maintenance mode so you can re-deploy again straight after - prompt: This will destroy your cluster and reset the nodes back to maintenance mode... continue? - dir: "{{.TALOS_DIR}}" - cmd: talhelper gencommand reset --extra-flags "--reboot --system-labels-to-wipe STATE --system-labels-to-wipe EPHEMERAL --graceful=false --wait=false" | bash - - hard-nuke: - desc: Resets nodes back completely and reboots them - prompt: This will destroy your cluster and reset the nodes... continue? - dir: "{{.TALOS_DIR}}" - cmd: talhelper gencommand reset --extra-flags "--reboot --graceful=false --wait=false" | bash - - .reset: - internal: true - cmd: rm -rf {{.TALOS_DIR}} diff --git a/.taskfiles/Workstation/Archfile b/.taskfiles/Workstation/Archfile deleted file mode 100644 index b1ad3160..00000000 --- a/.taskfiles/Workstation/Archfile +++ /dev/null @@ -1,17 +0,0 @@ -age -cloudflared-bin -direnv -flux-bin -go-task -go-yq -helm -helmfile -jq -kubeconform -kubectl-bin -kustomize -moreutils -sops -stern-bin -talhelper-bin -talosctl diff --git a/.taskfiles/Workstation/Brewfile b/.taskfiles/Workstation/Brewfile deleted file mode 100644 index 0d31dc67..00000000 --- a/.taskfiles/Workstation/Brewfile +++ /dev/null @@ -1,20 +0,0 @@ -tap "fluxcd/tap" -tap "go-task/tap" -tap "siderolabs/talos" -brew "age" -brew "cloudflared" -brew "direnv" -brew "fluxcd/tap/flux" -brew "go-task/tap/go-task" -brew "helm" -brew "helmfile" -brew "jq" -brew "kubeconform" -brew "kubernetes-cli" -brew "kustomize" -brew "moreutils" -brew "sops" -brew "stern" -brew "talhelper" -brew "talosctl" -brew "yq" diff --git a/.taskfiles/Workstation/Taskfile.yaml b/.taskfiles/Workstation/Taskfile.yaml deleted file mode 100644 index 09f309f6..00000000 --- a/.taskfiles/Workstation/Taskfile.yaml +++ /dev/null @@ -1,71 +0,0 @@ ---- -# yaml-language-server: $schema=https://taskfile.dev/schema.json -version: "3" - -vars: - ARCHFILE: "{{.ROOT_DIR}}/.taskfiles/Workstation/Archfile" - BREWFILE: "{{.ROOT_DIR}}/.taskfiles/Workstation/Brewfile" - GENERIC_BIN_DIR: "{{.ROOT_DIR}}/.bin" - -tasks: - - direnv: - desc: Run direnv hooks - cmd: direnv allow . - status: - - "[[ $(direnv status --json | jq '.state.foundRC.allowed') == 0 ]]" - - "[[ $(direnv status --json | jq '.state.loadedRC.allowed') == 0 ]]" - - venv: - desc: Set up virtual environment - cmds: - - "{{.PYTHON_BIN}} -m venv {{.VIRTUAL_ENV}}" - - '{{.VIRTUAL_ENV}}/bin/python3 -m pip install --upgrade pip setuptools wheel' - - '{{.VIRTUAL_ENV}}/bin/python3 -m pip install --upgrade --requirement "{{.PIP_REQUIREMENTS_FILE}}"' - sources: - - "{{.PIP_REQUIREMENTS_FILE}}" - generates: - - "{{.VIRTUAL_ENV}}/pyvenv.cfg" - preconditions: - - { msg: "Missing Pip requirements file", sh: "test -f {{.PIP_REQUIREMENTS_FILE}}" } - - brew: - desc: Install workstation dependencies with Brew - cmd: brew bundle --file {{.BREWFILE}} - preconditions: - - { msg: "Missing Homebrew", sh: "command -v brew" } - - { msg: "Missing Brewfile", sh: "test -f {{.BREWFILE}}" } - - arch: - desc: Install Arch workstation dependencies with Paru Or Yay - cmd: "{{.helper}} -Syu --needed --noconfirm --noprogressbar $(cat {{.ARCHFILE}} | xargs)" - vars: - helper: - sh: "command -v yay || command -v paru" - preconditions: - - { msg: "Missing Archfile", sh: "test -f {{.ARCHFILE}}" } - - generic-linux: - desc: Install CLI tools into the projects .bin directory using curl - dir: "{{.GENERIC_BIN_DIR}}" - platforms: ["linux/amd64", "linux/arm64"] - cmds: - - for: - - budimanjojo/talhelper?as=talhelper&type=script - - cloudflare/cloudflared?as=cloudflared&type=script - - FiloSottile/age?as=age&type=script - - fluxcd/flux2?as=flux&type=script - - getsops/sops?as=sops&type=script - - helmfile/helmfile?as=helmfile&type=script - - jqlang/jq?as=jq&type=script - - kubernetes-sigs/kustomize?as=kustomize&type=script - - siderolabs/talos?as=talosctl&type=script - - yannh/kubeconform?as=kubeconform&type=script - - mikefarah/yq?as=yq&type=script - cmd: curl -fsSL "https://i.jpillora.com/{{.ITEM}}" | bash - - cmd: curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" - platforms: ["linux/amd64"] - - cmd: curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl" - platforms: ["linux/arm64"] - - cmd: chmod +x kubectl - - cmd: curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | USE_SUDO="false" HELM_INSTALL_DIR="." bash diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index c8f11210..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "recommendations": [ - "albert.TabOut", - "britesnow.vscode-toggle-quotes", - "fcrespo82.markdown-table-formatter", - "mikestead.dotenv", - "mitchdenny.ecdc", - "redhat.ansible", - "signageos.signageos-vscode-sops", - "will-stone.in-any-case", - "EditorConfig.editorconfig", - "PKief.material-icon-theme", - "Gruntfuggly.todo-tree" - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 8f29572b..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "ansible.ansible.path": ".venv/bin/ansible", - "ansible.python.activationScript": ".venv/bin/activate", - "ansible.python.interpreterPath": ".venv/bin/python3", - "ansible.validation.enabled": true, - "ansible.validation.lint.arguments": "-c ansible/.ansible-lint", - "ansible.validation.lint.enabled": true, - "ansible.validation.lint.path": ".venv/bin/ansible-lint", - "files.associations": { - "*.json5": "jsonc", - "./ansible/**/*.yaml": "ansible", - "./ansible/**/*.sops.yaml": "yaml", - "./ansible/**/inventory/**/*.yaml": "yaml", - "./kubernetes/**/*.sops.toml": "plaintext" - }, - "sops.defaults.ageKeyFile": "age.key", - "yaml.schemas": { - "ansible": "./ansible/*.yaml", - "Kubernetes": "./kubernetes/*.yaml" - }, - "vs-kubernetes": { - "vs-kubernetes.kubeconfig": "./kubeconfig", - "vs-kubernetes.knownKubeconfigs": [ - "./kubeconfig" - ] - } -} diff --git a/Taskfile.yaml b/Taskfile.yaml deleted file mode 100644 index 8b02c190..00000000 --- a/Taskfile.yaml +++ /dev/null @@ -1,82 +0,0 @@ ---- -# yaml-language-server: $schema=https://taskfile.dev/schema.json -version: "3" - -vars: - # Directories - ANSIBLE_DIR: "{{.ROOT_DIR}}/ansible" - BOOTSTRAP_DIR: "{{.ROOT_DIR}}/bootstrap" - KUBERNETES_DIR: "{{.ROOT_DIR}}/kubernetes" - PRIVATE_DIR: "{{.ROOT_DIR}}/.private" - SCRIPTS_DIR: "{{.ROOT_DIR}}/scripts" - # Files - AGE_FILE: "{{.ROOT_DIR}}/age.key" - BOOTSTRAP_CONFIG_FILE: "{{.ROOT_DIR}}/config.yaml" - KUBECONFIG_FILE: "{{.ROOT_DIR}}/kubeconfig" - MAKEJINJA_CONFIG_FILE: "{{.ROOT_DIR}}/makejinja.toml" - PIP_REQUIREMENTS_FILE: "{{.ROOT_DIR}}/requirements.txt" - # Binaries - PYTHON_BIN: python3 - -env: - KUBECONFIG: "{{.KUBECONFIG_FILE}}" - PYTHONDONTWRITEBYTECODE: "1" - SOPS_AGE_KEY_FILE: "{{.AGE_FILE}}" - VIRTUAL_ENV: "{{.ROOT_DIR}}/.venv" - -includes: - ansible: .taskfiles/Ansible/Taskfile.yaml - kubernetes: - aliases: ["k8s"] - taskfile: .taskfiles/Kubernetes/Taskfile.yaml - flux: .taskfiles/Flux/Taskfile.yaml - repository: - aliases: ["repo"] - taskfile: .taskfiles/Repository/Taskfile.yaml - talos: .taskfiles/Talos/Taskfile.yaml - sops: .taskfiles/Sops/Taskfile.yaml - workstation: .taskfiles/Workstation/Taskfile.yaml - user: - taskfile: .taskfiles/User - optional: true - -tasks: - - default: task -l - - init: - desc: Initialize configuration files - cmds: - - mkdir -p {{.PRIVATE_DIR}} - - cp -n {{.BOOTSTRAP_CONFIG_FILE | replace ".yaml" ".sample.yaml"}} {{.BOOTSTRAP_CONFIG_FILE}} - - cmd: echo === Configuration file copied === - silent: true - - cmd: echo Proceed with updating the configuration files... - silent: true - - cmd: echo {{.BOOTSTRAP_CONFIG_FILE}} - silent: true - status: - - test -f "{{.BOOTSTRAP_CONFIG_FILE}}" - - configure: - desc: Configure repository from bootstrap vars - prompt: Any conflicting config in the root kubernetes and ansible directories will be overwritten... continue? - deps: ["workstation:direnv", "workstation:venv", "sops:age-keygen", "init"] - cmds: - - task: .template - - task: sops:encrypt - - task: .validate - - .template: - internal: true - cmd: "{{.VIRTUAL_ENV}}/bin/makejinja" - preconditions: - - { msg: "Missing virtual environment", sh: "test -d {{.VIRTUAL_ENV}}" } - - { msg: "Missing Makejinja config file", sh: "test -f {{.MAKEJINJA_CONFIG_FILE}}" } - - { msg: "Missing Makejinja plugin file", sh: "test -f {{.BOOTSTRAP_DIR}}/scripts/plugin.py" } - - { msg: "Missing bootstrap config file", sh: "test -f {{.BOOTSTRAP_CONFIG_FILE}}" } - - .validate: - internal: true - cmds: - - task: kubernetes:kubeconform