tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Definitions

⎇ 271d22804b6acb1b593942cde9bedd4f76c26517 recipes/kubectl.toml TOML · 71 lines · 3.9 KB History raw

kubectl: el vigía nuevo señaló dos inertes y esto los enciende — 46 → 44 2546f5cdf · Sergio ·

1# kubectl 1.37.0 — el cliente de Kubernetes. Entra por un hallazgo del vigía nuevo
2# (`scripts/vigia-subcomandos.py`): el catálogo tenía `kubectl-neat` y `kubectl-tree` SELLADOS y
3# **inertes**, porque los dos son subcomandos que despacha `kubectl` y `kubectl` no estaba. Es la
4# misma figura que `protoc-gen-go` sin `protoc`: cuatro indicadores en verde —contenido, sonames,
5# grafo, reproducibilidad— sobre binarios que no se pueden invocar.
6#
7# `GOFLAGS=-mod=vendor GOPROXY=off` dentro del sandbox: la fase de compile NO toca la red, usa el
8# `vendor/` y punto. `go 1.26.0` pide el `go.mod`; el corpus tiene `go` 1.26.4 ⇒ entra.
9# `GOTOOLCHAIN=local` para que Go NO se descargue otro toolchain si algún día el `go.mod` pidiera uno
10# más nuevo: eso sería red dentro del sandbox y una entrada fuera del hash.
11#
12# ⚠ **OJO CON DE DÓNDE SALE ESE `vendor/`, porque NO es el que trae el tarball.** El árbol de k8s
13# publica su propio `vendor/` curado, pero el lab corre `go mod vendor` en el FETCH —host-side, antes
14# del sandbox— siempre que haya un `go.mod`, sin mirar si el proyecto ya traía uno
15# (`takana-build::fetch::vendor_go_deps`, incondicional). Se ve en el log: `go: downloading …`
16# ANTES de la fase `configure`. O sea que el `vendor/` que se compila es el REGENERADO.
17#
18# Acá salió bien —`go.sum` pinea el contenido y la receta REPRODUCE bit a bit, verificado— pero es
19# la misma figura que el clobber del `vendor/` de Cargo, que sí tuvo que resolverse con un campo de
20# receta (`cargo_vendor_dir`). Queda anotado: si algún día una receta Go depende de un `vendor/`
21# PARCHEADO por upstream, el lab se lo va a pisar en silencio.
22#
23# ⚠ **LOS `-X` NO SON COSMÉTICOS Y UNO DE ELLOS ES UNA TRAMPA DE REPRODUCIBILIDAD.** Sin ellos
24# `kubectl version` contesta `v0.0.0-master+$Format:%H$`, que es peor que inútil: un cliente de k8s
25# NEGOCIA con el servidor por versión, y varios comandos avisan de desfase cliente/servidor
26# comparando estos valores. Los nombres y el formato son los que usa el propio `hack/lib/version.sh`
27# de upstream, para no inventar un esquema paralelo.
28#
29# El de la trampa es `buildDate`: upstream lo llena con `date -u` ⇒ **dos builds del mismo fuente
30# darían binarios distintos**, la familia exacta del sello de tiempo de nftables y del `BUILD_ID` de
31# valkey. Upstream ya previó el caso y su script respeta `SOURCE_DATE_EPOCH`; acá se hace lo mismo,
32# y el lab exporta esa variable con un valor FIJO (`1`), así que la fecha sale constante.
33#
34# `gitCommit` va pineado a mano porque el tarball de release NO trae `.git` y no hay de dónde
35# sacarlo: es el commit al que apunta el tag `v1.37.0` (el tag es ANOTADO, así que hay que resolver
36# el objeto tag → commit; quedarse con el sha del tag daría un valor que no es ningún commit).
37# `gitTreeState=clean` es verdad: se construye desde un tarball de release intacto.
38name    = "kubectl"
39version = "1.37.0"
40license = "Apache-2.0"
41
42[source]
43tarball = "https://github.com/kubernetes/kubernetes/archive/refs/tags/v1.37.0.tar.gz"
44sha256  = "956ddae3b12acc08a715aea0411a168a36d5989b3e7185deeb6bf46b7dac19cf"
45
46[build]
47compiler = "zig-cc"   # inerte (Go no usa zig); el toolchain real llega por deps.build
48target   = "x86_64-linux-musl"
49link     = "static"
50
51[deps]
52build = ["go"]
53
54[build.phases]
55configure = "true"
56compile = '''
57export GOCACHE=/tmp/gocache GOPATH=/tmp/gopath GOTOOLCHAIN=local CGO_ENABLED=0 GOFLAGS=-mod=vendor GOPROXY=off
58V=k8s.io/component-base/version
59C=k8s.io/client-go/pkg/version
60FECHA=$(date -u -d "@${SOURCE_DATE_EPOCH:-1}" +%Y-%m-%dT%H:%M:%SZ)
61COMMIT=f54c212e3a2f75d674b717a9b29052b20b60aefc
62go build -trimpath -ldflags "-buildid= -s -w \
63  -X $V.gitVersion=v1.37.0 -X $C.gitVersion=v1.37.0 \
64  -X $V.gitMajor=1 -X $C.gitMajor=1 \
65  -X $V.gitMinor=37 -X $C.gitMinor=37 \
66  -X $V.gitCommit=$COMMIT -X $C.gitCommit=$COMMIT \
67  -X $V.gitTreeState=clean -X $C.gitTreeState=clean \
68  -X $V.buildDate=$FECHA -X $C.buildDate=$FECHA" \
69  -o /out/usr/bin/kubectl ./cmd/kubectl
70'''
71install = "true"