From 427f42f2caf7193991ce331a15ffde9dfc4e3faa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:38:48 +0000 Subject: [PATCH 1/5] Fix Go download for short GO_VERSION values Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/9b0c799a-f3ea-4137-ae78-1b58c5743fb7 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- .devcontainer/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b671109..2b0c4cd 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -102,9 +102,11 @@ RUN if [ "$INSTALL_JS" = "true" ]; then \ # Install Go if requested RUN if [ "$INSTALL_GO" = "true" ]; then \ - curl -OL https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz \ - && tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz \ - && rm go${GO_VERSION}.linux-amd64.tar.gz \ + GO_DOWNLOAD_VERSION="${GO_VERSION}" \ + && case "${GO_DOWNLOAD_VERSION}" in *.*.*) ;; *.*) GO_DOWNLOAD_VERSION="${GO_DOWNLOAD_VERSION}.0" ;; esac \ + && curl -fsSLO "https://go.dev/dl/go${GO_DOWNLOAD_VERSION}.linux-amd64.tar.gz" \ + && tar -C /usr/local -xzf "go${GO_DOWNLOAD_VERSION}.linux-amd64.tar.gz" \ + && rm "go${GO_DOWNLOAD_VERSION}.linux-amd64.tar.gz" \ && echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/bash.bashrc \ && echo "export PATH=$PATH:/root/go/bin" >> /etc/bash.bashrc \ && /usr/local/go/bin/go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \ From 043c0ef42d63ddeb1680544e7ebf0d55de486f22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:40:33 +0000 Subject: [PATCH 2/5] Add explicit Go tarball validation in Docker install Agent-Logs-Url: https://github.com/cloudengine-labs/devops_os/sessions/9b0c799a-f3ea-4137-ae78-1b58c5743fb7 Co-authored-by: chefgs <7605658+chefgs@users.noreply.github.com> --- .devcontainer/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 2b0c4cd..c6addf4 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -104,9 +104,11 @@ RUN if [ "$INSTALL_JS" = "true" ]; then \ RUN if [ "$INSTALL_GO" = "true" ]; then \ GO_DOWNLOAD_VERSION="${GO_VERSION}" \ && case "${GO_DOWNLOAD_VERSION}" in *.*.*) ;; *.*) GO_DOWNLOAD_VERSION="${GO_DOWNLOAD_VERSION}.0" ;; esac \ - && curl -fsSLO "https://go.dev/dl/go${GO_DOWNLOAD_VERSION}.linux-amd64.tar.gz" \ - && tar -C /usr/local -xzf "go${GO_DOWNLOAD_VERSION}.linux-amd64.tar.gz" \ - && rm "go${GO_DOWNLOAD_VERSION}.linux-amd64.tar.gz" \ + && GO_TARBALL="go${GO_DOWNLOAD_VERSION}.linux-amd64.tar.gz" \ + && curl -fsSLO "https://go.dev/dl/${GO_TARBALL}" \ + && test -s "${GO_TARBALL}" \ + && tar -C /usr/local -xzf "${GO_TARBALL}" \ + && rm "${GO_TARBALL}" \ && echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/bash.bashrc \ && echo "export PATH=$PATH:/root/go/bin" >> /etc/bash.bashrc \ && /usr/local/go/bin/go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \ From 669610d1302cf62e1f4adfda232782436e823de6 Mon Sep 17 00:00:00 2001 From: Saravanan Gnanaguru Date: Wed, 15 Apr 2026 16:28:42 +0530 Subject: [PATCH 3/5] Update Go version to 1.26.2 in devcontainer configuration --- .devcontainer/devcontainer.env.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.env.json b/.devcontainer/devcontainer.env.json index 1715c73..2f5d8c7 100644 --- a/.devcontainer/devcontainer.env.json +++ b/.devcontainer/devcontainer.env.json @@ -57,7 +57,7 @@ "python": "3.11", "java": "17", "node": "20", - "go": "1.21", + "go": "1.26.2", "nexus": "3.50.0", "prometheus": "2.45.0", "grafana": "10.0.0", From 395cc799a62525e659a185d18e440a935e498773 Mon Sep 17 00:00:00 2001 From: Saravanan Gnanaguru Date: Wed, 15 Apr 2026 17:27:10 +0530 Subject: [PATCH 4/5] fix: Update development environment versions and configurations - Bump Python to 3.12, Java to 21, Node.js to 22, and Go to 1.25.0. - Upgrade Nexus to 3.91.0, Prometheus to 3.5.1, Grafana to 12.4.2, K9s to 0.50.16, ArgoCD to 3.3.6, Flux to 2.8.5, and Kustomize to 5.8.0. - Modify configuration files (.devcontainer/README.md, configure.py, devcontainer.env.json, devcontainer.json) to reflect new versions. - Update CLI options in devopsos.py and scaffold_devcontainer.py to use the latest versions as defaults. --- .devcontainer/Dockerfile | 585 +++++++++++++++------------- .devcontainer/README.md | 16 +- .devcontainer/configure.py | 36 +- .devcontainer/devcontainer.env.json | 22 +- .devcontainer/devcontainer.json | 76 ++-- cli/devopsos.py | 54 +-- cli/scaffold_devcontainer.py | 68 ++-- 7 files changed, 446 insertions(+), 411 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index c6addf4..feb2dea 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,37 +1,61 @@ -# Base image with common tools -FROM mcr.microsoft.com/devcontainers/base:ubuntu +# DevOps OS dev container (Ubuntu LTS optimized) +FROM mcr.microsoft.com/devcontainers/base:ubuntu-24.04 -# Arguments for customization -ARG PYTHON_VERSION=3.11 -ARG JAVA_VERSION=17 -ARG NODE_VERSION=20 -ARG GO_VERSION=1.21 +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +# Core language/runtime versions +ARG PYTHON_VERSION=3.12 +ARG JAVA_VERSION=21 +ARG NODE_VERSION=22 +ARG NVM_VERSION=0.40.3 +ARG GO_VERSION=1.25.0 ARG TARGETOS=linux ARG TARGETARCH=amd64 + +# Compatibility args (generated by scaffold command); currently not implemented in this image +ARG INSTALL_RUBY=false +ARG INSTALL_CSHARP=false +ARG INSTALL_PHP=false +ARG INSTALL_RUST=false +ARG INSTALL_TYPESCRIPT=false +ARG INSTALL_KOTLIN=false +ARG INSTALL_C=false +ARG INSTALL_CPP=false + +# Primary language toggles ARG INSTALL_PYTHON=true -ARG INSTALL_JAVA=true +ARG INSTALL_JAVA=true ARG INSTALL_JS=true +ARG INSTALL_JAVASCRIPT=false ARG INSTALL_GO=true + +# CI/CD + platform tools ARG INSTALL_DOCKER=true +ARG INSTALL_PODMAN=false ARG INSTALL_TERRAFORM=true +ARG TERRAFORM_VERSION=1.14.7 ARG INSTALL_KUBECTL=true ARG INSTALL_HELM=true +ARG HELM_VERSION=4.0.1 ARG INSTALL_GITHUB_ACTIONS=true +ARG ACTIONS_RUNNER_VERSION=2.330.0 # Kubernetes tools ARG INSTALL_K9S=true -ARG K9S_VERSION=0.29.1 +ARG K9S_VERSION=0.50.16 ARG INSTALL_KUSTOMIZE=true -ARG KUSTOMIZE_VERSION=5.2.1 +ARG KUSTOMIZE_VERSION=5.8.0 ARG INSTALL_ARGOCD_CLI=true -ARG ARGOCD_VERSION=2.8.4 +ARG ARGOCD_VERSION=3.3.6 ARG INSTALL_LENS=false ARG INSTALL_KUBESEAL=true +ARG KUBESEAL_VERSION=0.33.1 ARG INSTALL_FLUX=true -ARG FLUX_VERSION=2.1.2 +ARG FLUX_VERSION=2.8.5 ARG INSTALL_KIND=true -ARG KIND_VERSION=0.20.0 +ARG KIND_VERSION=0.31.0 ARG INSTALL_MINIKUBE=true +ARG MINIKUBE_VERSION=1.37.0 ARG INSTALL_OPENSHIFT_CLI=false # Build tools @@ -43,308 +67,317 @@ ARG INSTALL_CMAKE=true # Code analysis tools ARG INSTALL_SONARQUBE=true -ARG SONAR_SCANNER_VERSION=4.8.0.2856 +ARG SONAR_SCANNER_VERSION=8.0.1.6346 ARG INSTALL_CHECKSTYLE=true +ARG CHECKSTYLE_VERSION=12.1.2 ARG INSTALL_PMD=true -ARG PMD_VERSION=7.0.0-rc3 +ARG PMD_VERSION=7.18.0 ARG INSTALL_ESLINT=true ARG INSTALL_PYLINT=true # DevOps tools ARG INSTALL_NEXUS=true -ARG NEXUS_VERSION=3.50.0 +ARG NEXUS_VERSION=3.91.0 ARG INSTALL_PROMETHEUS=true -ARG PROMETHEUS_VERSION=2.45.0 +ARG PROMETHEUS_VERSION=3.5.1 ARG INSTALL_GRAFANA=true -ARG GRAFANA_VERSION=10.0.0 +ARG GRAFANA_VERSION=12.4.2 ARG INSTALL_ELK=true ARG INSTALL_JENKINS=false -# Essential build tools -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends \ - build-essential \ - curl \ - wget \ - unzip \ - git \ - gnupg \ - lsb-release \ - ca-certificates \ - apt-transport-https \ - software-properties-common \ - jq - -# Install Python if requested -RUN if [ "$INSTALL_PYTHON" = "true" ]; then \ - add-apt-repository ppa:deadsnakes/ppa \ - && apt-get update \ - && apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv python3-pip \ - && ln -sf /usr/bin/python${PYTHON_VERSION} /usr/bin/python3 \ - && ln -sf /usr/bin/python3 /usr/bin/python \ -# && python -m pip install --upgrade pip \ - && pip install pytest black flake8 mypy pipenv tox coverage pytest-cov; \ - fi - -# Install Java if requested -RUN if [ "$INSTALL_JAVA" = "true" ]; then \ - apt-get update \ - && apt-get install -y openjdk-${JAVA_VERSION}-jdk maven gradle \ - && echo "export JAVA_HOME=/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64" >> /etc/bash.bashrc; \ - fi - -# Install Node.js/JavaScript if requested -RUN if [ "$INSTALL_JS" = "true" ]; then \ - curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - \ - && apt-get install -y nodejs \ - && npm install -g yarn typescript jest eslint prettier; \ - fi - -# Install Go if requested -RUN if [ "$INSTALL_GO" = "true" ]; then \ - GO_DOWNLOAD_VERSION="${GO_VERSION}" \ - && case "${GO_DOWNLOAD_VERSION}" in *.*.*) ;; *.*) GO_DOWNLOAD_VERSION="${GO_DOWNLOAD_VERSION}.0" ;; esac \ - && GO_TARBALL="go${GO_DOWNLOAD_VERSION}.linux-amd64.tar.gz" \ - && curl -fsSLO "https://go.dev/dl/${GO_TARBALL}" \ - && test -s "${GO_TARBALL}" \ - && tar -C /usr/local -xzf "${GO_TARBALL}" \ - && rm "${GO_TARBALL}" \ - && echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/bash.bashrc \ - && echo "export PATH=$PATH:/root/go/bin" >> /etc/bash.bashrc \ - && /usr/local/go/bin/go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \ - fi - -# Install Docker if requested -RUN if [ "$INSTALL_DOCKER" = "true" ]; then \ - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ - && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list \ - && apt-get update \ - && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin; \ - fi - -# Install Terraform if requested -RUN if [ "$INSTALL_TERRAFORM" = "true" ]; then \ - wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg \ - && echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" > /etc/apt/sources.list.d/hashicorp.list \ - && apt-get update \ - && apt-get install -y terraform; \ +ENV DEBIAN_FRONTEND=noninteractive +ENV PATH="/usr/local/go/bin:/root/go/bin:/opt/sonar-scanner/bin:/opt/pmd/bin:${PATH}" +ENV SHELL=/bin/bash +ENV NVM_DIR=/usr/local/share/nvm + +# Base packages shared by most install flows. +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + apt-transport-https \ + build-essential \ + ca-certificates \ + curl \ + git \ + gnupg \ + jq \ + lsb-release \ + software-properties-common \ + tar \ + unzip \ + wget \ + xz-utils + +# Python +RUN if [ "${INSTALL_PYTHON}" = "true" ]; then \ + if [ "${PYTHON_VERSION}" != "3.12" ]; then \ + add-apt-repository -y ppa:deadsnakes/ppa && apt-get update; \ + fi \ + && apt-get install -y --no-install-recommends \ + python${PYTHON_VERSION} \ + python${PYTHON_VERSION}-dev \ + python${PYTHON_VERSION}-venv \ + python3-pip \ + && ln -sf /usr/bin/python${PYTHON_VERSION} /usr/local/bin/python3 \ + && ln -sf /usr/local/bin/python3 /usr/local/bin/python \ + && python3 -m pip install --no-cache-dir --upgrade pip \ + && pip install --no-cache-dir pytest black flake8 mypy pipenv tox coverage pytest-cov; \ fi -# Install kubectl if requested -RUN if [ "$INSTALL_KUBECTL" = "true" ]; then \ - KUBECTL_VERSION="$(curl -fsSL https://dl.k8s.io/release/stable.txt)" || (echo "Failed to resolve the latest kubectl version from https://dl.k8s.io/release/stable.txt" >&2 && exit 1) \ - && curl -fsSLo /tmp/kubectl "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl" \ - && curl -fsSLo /tmp/kubectl.sha256 "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl.sha256" \ - && KUBECTL_SHA256="$(cat /tmp/kubectl.sha256)" \ - && DOWNLOADED_KUBECTL_SHA256="$(sha256sum /tmp/kubectl | cut -d' ' -f1)" \ - && (test "${KUBECTL_SHA256}" = "${DOWNLOADED_KUBECTL_SHA256}" || (echo "Kubectl checksum verification failed: expected ${KUBECTL_SHA256}, got ${DOWNLOADED_KUBECTL_SHA256}" >&2 && exit 1)) \ - && install -o root -g root -m 0755 /tmp/kubectl /usr/local/bin/kubectl \ - && rm -f /tmp/kubectl /tmp/kubectl.sha256; \ +# Java and Java build tools +RUN if [ "${INSTALL_JAVA}" = "true" ] || [ "${INSTALL_MAVEN}" = "true" ] || [ "${INSTALL_GRADLE}" = "true" ] || [ "${INSTALL_ANT}" = "true" ]; then \ + apt-get update \ + && apt-get install -y --no-install-recommends openjdk-${JAVA_VERSION}-jdk; \ + fi \ + && if [ "${INSTALL_MAVEN}" = "true" ]; then apt-get update && apt-get install -y --no-install-recommends maven; fi \ + && if [ "${INSTALL_GRADLE}" = "true" ]; then apt-get update && apt-get install -y --no-install-recommends gradle; fi \ + && if [ "${INSTALL_ANT}" = "true" ]; then apt-get update && apt-get install -y --no-install-recommends ant; fi \ + && if [ "${INSTALL_JAVA}" = "true" ]; then \ + echo "export JAVA_HOME=/usr/lib/jvm/java-${JAVA_VERSION}-openjdk-$(dpkg --print-architecture)" > /etc/profile.d/java_home.sh; \ fi -# Install Helm if requested -RUN if [ "$INSTALL_HELM" = "true" ]; then \ - curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | tee /usr/share/keyrings/helm.gpg > /dev/null \ - && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" > /etc/apt/sources.list.d/helm-stable-debian.list \ - && apt-get update \ - && apt-get install -y helm; \ +# JavaScript / TypeScript +RUN if [ "${INSTALL_JS}" = "true" ] || [ "${INSTALL_JAVASCRIPT}" = "true" ] || [ "${INSTALL_TYPESCRIPT}" = "true" ]; then \ + curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - \ + && apt-get install -y --no-install-recommends nodejs \ + && mkdir -p "${NVM_DIR}" \ + && curl -fsSL "https://raw.githubusercontent.com/nvm-sh/nvm/v${NVM_VERSION}/install.sh" | PROFILE=/dev/null NVM_DIR="${NVM_DIR}" bash \ + && printf 'export NVM_DIR=%s\n[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"\n' "${NVM_DIR}" > /etc/profile.d/nvm.sh \ + && chmod +x /etc/profile.d/nvm.sh \ + && . "${NVM_DIR}/nvm.sh" \ + && nvm alias default system \ + && npm install -g yarn typescript jest prettier; \ + fi \ + && if [ "${INSTALL_ESLINT}" = "true" ]; then \ + if ! command -v npm >/dev/null 2>&1; then \ + curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - \ + && apt-get install -y --no-install-recommends nodejs; \ + fi \ + && npm install -g eslint; \ fi -# Install K9s if requested -RUN if [ "$INSTALL_K9S" = "true" ]; then \ - mkdir -p /tmp/k9s && cd /tmp/k9s \ - && curl -sSLo k9s.tar.gz "https://github.com/derailed/k9s/releases/download/v${K9S_VERSION}/k9s_Linux_amd64.tar.gz" \ - && tar -xzf k9s.tar.gz \ - && chmod +x k9s \ - && mv k9s /usr/local/bin/ \ - && cd /tmp && rm -rf /tmp/k9s; \ +# Go +RUN if [ "${INSTALL_GO}" = "true" ]; then \ + GO_DOWNLOAD_VERSION="${GO_VERSION}" \ + && case "${GO_DOWNLOAD_VERSION}" in *.*.*) ;; *.*) GO_DOWNLOAD_VERSION="${GO_DOWNLOAD_VERSION}.0" ;; esac \ + && case "${TARGETARCH}" in \ + amd64|x86_64) GO_ARCH="amd64" ;; \ + arm64|aarch64) GO_ARCH="arm64" ;; \ + *) echo "Unsupported TARGETARCH for Go: ${TARGETARCH}" >&2; exit 1 ;; \ + esac \ + && GO_TARBALL="go${GO_DOWNLOAD_VERSION}.${TARGETOS}-${GO_ARCH}.tar.gz" \ + && curl -fsSLo "/tmp/${GO_TARBALL}" "https://go.dev/dl/${GO_TARBALL}" \ + && tar -C /usr/local -xzf "/tmp/${GO_TARBALL}" \ + && rm -f "/tmp/${GO_TARBALL}" \ + && /usr/local/go/bin/go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \ fi -# Install Kustomize if requested -RUN if [ "$INSTALL_KUSTOMIZE" = "true" ]; then \ - curl -sSLo /tmp/kustomize.tar.gz "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_linux_amd64.tar.gz" \ - && mkdir -p /tmp/kustomize \ - && tar -xzf /tmp/kustomize.tar.gz -C /tmp/kustomize \ - && chmod +x /tmp/kustomize/kustomize \ - && mv /tmp/kustomize/kustomize /usr/local/bin/ \ - && rm -rf /tmp/kustomize /tmp/kustomize.tar.gz; \ +# Docker CLI / Podman +RUN if [ "${INSTALL_DOCKER}" = "true" ]; then \ + install -m 0755 -d /etc/apt/keyrings \ + && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg \ + && chmod a+r /etc/apt/keyrings/docker.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends docker-ce-cli docker-buildx-plugin docker-compose-plugin; \ + fi \ + && if [ "${INSTALL_PODMAN}" = "true" ]; then \ + apt-get update \ + && apt-get install -y --no-install-recommends podman; \ fi -# Install ArgoCD CLI if requested -RUN if [ "$INSTALL_ARGOCD_CLI" = "true" ]; then \ - curl -sSLo /usr/local/bin/argocd "https://github.com/argoproj/argo-cd/releases/download/v${ARGOCD_VERSION}/argocd-linux-amd64" \ - && chmod +x /usr/local/bin/argocd; \ +# Terraform (vendor-pinned binary + checksum) +RUN if [ "${INSTALL_TERRAFORM}" = "true" ]; then \ + case "${TARGETARCH}" in \ + amd64|x86_64) TF_ARCH="amd64" ;; \ + arm64|aarch64) TF_ARCH="arm64" ;; \ + *) echo "Unsupported TARGETARCH for Terraform: ${TARGETARCH}" >&2; exit 1 ;; \ + esac \ + && TF_BASE="terraform_${TERRAFORM_VERSION}_linux_${TF_ARCH}" \ + && curl -fsSLo "/tmp/${TF_BASE}.zip" "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/${TF_BASE}.zip" \ + && curl -fsSLo /tmp/terraform_SHA256SUMS "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_SHA256SUMS" \ + && grep " ${TF_BASE}.zip$" /tmp/terraform_SHA256SUMS | sha256sum -c - \ + && unzip -q "/tmp/${TF_BASE}.zip" -d /usr/local/bin \ + && rm -f "/tmp/${TF_BASE}.zip" /tmp/terraform_SHA256SUMS; \ fi -# Install Lens if requested -RUN if [ "$INSTALL_LENS" = "true" ]; then \ - apt-get update \ - && curl -fsSL https://downloads.k8slens.dev/keys/gpg | gpg --dearmor | tee /usr/share/keyrings/lens-archive-keyring.gpg > /dev/null \ - && echo "deb [arch=amd64 signed-by=/usr/share/keyrings/lens-archive-keyring.gpg] https://downloads.k8slens.dev/apt/debian stable main" | tee /etc/apt/sources.list.d/lens.list > /dev/null \ - && apt-get update \ - && apt-get install -y lens; \ +# kubectl +RUN if [ "${INSTALL_KUBECTL}" = "true" ]; then \ + case "${TARGETARCH}" in \ + amd64|x86_64) K_ARCH="amd64" ;; \ + arm64|aarch64) K_ARCH="arm64" ;; \ + *) echo "Unsupported TARGETARCH for kubectl: ${TARGETARCH}" >&2; exit 1 ;; \ + esac \ + && KUBECTL_VERSION="$(curl -fsSL https://dl.k8s.io/release/stable.txt)" \ + && curl -fsSLo /tmp/kubectl "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${K_ARCH}/kubectl" \ + && curl -fsSLo /tmp/kubectl.sha256 "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${K_ARCH}/kubectl.sha256" \ + && echo "$(cat /tmp/kubectl.sha256) /tmp/kubectl" | sha256sum --check --status \ + && install -o root -g root -m 0755 /tmp/kubectl /usr/local/bin/kubectl \ + && rm -f /tmp/kubectl /tmp/kubectl.sha256; \ fi -# Install Kubeseal if requested -RUN if [ "$INSTALL_KUBESEAL" = "true" ]; then \ - wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.3/kubeseal-0.24.3-linux-amd64.tar.gz \ - && tar -xvzf kubeseal-0.24.3-linux-amd64.tar.gz kubeseal \ - && install -m 755 kubeseal /usr/local/bin/kubeseal \ - && rm kubeseal kubeseal-0.24.3-linux-amd64.tar.gz; \ +# Helm (vendor-pinned binary + checksum) +RUN if [ "${INSTALL_HELM}" = "true" ]; then \ + case "${TARGETARCH}" in \ + amd64|x86_64) H_ARCH="amd64" ;; \ + arm64|aarch64) H_ARCH="arm64" ;; \ + *) echo "Unsupported TARGETARCH for Helm: ${TARGETARCH}" >&2; exit 1 ;; \ + esac \ + && HELM_TGZ="helm-v${HELM_VERSION}-${TARGETOS}-${H_ARCH}.tar.gz" \ + && curl -fsSLo "/tmp/${HELM_TGZ}" "https://get.helm.sh/${HELM_TGZ}" \ + && curl -fsSLo "/tmp/${HELM_TGZ}.sha256sum" "https://get.helm.sh/${HELM_TGZ}.sha256sum" \ + && (cd /tmp && sha256sum -c "${HELM_TGZ}.sha256sum") \ + && tar -xzf "/tmp/${HELM_TGZ}" -C /tmp \ + && install -m 0755 "/tmp/${TARGETOS}-${H_ARCH}/helm" /usr/local/bin/helm \ + && rm -rf "/tmp/${HELM_TGZ}" "/tmp/${HELM_TGZ}.sha256sum" "/tmp/${TARGETOS}-${H_ARCH}"; \ fi -# Install Flux if requested -RUN if [ "$INSTALL_FLUX" = "true" ]; then \ - curl -s https://fluxcd.io/install.sh | bash; \ +# Kubernetes utility CLIs +RUN case "${TARGETARCH}" in \ + amd64|x86_64) BIN_ARCH="amd64" ;; \ + arm64|aarch64) BIN_ARCH="arm64" ;; \ + *) echo "Unsupported TARGETARCH for Kubernetes CLIs: ${TARGETARCH}" >&2; exit 1 ;; \ + esac \ + && if [ "${INSTALL_K9S}" = "true" ]; then \ + mkdir -p /tmp/k9s && cd /tmp/k9s \ + && curl -fsSLo k9s.tar.gz "https://github.com/derailed/k9s/releases/download/v${K9S_VERSION}/k9s_Linux_${BIN_ARCH}.tar.gz" \ + && tar -xzf k9s.tar.gz \ + && install -m 0755 k9s /usr/local/bin/k9s \ + && rm -rf /tmp/k9s; \ + fi \ + && if [ "${INSTALL_KUSTOMIZE}" = "true" ]; then \ + curl -fsSLo /tmp/kustomize.tar.gz "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_linux_${BIN_ARCH}.tar.gz" \ + && mkdir -p /tmp/kustomize \ + && tar -xzf /tmp/kustomize.tar.gz -C /tmp/kustomize \ + && install -m 0755 /tmp/kustomize/kustomize /usr/local/bin/kustomize \ + && rm -rf /tmp/kustomize /tmp/kustomize.tar.gz; \ + fi \ + && if [ "${INSTALL_ARGOCD_CLI}" = "true" ]; then \ + curl -fsSLo /usr/local/bin/argocd "https://github.com/argoproj/argo-cd/releases/download/v${ARGOCD_VERSION}/argocd-linux-${BIN_ARCH}" \ + && chmod +x /usr/local/bin/argocd; \ + fi \ + && if [ "${INSTALL_KUBESEAL}" = "true" ]; then \ + curl -fsSLo /tmp/kubeseal.tar.gz "https://github.com/bitnami-labs/sealed-secrets/releases/download/v${KUBESEAL_VERSION}/kubeseal-${KUBESEAL_VERSION}-linux-${BIN_ARCH}.tar.gz" \ + && tar -xzf /tmp/kubeseal.tar.gz -C /tmp kubeseal \ + && install -m 0755 /tmp/kubeseal /usr/local/bin/kubeseal \ + && rm -f /tmp/kubeseal /tmp/kubeseal.tar.gz; \ + fi \ + && if [ "${INSTALL_FLUX}" = "true" ]; then \ + curl -fsSL https://fluxcd.io/install.sh | FLUX_VERSION="v${FLUX_VERSION}" bash; \ + fi \ + && if [ "${INSTALL_KIND}" = "true" ]; then \ + curl -fsSLo /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v${KIND_VERSION}/kind-${TARGETOS}-${BIN_ARCH}" \ + && chmod +x /usr/local/bin/kind; \ + fi \ + && if [ "${INSTALL_MINIKUBE}" = "true" ]; then \ + curl -fsSLo /usr/local/bin/minikube "https://storage.googleapis.com/minikube/releases/v${MINIKUBE_VERSION}/minikube-${TARGETOS}-${BIN_ARCH}" \ + && chmod +x /usr/local/bin/minikube; \ + fi \ + && if [ "${INSTALL_OPENSHIFT_CLI}" = "true" ]; then \ + curl -fsSLo /tmp/oc.tar.gz "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-client-linux.tar.gz" \ + && mkdir -p /tmp/oc \ + && tar -xzf /tmp/oc.tar.gz -C /tmp/oc \ + && install -m 0755 /tmp/oc/oc /usr/local/bin/oc \ + && rm -rf /tmp/oc /tmp/oc.tar.gz; \ fi -# Install KinD if requested -RUN if [ "$INSTALL_KIND" = "true" ]; then \ - curl -fsSLo /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v${KIND_VERSION}/kind-${TARGETOS}-${TARGETARCH}" \ - && chmod +x /usr/local/bin/kind; \ +# Lens desktop app is not practical in headless dev containers. +RUN if [ "${INSTALL_LENS}" = "true" ]; then \ + echo "INSTALL_LENS=true requested. Skipping: Lens desktop app is not supported in headless dev containers." >&2; \ fi -# Install Minikube if requested -RUN if [ "$INSTALL_MINIKUBE" = "true" ]; then \ - curl -Lo /usr/local/bin/minikube "https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64" \ - && chmod +x /usr/local/bin/minikube; \ +# GitHub Actions runner +RUN if [ "${INSTALL_GITHUB_ACTIONS}" = "true" ]; then \ + case "${TARGETARCH}" in \ + amd64|x86_64) RUNNER_ARCH="x64" ;; \ + arm64|aarch64) RUNNER_ARCH="arm64" ;; \ + *) echo "Unsupported TARGETARCH for actions-runner: ${TARGETARCH}" >&2; exit 1 ;; \ + esac \ + && mkdir -p /opt/actions-runner \ + && cd /opt/actions-runner \ + && curl -fsSLo "actions-runner-linux-${RUNNER_ARCH}-${ACTIONS_RUNNER_VERSION}.tar.gz" "https://github.com/actions/runner/releases/download/v${ACTIONS_RUNNER_VERSION}/actions-runner-linux-${RUNNER_ARCH}-${ACTIONS_RUNNER_VERSION}.tar.gz" \ + && tar xzf "actions-runner-linux-${RUNNER_ARCH}-${ACTIONS_RUNNER_VERSION}.tar.gz" \ + && rm -f "actions-runner-linux-${RUNNER_ARCH}-${ACTIONS_RUNNER_VERSION}.tar.gz" \ + && ./bin/installdependencies.sh; \ fi -# Install OpenShift CLI if requested -RUN if [ "$INSTALL_OPENSHIFT_CLI" = "true" ]; then \ - curl -Lo /tmp/oc.tar.gz "https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-client-linux.tar.gz" \ - && mkdir -p /tmp/oc \ - && tar -xzf /tmp/oc.tar.gz -C /tmp/oc \ - && chmod +x /tmp/oc/oc \ - && mv /tmp/oc/oc /usr/local/bin/ \ - && rm -rf /tmp/oc /tmp/oc.tar.gz; \ - fi - -# Install GitHub Actions runner if requested -RUN if [ "$INSTALL_GITHUB_ACTIONS" = "true" ]; then \ - mkdir -p /opt/actions-runner \ - && cd /opt/actions-runner \ - && curl -O -L https://github.com/actions/runner/releases/download/v2.309.0/actions-runner-linux-x64-2.309.0.tar.gz \ - && tar xzf ./actions-runner-linux-x64-2.309.0.tar.gz \ - && rm actions-runner-linux-x64-2.309.0.tar.gz \ - && ./bin/installdependencies.sh; \ - fi +# Build tool toggles +RUN if [ "${INSTALL_MAKE}" = "true" ]; then apt-get update && apt-get install -y --no-install-recommends make; fi \ + && if [ "${INSTALL_CMAKE}" = "true" ]; then apt-get update && apt-get install -y --no-install-recommends cmake; fi -# Install Build Tools -# Make and CMake -RUN if [ "$INSTALL_MAKE" = "true" ] || [ "$INSTALL_CMAKE" = "true" ]; then \ - apt-get update \ - && apt-get install -y make; \ - fi - -RUN if [ "$INSTALL_CMAKE" = "true" ]; then \ - apt-get update \ - && apt-get install -y cmake; \ - fi - -# Ant (if not already installed with Java) -RUN if [ "$INSTALL_ANT" = "true" ]; then \ - apt-get update \ - && apt-get install -y ant; \ - fi - -# Code Analysis Tools - -# SonarQube Scanner -RUN if [ "$INSTALL_SONARQUBE" = "true" ]; then \ - curl -fsSLo /tmp/sonar-scanner-cli.zip "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux.zip" \ - && rm -rf /opt/sonar-scanner \ - && mkdir -p /tmp/sonar-scanner \ - && unzip /tmp/sonar-scanner-cli.zip -d /tmp/sonar-scanner \ - && mv "/tmp/sonar-scanner/sonar-scanner-${SONAR_SCANNER_VERSION}-linux" /opt/sonar-scanner \ - && rm -rf /tmp/sonar-scanner /tmp/sonar-scanner-cli.zip \ - && echo 'export PATH=$PATH:/opt/sonar-scanner/bin' >> /etc/bash.bashrc; \ - fi - -# Checkstyle -RUN if [ "$INSTALL_CHECKSTYLE" = "true" ]; then \ - mkdir -p /opt/checkstyle \ - && curl -sSLo /opt/checkstyle/checkstyle.jar https://github.com/checkstyle/checkstyle/releases/download/checkstyle-10.12.0/checkstyle-10.12.0-all.jar \ - && echo '#!/bin/bash\njava -jar /opt/checkstyle/checkstyle.jar "$@"' > /usr/local/bin/checkstyle \ - && chmod +x /usr/local/bin/checkstyle; \ - fi - -# PMD -RUN if [ "$INSTALL_PMD" = "true" ]; then \ - mkdir -p /opt/pmd \ - && curl -fsSLo /opt/pmd.zip "https://github.com/pmd/pmd/releases/download/pmd_releases/${PMD_VERSION}/pmd-dist-${PMD_VERSION}-bin.zip" \ - && unzip /opt/pmd.zip -d /opt \ - && mv "/opt/pmd-bin-${PMD_VERSION}" /opt/pmd \ - && rm /opt/pmd.zip \ - && echo 'export PATH=$PATH:/opt/pmd/bin' >> /etc/bash.bashrc; \ - fi - -# Install Pylint if not already installed with Python -RUN if [ "$INSTALL_PYLINT" = "true" ] && [ "$INSTALL_PYTHON" = "true" ]; then \ - pip install pylint; \ - fi - -# Install ESLint if not already installed with Node.js -RUN if [ "$INSTALL_ESLINT" = "true" ] && [ "$INSTALL_JS" = "true" ]; then \ - npm install -g eslint; \ - fi - -# DevOps Tools - -# Sonatype Nexus -RUN if [ "$INSTALL_NEXUS" = "true" ]; then \ - mkdir -p /opt/nexus \ - && curl -sSLo /opt/nexus.tar.gz https://download.sonatype.com/nexus/3/nexus-${NEXUS_VERSION}-unix.tar.gz \ - && tar -xzf /opt/nexus.tar.gz -C /opt \ - && mv /opt/nexus-* /opt/nexus \ - && rm /opt/nexus.tar.gz \ - && echo '#!/bin/bash\n/opt/nexus/bin/nexus "$@"' > /usr/local/bin/nexus \ - && chmod +x /usr/local/bin/nexus \ - && echo 'export NEXUS_HOME=/opt/nexus' >> /etc/bash.bashrc; \ - fi - -# Prometheus -RUN if [ "$INSTALL_PROMETHEUS" = "true" ]; then \ - mkdir -p /opt/prometheus \ - && curl -sSLo /opt/prometheus.tar.gz https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz \ - && tar -xzf /opt/prometheus.tar.gz -C /opt \ - && mv /opt/prometheus-* /opt/prometheus \ - && rm /opt/prometheus.tar.gz \ - && echo '#!/bin/bash\n/opt/prometheus/prometheus "$@"' > /usr/local/bin/prometheus \ - && chmod +x /usr/local/bin/prometheus; \ - fi - -# Grafana -RUN if [ "$INSTALL_GRAFANA" = "true" ]; then \ - wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | tee /usr/share/keyrings/grafana.gpg > /dev/null \ - && echo "deb [signed-by=/usr/share/keyrings/grafana.gpg] https://apt.grafana.com stable main" | tee -a /etc/apt/sources.list.d/grafana.list \ - && apt-get update \ - && apt-get install -y grafana; \ - fi - -# ELK Stack (Elasticsearch, Logstash, Kibana) -RUN if [ "$INSTALL_ELK" = "true" ]; then \ - wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg \ - && echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list \ - && apt-get update \ - && apt-get install -y elasticsearch kibana logstash; \ +# Code analysis tools +RUN if [ "${INSTALL_SONARQUBE}" = "true" ]; then \ + curl -fsSLo /tmp/sonar-scanner-cli.zip "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-x64.zip" \ + && rm -rf /opt/sonar-scanner \ + && mkdir -p /tmp/sonar-scanner \ + && unzip -q /tmp/sonar-scanner-cli.zip -d /tmp/sonar-scanner \ + && mv "/tmp/sonar-scanner/sonar-scanner-${SONAR_SCANNER_VERSION}-linux-x64" /opt/sonar-scanner \ + && rm -rf /tmp/sonar-scanner /tmp/sonar-scanner-cli.zip; \ + fi \ + && if [ "${INSTALL_CHECKSTYLE}" = "true" ]; then \ + mkdir -p /opt/checkstyle \ + && curl -fsSLo /opt/checkstyle/checkstyle.jar "https://github.com/checkstyle/checkstyle/releases/download/checkstyle-${CHECKSTYLE_VERSION}/checkstyle-${CHECKSTYLE_VERSION}-all.jar" \ + && printf '#!/usr/bin/env bash\nexec java -jar /opt/checkstyle/checkstyle.jar "$@"\n' > /usr/local/bin/checkstyle \ + && chmod +x /usr/local/bin/checkstyle; \ + fi \ + && if [ "${INSTALL_PMD}" = "true" ]; then \ + mkdir -p /opt/pmd \ + && curl -fsSLo /tmp/pmd.zip "https://github.com/pmd/pmd/releases/download/pmd_releases/${PMD_VERSION}/pmd-dist-${PMD_VERSION}-bin.zip" \ + && unzip -q /tmp/pmd.zip -d /opt \ + && mv "/opt/pmd-bin-${PMD_VERSION}" /opt/pmd \ + && rm -f /tmp/pmd.zip; \ + fi \ + && if [ "${INSTALL_PYLINT}" = "true" ] && command -v pip >/dev/null 2>&1; then \ + pip install --no-cache-dir pylint; \ fi -# Jenkins (optional) -RUN if [ "$INSTALL_JENKINS" = "true" ]; then \ - curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | tee \ - /usr/share/keyrings/jenkins-keyring.asc > /dev/null \ - && echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \ - https://pkg.jenkins.io/debian-stable binary/ | tee \ - /etc/apt/sources.list.d/jenkins.list > /dev/null \ - && apt-get update \ - && apt-get install -y jenkins; \ +# DevOps toolchain binaries +RUN case "${TARGETARCH}" in \ + amd64|x86_64) BIN_ARCH="amd64"; NEXUS_ARCH="x86-64" ;; \ + arm64|aarch64) BIN_ARCH="arm64"; NEXUS_ARCH="aarch64" ;; \ + *) echo "Unsupported TARGETARCH for DevOps binaries: ${TARGETARCH}" >&2; exit 1 ;; \ + esac \ + && if [ "${INSTALL_NEXUS}" = "true" ]; then \ + apt-get update && apt-get install -y --no-install-recommends openjdk-${JAVA_VERSION}-jre-headless \ + && mkdir -p /opt/nexus \ + && curl -fsSLo /tmp/nexus.tar.gz "https://download.sonatype.com/nexus/3/nexus-${NEXUS_VERSION}-linux-${NEXUS_ARCH}.tar.gz" \ + && tar -xzf /tmp/nexus.tar.gz -C /opt \ + && rm -rf /opt/nexus \ + && mv /opt/nexus-* /opt/nexus \ + && rm -f /tmp/nexus.tar.gz \ + && printf '#!/usr/bin/env bash\nexec /opt/nexus/bin/nexus "$@"\n' > /usr/local/bin/nexus \ + && chmod +x /usr/local/bin/nexus \ + && echo 'export NEXUS_HOME=/opt/nexus' > /etc/profile.d/nexus_home.sh; \ + fi \ + && if [ "${INSTALL_PROMETHEUS}" = "true" ]; then \ + mkdir -p /opt/prometheus \ + && curl -fsSLo /tmp/prometheus.tar.gz "https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/prometheus-${PROMETHEUS_VERSION}.linux-${BIN_ARCH}.tar.gz" \ + && tar -xzf /tmp/prometheus.tar.gz -C /opt \ + && rm -rf /opt/prometheus \ + && mv /opt/prometheus-* /opt/prometheus \ + && rm -f /tmp/prometheus.tar.gz \ + && printf '#!/usr/bin/env bash\nexec /opt/prometheus/prometheus "$@"\n' > /usr/local/bin/prometheus \ + && chmod +x /usr/local/bin/prometheus; \ + fi \ + && if [ "${INSTALL_GRAFANA}" = "true" ]; then \ + apt-get update && apt-get install -y --no-install-recommends adduser libfontconfig1 \ + && curl -fsSLo /tmp/grafana.deb "https://dl.grafana.com/oss/release/grafana_${GRAFANA_VERSION}_${BIN_ARCH}.deb" \ + && apt-get install -y --no-install-recommends /tmp/grafana.deb \ + && rm -f /tmp/grafana.deb; \ + fi \ + && if [ "${INSTALL_ELK}" = "true" ]; then \ + curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg \ + && echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" > /etc/apt/sources.list.d/elastic-8.x.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends elasticsearch kibana logstash; \ + fi \ + && if [ "${INSTALL_JENKINS}" = "true" ]; then \ + curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | tee /usr/share/keyrings/jenkins-keyring.asc >/dev/null \ + && echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" > /etc/apt/sources.list.d/jenkins.list \ + && apt-get update \ + && apt-get install -y --no-install-recommends jenkins; \ fi -# Clean up +# Final cleanup RUN apt-get autoremove -y \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/* - -# Set the default shell to bash -ENV SHELL /bin/bash diff --git a/.devcontainer/README.md b/.devcontainer/README.md index 297f513..8ce255a 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -67,14 +67,14 @@ Run `python -m cli.scaffold_devcontainer --help` to see all available options in "openshift_cli": false }, "versions": { - "python": "3.11", - "java": "17", - "node": "20", - "go": "1.21", - "k9s": "0.29.1", - "argocd": "2.8.4", - "flux": "2.1.2", - "kustomize": "5.2.1" + "python": "3.12", + "java": "21", + "node": "22", + "go": "1.25.0", + "k9s": "0.50.16", + "argocd": "3.3.6", + "flux": "2.8.5", + "kustomize": "5.8.0" } } ``` diff --git a/.devcontainer/configure.py b/.devcontainer/configure.py index 2b1433d..88c79c1 100755 --- a/.devcontainer/configure.py +++ b/.devcontainer/configure.py @@ -54,17 +54,17 @@ "jenkins": False }, "versions": { - "python": "3.11", - "java": "17", - "node": "20", - "go": "1.21", - "nexus": "3.50.0", - "prometheus": "2.45.0", - "grafana": "10.0.0", - "k9s": "0.29.1", - "argocd": "2.8.4", - "flux": "2.1.2", - "kustomize": "5.2.1" + "python": "3.12", + "java": "21", + "node": "22", + "go": "1.25.0", + "nexus": "3.91.0", + "prometheus": "3.5.1", + "grafana": "12.4.2", + "k9s": "0.50.16", + "argocd": "3.3.6", + "flux": "2.8.5", + "kustomize": "5.8.0" } } @@ -105,15 +105,15 @@ # Kubernetes tools "INSTALL_K9S": str(config["kubernetes"]["k9s"]).lower(), - "K9S_VERSION": config["versions"].get("k9s", "0.29.1"), + "K9S_VERSION": config["versions"].get("k9s", "0.50.16"), "INSTALL_KUSTOMIZE": str(config["kubernetes"]["kustomize"]).lower(), - "KUSTOMIZE_VERSION": config["versions"].get("kustomize", "5.2.1"), + "KUSTOMIZE_VERSION": config["versions"].get("kustomize", "5.8.0"), "INSTALL_ARGOCD_CLI": str(config["kubernetes"]["argocd_cli"]).lower(), - "ARGOCD_VERSION": config["versions"].get("argocd", "2.8.4"), + "ARGOCD_VERSION": config["versions"].get("argocd", "3.3.6"), "INSTALL_LENS": str(config["kubernetes"]["lens"]).lower(), "INSTALL_KUBESEAL": str(config["kubernetes"]["kubeseal"]).lower(), "INSTALL_FLUX": str(config["kubernetes"]["flux"]).lower(), - "FLUX_VERSION": config["versions"].get("flux", "2.1.2"), + "FLUX_VERSION": config["versions"].get("flux", "2.8.5"), "INSTALL_KIND": str(config["kubernetes"]["kind"]).lower(), "INSTALL_MINIKUBE": str(config["kubernetes"]["minikube"]).lower(), "INSTALL_OPENSHIFT_CLI": str(config["kubernetes"]["openshift_cli"]).lower(), @@ -134,11 +134,11 @@ # DevOps tools "INSTALL_NEXUS": str(config["devops_tools"]["nexus"]).lower(), - "NEXUS_VERSION": config["versions"].get("nexus", "3.50.0"), + "NEXUS_VERSION": config["versions"].get("nexus", "3.91.0"), "INSTALL_PROMETHEUS": str(config["devops_tools"]["prometheus"]).lower(), - "PROMETHEUS_VERSION": config["versions"].get("prometheus", "2.45.0"), + "PROMETHEUS_VERSION": config["versions"].get("prometheus", "3.5.1"), "INSTALL_GRAFANA": str(config["devops_tools"]["grafana"]).lower(), - "GRAFANA_VERSION": config["versions"].get("grafana", "10.0.0"), + "GRAFANA_VERSION": config["versions"].get("grafana", "12.4.2"), "INSTALL_ELK": str(config["devops_tools"]["elk"]).lower(), "INSTALL_JENKINS": str(config["devops_tools"]["jenkins"]).lower() } diff --git a/.devcontainer/devcontainer.env.json b/.devcontainer/devcontainer.env.json index 2f5d8c7..dffaec7 100644 --- a/.devcontainer/devcontainer.env.json +++ b/.devcontainer/devcontainer.env.json @@ -54,16 +54,16 @@ "jenkins": false }, "versions": { - "python": "3.11", - "java": "17", - "node": "20", - "go": "1.26.2", - "nexus": "3.50.0", - "prometheus": "2.45.0", - "grafana": "10.0.0", - "k9s": "0.29.1", - "argocd": "2.8.4", - "flux": "2.1.2", - "kustomize": "5.2.1" + "python": "3.12", + "java": "21", + "node": "22", + "go": "1.25.0", + "nexus": "3.91.0", + "prometheus": "3.5.1", + "grafana": "12.4.2", + "k9s": "0.50.16", + "argocd": "3.3.6", + "flux": "2.8.5", + "kustomize": "5.8.0" } } diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 66e9726..5e67cbd 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,48 +3,50 @@ "build": { "dockerfile": "Dockerfile", "args": { - "INSTALL_PYTHON": "false", + "PYTHON_VERSION": "3.12", + "JAVA_VERSION": "21", + "NODE_VERSION": "22", + "GO_VERSION": "1.25.0", + "INSTALL_PYTHON": "true", "INSTALL_JAVA": "false", "INSTALL_JS": "false", - "INSTALL_RUBY": "false", - "INSTALL_CSHARP": "false", - "INSTALL_PHP": "false", - "INSTALL_RUST": "false", - "INSTALL_TYPESCRIPT": "false", - "INSTALL_KOTLIN": "false", - "INSTALL_C": "false", - "INSTALL_CPP": "false", - "INSTALL_JAVASCRIPT": "false", "INSTALL_GO": "false", - "INSTALL_DOCKER": "false", - "INSTALL_TERRAFORM": "false", - "INSTALL_KUBECTL": "false", - "INSTALL_HELM": "false", - "INSTALL_GITHUB_ACTIONS": "false", - "INSTALL_JENKINS": "false", - "INSTALL_K9S": "false", - "INSTALL_KUSTOMIZE": "false", - "INSTALL_ARGOCD_CLI": "false", + "INSTALL_DOCKER": "true", + "INSTALL_TERRAFORM": "true", + "INSTALL_KUBECTL": "true", + "INSTALL_HELM": "true", + "INSTALL_GITHUB_ACTIONS": "true", + "INSTALL_K9S": "true", + "K9S_VERSION": "0.50.16", + "INSTALL_KUSTOMIZE": "true", + "KUSTOMIZE_VERSION": "5.8.0", + "INSTALL_ARGOCD_CLI": "true", + "ARGOCD_VERSION": "3.3.6", "INSTALL_LENS": "false", - "INSTALL_KUBESEAL": "false", - "INSTALL_FLUX": "false", - "INSTALL_KIND": "false", - "INSTALL_MINIKUBE": "false", + "INSTALL_KUBESEAL": "true", + "INSTALL_FLUX": "true", + "FLUX_VERSION": "2.8.5", + "INSTALL_KIND": "true", + "INSTALL_MINIKUBE": "true", "INSTALL_OPENSHIFT_CLI": "false", - "INSTALL_GRADLE": "false", - "INSTALL_MAVEN": "false", - "INSTALL_ANT": "false", - "INSTALL_MAKE": "false", - "INSTALL_CMAKE": "false", - "INSTALL_SONARQUBE": "false", - "INSTALL_CHECKSTYLE": "false", - "INSTALL_PMD": "false", - "INSTALL_ESLINT": "false", - "INSTALL_PYLINT": "false", - "INSTALL_NEXUS": "false", - "INSTALL_PROMETHEUS": "false", - "INSTALL_GRAFANA": "false", - "INSTALL_ELK": "false" + "INSTALL_GRADLE": "true", + "INSTALL_MAVEN": "true", + "INSTALL_ANT": "true", + "INSTALL_MAKE": "true", + "INSTALL_CMAKE": "true", + "INSTALL_SONARQUBE": "true", + "INSTALL_CHECKSTYLE": "true", + "INSTALL_PMD": "true", + "INSTALL_ESLINT": "true", + "INSTALL_PYLINT": "true", + "INSTALL_NEXUS": "true", + "NEXUS_VERSION": "3.91.0", + "INSTALL_PROMETHEUS": "true", + "PROMETHEUS_VERSION": "3.5.1", + "INSTALL_GRAFANA": "true", + "GRAFANA_VERSION": "12.4.2", + "INSTALL_ELK": "true", + "INSTALL_JENKINS": "false" } }, "mounts": [ diff --git a/cli/devopsos.py b/cli/devopsos.py index beba9f1..915a093 100644 --- a/cli/devopsos.py +++ b/cli/devopsos.py @@ -426,38 +426,38 @@ def scaffold_devcontainer_cmd( help="Comma-separated code analysis tools (default: none)"), devops_tools: str = typer.Option("", "--devops-tools", envvar="DEVOPS_OS_DEVCONTAINER_DEVOPS_TOOLS", help="Comma-separated DevOps tools (default: none)"), - python_version: str = typer.Option("3.11", "--python-version", + python_version: str = typer.Option("3.12", "--python-version", envvar="DEVOPS_OS_DEVCONTAINER_PYTHON_VERSION", - help="Python version (default: 3.11)"), - java_version: str = typer.Option("17", "--java-version", + help="Python version (default: 3.12)"), + java_version: str = typer.Option("21", "--java-version", envvar="DEVOPS_OS_DEVCONTAINER_JAVA_VERSION", - help="Java JDK version (default: 17)"), - node_version: str = typer.Option("20", "--node-version", + help="Java JDK version (default: 21)"), + node_version: str = typer.Option("22", "--node-version", envvar="DEVOPS_OS_DEVCONTAINER_NODE_VERSION", - help="Node.js version (default: 20)"), - go_version: str = typer.Option("1.21", "--go-version", envvar="DEVOPS_OS_DEVCONTAINER_GO_VERSION", - help="Go version (default: 1.21)"), - k9s_version: str = typer.Option("0.29.1", "--k9s-version", + help="Node.js version (default: 22)"), + go_version: str = typer.Option("1.25.0", "--go-version", envvar="DEVOPS_OS_DEVCONTAINER_GO_VERSION", + help="Go version (default: 1.25.0)"), + k9s_version: str = typer.Option("0.50.16", "--k9s-version", envvar="DEVOPS_OS_DEVCONTAINER_K9S_VERSION", - help="K9s version (default: 0.29.1)"), - argocd_version: str = typer.Option("2.8.4", "--argocd-version", + help="K9s version (default: 0.50.16)"), + argocd_version: str = typer.Option("3.3.6", "--argocd-version", envvar="DEVOPS_OS_DEVCONTAINER_ARGOCD_VERSION", - help="ArgoCD version (default: 2.8.4)"), - flux_version: str = typer.Option("2.1.2", "--flux-version", + help="ArgoCD version (default: 3.3.6)"), + flux_version: str = typer.Option("2.8.5", "--flux-version", envvar="DEVOPS_OS_DEVCONTAINER_FLUX_VERSION", - help="Flux version (default: 2.1.2)"), - kustomize_version: str = typer.Option("5.2.1", "--kustomize-version", + help="Flux version (default: 2.8.5)"), + kustomize_version: str = typer.Option("5.8.0", "--kustomize-version", envvar="DEVOPS_OS_DEVCONTAINER_KUSTOMIZE_VERSION", - help="Kustomize version (default: 5.2.1)"), - nexus_version: str = typer.Option("3.50.0", "--nexus-version", + help="Kustomize version (default: 5.8.0)"), + nexus_version: str = typer.Option("3.91.0", "--nexus-version", envvar="DEVOPS_OS_DEVCONTAINER_NEXUS_VERSION", - help="Nexus version (default: 3.50.0)"), - prometheus_version: str = typer.Option("2.45.0", "--prometheus-version", + help="Nexus version (default: 3.91.0)"), + prometheus_version: str = typer.Option("3.5.1", "--prometheus-version", envvar="DEVOPS_OS_DEVCONTAINER_PROMETHEUS_VERSION", - help="Prometheus version (default: 2.45.0)"), - grafana_version: str = typer.Option("10.0.0", "--grafana-version", + help="Prometheus version (default: 3.5.1)"), + grafana_version: str = typer.Option("12.4.2", "--grafana-version", envvar="DEVOPS_OS_DEVCONTAINER_GRAFANA_VERSION", - help="Grafana version (default: 10.0.0)"), + help="Grafana version (default: 12.4.2)"), output_dir: str = typer.Option(".", "--output-dir", envvar="DEVOPS_OS_DEVCONTAINER_OUTPUT_DIR", help="Root output directory (files written to /.devcontainer/)"), ): @@ -472,7 +472,7 @@ def scaffold_devcontainer_cmd( Examples: devopsos scaffold devcontainer --languages python,java --cicd-tools docker,github_actions devopsos scaffold devcontainer --kubernetes-tools kubectl,helm,argocd_cli - devopsos scaffold devcontainer --languages go --go-version 1.22 --output-dir myproject + devopsos scaffold devcontainer --languages go --go-version 1.25.0 --output-dir myproject """ _show_help_if_no_opts(ctx) flags = [ @@ -647,9 +647,9 @@ def init( ALL_DEVOPS_TOOLS = ["nexus", "prometheus", "grafana", "elk", "jenkins"] versions_defaults = { - "python": "3.11", "java": "17", "node": "20", "go": "1.21", "nexus": "3.50.0", - "prometheus": "2.45.0", "grafana": "10.0.0", "k9s": "0.29.1", "argocd": "2.8.4", - "flux": "2.1.2", "kustomize": "5.2.1", "jenkins": "2.440.1" + "python": "3.12", "java": "21", "node": "22", "go": "1.25.0", "nexus": "3.91.0", + "prometheus": "3.5.1", "grafana": "12.4.2", "k9s": "0.50.16", "argocd": "3.3.6", + "flux": "2.8.5", "kustomize": "5.8.0", "jenkins": "2.440.1" } # ── Wizard groups aligned with Process-First DevOps principles ──────── @@ -780,7 +780,7 @@ def _sel(group): return selected_by_group.get(group, []) "ruby": "INSTALL_RUBY", "csharp": "INSTALL_CSHARP", "php": "INSTALL_PHP", "rust": "INSTALL_RUST", "typescript": "INSTALL_TYPESCRIPT", "kotlin": "INSTALL_KOTLIN", "c": "INSTALL_C", "cpp": "INSTALL_CPP", - "javascript": "INSTALL_JAVASCRIPT", "go": "INSTALL_GO" + "javascript": "INSTALL_JS", "go": "INSTALL_GO" } for lang, arg in lang_map.items(): build_args[arg] = str(config["languages"].get(lang, False)).lower() diff --git a/cli/scaffold_devcontainer.py b/cli/scaffold_devcontainer.py index 34694a2..3f2df04 100644 --- a/cli/scaffold_devcontainer.py +++ b/cli/scaffold_devcontainer.py @@ -43,7 +43,7 @@ "csharp": "INSTALL_CSHARP", "php": "INSTALL_PHP", "rust": "INSTALL_RUST", "typescript": "INSTALL_TYPESCRIPT", "kotlin": "INSTALL_KOTLIN", "c": "INSTALL_C", - "cpp": "INSTALL_CPP", "javascript": "INSTALL_JAVASCRIPT", + "cpp": "INSTALL_CPP", "javascript": "INSTALL_JS", "go": "INSTALL_GO", } CICD_ARG_MAP = { @@ -115,38 +115,38 @@ def parse_arguments(): ) # Version overrides parser.add_argument("--python-version", - default=os.environ.get(f"{ENV_PREFIX}PYTHON_VERSION", "3.11"), - help="Python version (default: 3.11)") + default=os.environ.get(f"{ENV_PREFIX}PYTHON_VERSION", "3.12"), + help="Python version (default: 3.12)") parser.add_argument("--java-version", - default=os.environ.get(f"{ENV_PREFIX}JAVA_VERSION", "17"), - help="Java JDK version (default: 17)") + default=os.environ.get(f"{ENV_PREFIX}JAVA_VERSION", "21"), + help="Java JDK version (default: 21)") parser.add_argument("--node-version", - default=os.environ.get(f"{ENV_PREFIX}NODE_VERSION", "20"), - help="Node.js version (default: 20)") + default=os.environ.get(f"{ENV_PREFIX}NODE_VERSION", "22"), + help="Node.js version (default: 22)") parser.add_argument("--go-version", - default=os.environ.get(f"{ENV_PREFIX}GO_VERSION", "1.21"), - help="Go version (default: 1.21)") + default=os.environ.get(f"{ENV_PREFIX}GO_VERSION", "1.25.0"), + help="Go version (default: 1.25.0)") parser.add_argument("--k9s-version", - default=os.environ.get(f"{ENV_PREFIX}K9S_VERSION", "0.29.1"), - help="K9s version (default: 0.29.1)") + default=os.environ.get(f"{ENV_PREFIX}K9S_VERSION", "0.50.16"), + help="K9s version (default: 0.50.16)") parser.add_argument("--argocd-version", - default=os.environ.get(f"{ENV_PREFIX}ARGOCD_VERSION", "2.8.4"), - help="ArgoCD version (default: 2.8.4)") + default=os.environ.get(f"{ENV_PREFIX}ARGOCD_VERSION", "3.3.6"), + help="ArgoCD version (default: 3.3.6)") parser.add_argument("--flux-version", - default=os.environ.get(f"{ENV_PREFIX}FLUX_VERSION", "2.1.2"), - help="Flux version (default: 2.1.2)") + default=os.environ.get(f"{ENV_PREFIX}FLUX_VERSION", "2.8.5"), + help="Flux version (default: 2.8.5)") parser.add_argument("--kustomize-version", - default=os.environ.get(f"{ENV_PREFIX}KUSTOMIZE_VERSION", "5.2.1"), - help="Kustomize version (default: 5.2.1)") + default=os.environ.get(f"{ENV_PREFIX}KUSTOMIZE_VERSION", "5.8.0"), + help="Kustomize version (default: 5.8.0)") parser.add_argument("--nexus-version", - default=os.environ.get(f"{ENV_PREFIX}NEXUS_VERSION", "3.50.0"), - help="Nexus version (default: 3.50.0)") + default=os.environ.get(f"{ENV_PREFIX}NEXUS_VERSION", "3.91.0"), + help="Nexus version (default: 3.91.0)") parser.add_argument("--prometheus-version", - default=os.environ.get(f"{ENV_PREFIX}PROMETHEUS_VERSION", "2.45.0"), - help="Prometheus version (default: 2.45.0)") + default=os.environ.get(f"{ENV_PREFIX}PROMETHEUS_VERSION", "3.5.1"), + help="Prometheus version (default: 3.5.1)") parser.add_argument("--grafana-version", - default=os.environ.get(f"{ENV_PREFIX}GRAFANA_VERSION", "10.0.0"), - help="Grafana version (default: 10.0.0)") + default=os.environ.get(f"{ENV_PREFIX}GRAFANA_VERSION", "12.4.2"), + help="Grafana version (default: 12.4.2)") parser.add_argument( "--output-dir", default=os.environ.get(f"{ENV_PREFIX}OUTPUT_DIR", "."), @@ -241,27 +241,27 @@ def generate_devcontainer_json(env_config): # Version build args if langs.get("python"): - build_args["PYTHON_VERSION"] = versions.get("python", "3.11") + build_args["PYTHON_VERSION"] = versions.get("python", "3.12") if langs.get("java"): - build_args["JAVA_VERSION"] = versions.get("java", "17") + build_args["JAVA_VERSION"] = versions.get("java", "21") if langs.get("node"): - build_args["NODE_VERSION"] = versions.get("node", "20") + build_args["NODE_VERSION"] = versions.get("node", "22") if langs.get("go"): - build_args["GO_VERSION"] = versions.get("go", "1.21") + build_args["GO_VERSION"] = versions.get("go", "1.25.0") if k8s.get("k9s"): - build_args["K9S_VERSION"] = versions.get("k9s", "0.29.1") + build_args["K9S_VERSION"] = versions.get("k9s", "0.50.16") if k8s.get("argocd_cli"): - build_args["ARGOCD_VERSION"] = versions.get("argocd", "2.8.4") + build_args["ARGOCD_VERSION"] = versions.get("argocd", "3.3.6") if k8s.get("flux"): - build_args["FLUX_VERSION"] = versions.get("flux", "2.1.2") + build_args["FLUX_VERSION"] = versions.get("flux", "2.8.5") if k8s.get("kustomize"): - build_args["KUSTOMIZE_VERSION"] = versions.get("kustomize", "5.2.1") + build_args["KUSTOMIZE_VERSION"] = versions.get("kustomize", "5.8.0") if devops.get("nexus"): - build_args["NEXUS_VERSION"] = versions.get("nexus", "3.50.0") + build_args["NEXUS_VERSION"] = versions.get("nexus", "3.91.0") if devops.get("prometheus"): - build_args["PROMETHEUS_VERSION"] = versions.get("prometheus", "2.45.0") + build_args["PROMETHEUS_VERSION"] = versions.get("prometheus", "3.5.1") if devops.get("grafana"): - build_args["GRAFANA_VERSION"] = versions.get("grafana", "10.0.0") + build_args["GRAFANA_VERSION"] = versions.get("grafana", "12.4.2") # -- extensions -------------------------------------------------------- extensions = [] From 4d866a65e65d1233fab4b046c9f8ce59eab5e907 Mon Sep 17 00:00:00 2001 From: Saravanan Gnanaguru Date: Wed, 15 Apr 2026 17:54:39 +0530 Subject: [PATCH 5/5] fix: Correct Ubuntu version format in Dockerfile --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index feb2dea..49dd509 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,5 +1,5 @@ # DevOps OS dev container (Ubuntu LTS optimized) -FROM mcr.microsoft.com/devcontainers/base:ubuntu-24.04 +FROM mcr.microsoft.com/devcontainers/base:ubuntu24.04 SHELL ["/bin/bash", "-o", "pipefail", "-c"]