|
| 1 | +FROM docker.io/alpine:3.23 |
| 2 | + |
| 3 | +# Set versions and checksums |
| 4 | +ENV \ |
| 5 | + HELM_VERSION=3.19.5 \ |
| 6 | + HELM_GPG_KEYS="672C657BE06B4B30969C4A57461449C25E36B98E F1261BDE929012C8FF2E501D6EA5D7598529A53E 967F8AC5E2216F9F4FD270AD92AA783CBAAE8E3B 76939899B137D575D3274E756DCCB9D752D35BA8 49D09C86C3DC8DA3F0A076221EF612347F8A9958 ABA2529598F6626C420D335B62F49E747D911B60 4AB45F1CB0D292975C6371436E2A23D806B6E6DD 208DD36ED5BB3745A16743A4C7C6FBB5B91C1155 7FEC81FACC7FFB2A010ADD13C2D40F4D8196E874" \ |
| 7 | + KUBECTL_VERSION=1.33.7 \ |
| 8 | + SOPS_VERSION=3.11.0 \ |
| 9 | + VALS_VERSION=0.43.1 \ |
| 10 | + VALS_CHECKSUM_X86_64=50403f8a13d534b7bd1392d3228b5785cad342b4c8819b39c075f132680afece \ |
| 11 | + VALS_CHECKSUM_AARCH64=16e55cefa2e6ae016e12c39fad6361695221dece97e8046615ac002d692cde22 \ |
| 12 | + HELM_SECRETS_VERSION=4.7.5 \ |
| 13 | + HELM_SECRETS_CHECKSUM=f1e332f159e67100612815dcb8773ea46ae75a682fcf058c29bd300581fe2401 \ |
| 14 | + CURL_VERSION=8.18.0 \ |
| 15 | + CURL_CHECKSUM_X86_64=35d3377193d67b4e0aa0931da4f443c8fccfa26d889e2f40457220afedfc9d7c \ |
| 16 | + CURL_CHECKSUM_AARCH64=1e9bf12c523254a54b79d07cdb621aa0830509a82646fe8be13340a03fcbbd05 |
| 17 | + |
| 18 | +# Install some system packages |
| 19 | +RUN set -x \ |
| 20 | + && mkdir -p /gitops-tools/helm-plugins \ |
| 21 | + && apk add --no-cache gnupg ca-certificates cosign \ |
| 22 | + ; |
| 23 | + |
| 24 | +# Install Helm and validate the release is signed by a trusted releaser |
| 25 | +# Use Helm's KEYS file as the key source but only import the trusted keys from $HELM_GPG_KEYS |
| 26 | +RUN set -x \ |
| 27 | + && if [ "$(uname -m)" = "x86_64" ] ; then \ |
| 28 | + ARCH="amd64"; \ |
| 29 | + elif [ "$(uname -m)" = "aarch64" ]; then \ |
| 30 | + ARCH="arm64"; \ |
| 31 | + fi \ |
| 32 | + && IMPORT_GPG="$(mktemp -d)" \ |
| 33 | + && HELM_GPG="$(mktemp -d)" \ |
| 34 | + && wget --no-verbose "https://raw.githubusercontent.com/helm/helm/main/KEYS" -O /tmp/helm-KEYS \ |
| 35 | + && gpg --homedir "${IMPORT_GPG}" --import /tmp/helm-KEYS \ |
| 36 | + && for key in ${HELM_GPG_KEYS}; do gpg --homedir "${IMPORT_GPG}" --export "${key}" | gpg --homedir "${HELM_GPG}" --import; done \ |
| 37 | + && wget --no-verbose "https://get.helm.sh/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz" -O /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz \ |
| 38 | + && wget --no-verbose "https://get.helm.sh/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.sha256" -O /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.sha256 \ |
| 39 | + && wget --no-verbose "https://github.com/helm/helm/releases/download/v${HELM_VERSION}/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.asc" -O /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.asc \ |
| 40 | + && wget --no-verbose "https://github.com/helm/helm/releases/download/v${HELM_VERSION}/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.sha256.asc " -O /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.sha256.asc \ |
| 41 | + && echo "$(cat /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.sha256) /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz" | sha256sum -c - \ |
| 42 | + && gpg --batch --homedir "${HELM_GPG}" --no-default-keyring --verify /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.asc /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz \ |
| 43 | + && gpg --batch --homedir "${HELM_GPG}" --no-default-keyring --verify /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.sha256.asc /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz.sha256 \ |
| 44 | + && tar -C /gitops-tools -zxf /tmp/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz --strip-components 1 linux-${ARCH}/helm \ |
| 45 | + && chmod +x /gitops-tools/helm \ |
| 46 | + && rm -rf /tmp/* \ |
| 47 | + ; |
| 48 | + |
| 49 | +# Install kubectl and verify with cosign |
| 50 | +RUN set -x \ |
| 51 | + && if [ "$(uname -m)" = "x86_64" ] ; then \ |
| 52 | + ARCH="amd64"; \ |
| 53 | + elif [ "$(uname -m)" = "aarch64" ]; then \ |
| 54 | + ARCH="arm64"; \ |
| 55 | + fi \ |
| 56 | + && wget --no-verbose "https://dl.k8s.io/release/v${KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl" -O /gitops-tools/kubectl \ |
| 57 | + && wget --no-verbose "https://dl.k8s.io/release/v${KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl.sha256" -O /tmp/kubectl.sha256 \ |
| 58 | + && wget --no-verbose "https://dl.k8s.io/release/v${KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl.sig" -O /tmp/kubectl.sig \ |
| 59 | + && wget --no-verbose "https://dl.k8s.io/release/v${KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl.cert" -O /tmp/kubectl.cert \ |
| 60 | + && (cd /gitops-tools; echo "$(cat /tmp/kubectl.sha256) kubectl" | sha256sum -c -) \ |
| 61 | + && cosign verify-blob "/gitops-tools/kubectl" \ |
| 62 | + --signature "/tmp/kubectl.sig" \ |
| 63 | + --certificate "/tmp/kubectl.cert" \ |
| 64 | + --certificate-identity krel-staging@k8s-releng-prod.iam.gserviceaccount.com \ |
| 65 | + --certificate-oidc-issuer https://accounts.google.com \ |
| 66 | + && chmod +x /gitops-tools/kubectl \ |
| 67 | + && rm -rf /tmp/* \ |
| 68 | + ; |
| 69 | + |
| 70 | +# Install SOPS and verify with cosign |
| 71 | +RUN set -x \ |
| 72 | + && if [ "$(uname -m)" = "x86_64" ] ; then \ |
| 73 | + ARCH="amd64"; \ |
| 74 | + elif [ "$(uname -m)" = "aarch64" ]; then \ |
| 75 | + ARCH="arm64"; \ |
| 76 | + fi \ |
| 77 | + && wget --no-verbose "https://github.com/getsops/sops/releases/download/v${SOPS_VERSION}/sops-v${SOPS_VERSION}.linux.${ARCH}" -O /tmp/sops-v${SOPS_VERSION}.linux.${ARCH} \ |
| 78 | + && wget --no-verbose "https://github.com/getsops/sops/releases/download/v${SOPS_VERSION}/sops-v${SOPS_VERSION}.checksums.txt" -O /tmp/sops-v${SOPS_VERSION}.checksums.txt \ |
| 79 | + && wget --no-verbose "https://github.com/getsops/sops/releases/download/v${SOPS_VERSION}/sops-v${SOPS_VERSION}.checksums.pem" -O /tmp/sops-v${SOPS_VERSION}.checksums.pem \ |
| 80 | + && wget --no-verbose "https://github.com/getsops/sops/releases/download/v${SOPS_VERSION}/sops-v${SOPS_VERSION}.checksums.sig" -O /tmp/sops-v${SOPS_VERSION}.checksums.sig \ |
| 81 | + && (cd /tmp; grep "sops-v${SOPS_VERSION}.linux.${ARCH}" /tmp/sops-v${SOPS_VERSION}.checksums.txt | sha256sum -c -) \ |
| 82 | + && cosign verify-blob "/tmp/sops-v${SOPS_VERSION}.checksums.txt" \ |
| 83 | + --certificate "/tmp/sops-v${SOPS_VERSION}.checksums.pem" \ |
| 84 | + --signature "/tmp/sops-v${SOPS_VERSION}.checksums.sig" \ |
| 85 | + --certificate-identity-regexp="https://github.com/getsops" \ |
| 86 | + --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \ |
| 87 | + && mv /tmp/sops-v${SOPS_VERSION}.linux.${ARCH} /gitops-tools/sops \ |
| 88 | + && chmod +x /gitops-tools/sops \ |
| 89 | + && rm -rf /tmp/* \ |
| 90 | + ; |
| 91 | + |
| 92 | +# Install helm vals and verify with checksum |
| 93 | +RUN set -x \ |
| 94 | + && if [ "$(uname -m)" = "x86_64" ] ; then \ |
| 95 | + VALS_CHECKSUM="${VALS_CHECKSUM_X86_64}"; \ |
| 96 | + ARCH="amd64"; \ |
| 97 | + elif [ "$(uname -m)" = "aarch64" ]; then \ |
| 98 | + VALS_CHECKSUM="${VALS_CHECKSUM_AARCH64}"; \ |
| 99 | + ARCH="arm64"; \ |
| 100 | + fi \ |
| 101 | + && wget --no-verbose "https://github.com/helmfile/vals/releases/download/v${VALS_VERSION}/vals_${VALS_VERSION}_linux_${ARCH}.tar.gz" -O /tmp/vals_v${VALS_VERSION}_linux_${ARCH}.tar.gz \ |
| 102 | + && (cd /tmp; echo "${VALS_CHECKSUM} vals_v${VALS_VERSION}_linux_${ARCH}.tar.gz" | sha256sum -c -) \ |
| 103 | + && tar -C /gitops-tools -zxf /tmp/vals_v${VALS_VERSION}_linux_${ARCH}.tar.gz vals \ |
| 104 | + && chmod +x /gitops-tools/vals \ |
| 105 | + && rm -rf /tmp/* \ |
| 106 | + ; |
| 107 | + |
| 108 | +# Install helm-secrets plugin |
| 109 | +RUN set -x \ |
| 110 | + && wget --no-verbose "https://github.com/jkroepke/helm-secrets/releases/download/v${HELM_SECRETS_VERSION}/helm-secrets.tar.gz" -O /tmp/helm-secrets.tar.gz \ |
| 111 | + && (cd /tmp; echo "${HELM_SECRETS_CHECKSUM} helm-secrets.tar.gz" | sha256sum -c -) \ |
| 112 | + && tar -C /gitops-tools/helm-plugins -zxf /tmp/helm-secrets.tar.gz \ |
| 113 | + && rm -rf /tmp/* \ |
| 114 | + ; |
| 115 | + |
| 116 | +# Install static curl |
| 117 | +RUN set -x \ |
| 118 | + && if [ "$(uname -m)" = "x86_64" ] ; then \ |
| 119 | + CURL_CHECKSUM="${CURL_CHECKSUM_X86_64}"; \ |
| 120 | + ARCH="x86_64"; \ |
| 121 | + elif [ "$(uname -m)" = "aarch64" ]; then \ |
| 122 | + CURL_CHECKSUM="${CURL_CHECKSUM_AARCH64}"; \ |
| 123 | + ARCH="aarch64"; \ |
| 124 | + fi \ |
| 125 | + && wget --no-verbose "https://github.com/stunnel/static-curl/releases/download/${CURL_VERSION}/curl-linux-${ARCH}-musl-${CURL_VERSION}.tar.xz" -O /tmp/curl-linux-${ARCH}-musl-${CURL_VERSION}.tar.xz \ |
| 126 | + && tar -C /gitops-tools -Jxf /tmp/curl-linux-${ARCH}-musl-${CURL_VERSION}.tar.xz curl \ |
| 127 | + && (cd /gitops-tools; echo "${CURL_CHECKSUM} curl" | sha256sum -c -) \ |
| 128 | + && chmod +x /gitops-tools/curl \ |
| 129 | + ; |
| 130 | + |
| 131 | +# Add some env vars |
| 132 | +ENV \ |
| 133 | + PATH="/gitops-tools:${PATH}" \ |
| 134 | + HELM_PLUGINS=/gitops-tools/helm-plugins/ \ |
| 135 | + HELM_SECRETS_CURL_PATH=/gitops-tools/curl \ |
| 136 | + HELM_SECRETS_SOPS_PATH=/gitops-tools/sops \ |
| 137 | + HELM_SECRETS_VALS_PATH=/gitops-tools/vals \ |
| 138 | + HELM_SECRETS_HELM_PATH=/gitops-tools/helm \ |
| 139 | + HELM_SECRETS_KUBECTL_PATH=/gitops-tools/kubectl \ |
| 140 | + HELM_SECRETS_BACKEND=sops \ |
| 141 | + HELM_SECRETS_VALUES_ALLOW_SYMLINKS="false" \ |
| 142 | + HELM_SECRETS_VALUES_ALLOW_ABSOLUTE_PATH="true" \ |
| 143 | + HELM_SECRETS_VALUES_ALLOW_PATH_TRAVERSAL="false" \ |
| 144 | + HELM_SECRETS_WRAPPER_ENABLED="true" \ |
| 145 | + HELM_SECRETS_DECRYPT_SECRETS_IN_TMP_DIR="true" |
0 commit comments