ARG ARCH=amd64 ARG GO_IMAGE_TAG FROM golang:$GO_IMAGE_TAG AS build # cloning etcd ARG REF=main RUN git clone --depth=1 https://github.com/etcd-io/etcd.git --branch=${REF} /etcd RUN go env -w GOTOOLCHAIN="go$(cat .go-version)" # inject assertions in place of gofail WORKDIR /etcd/server RUN go install golang.org/x/tools/cmd/goimports@latest RUN go get github.com/antithesishq/antithesis-sdk-go@v0.4.4 RUN for file in $(grep -rl '// gofail'); do sed -i 's|\/\/ gofail.*var \([[:alnum:]]*\) .*|assert\.Reachable("\1", nil)|' $file; goimports -w $file; done RUN go mod tidy # replace verify with antithesis WORKDIR /etcd/client/pkg/verify COPY inject/verify.patch verify.patch RUN if [ "${REF}" = "main" ]; then git apply verify.patch; fi WORKDIR /etcd/client/pkg RUN go mod tidy WORKDIR /etcd # setup go mod RUN go mod download # install instrumentor RUN go get github.com/antithesishq/antithesis-sdk-go@v0.4.4 RUN go install github.com/antithesishq/antithesis-sdk-go/tools/antithesis-go-instrumentor@a802e8810442e01d16b3e9df77d7ce3875e36e55 # v0.4.3 RUN go mod tidy # compile etcd server with instrumentor RUN mkdir /etcd_instrumented RUN `go env GOPATH`/bin/antithesis-go-instrumentor /etcd /etcd_instrumented # Remove this once antithesis fixed the bug # The instrumentor's notifier library doesn't preserve the go and toolchain directives # This makes any subsequent `go mod tidy` run remove all the directives and replaced them with one generated by the notifier folder # Updating /etcd_instrumented/notifier/go.mod with the original directives would prevent all subsequent `go mod tidy` from removing the directives # However `go mod tidy` is already invoked by the instrumentor, so it needs to be fixed as well. RUN for d in /etcd_instrumented/customer /etcd_instrumented/notifier; do \ cd ${d}; \ go mod edit -go=$(grep '^go ' /etcd/go.mod | cut -f2 -d' '); \ go mod edit -toolchain=$(grep 'toolchain ' /etcd/go.mod | cut -f2 -d' '); \ done WORKDIR /etcd_instrumented/customer # Some previous versions hardcode CGO_ENABLED=0 RUN find . -type f -exec sed -i 's/CGO_ENABLED=0/CGO_ENABLED=${CGO_ENABLED}/' {} + # Some previous versions explicitly need gobin, which could no longer be installed with go get RUN go install github.com/myitcv/gobin@v0.0.14 # 3.4.0 has vendoring. need to do this after instrumentation or else build fails RUN if [ -d "vendor" ]; then go mod vendor; fi # The instrumentation adds code and packages. Need go mod tidy for all modules before building RUN for d in server etcdutl etcdctl; do \ (cd ${d} && go mod tidy || true); \ done # The instrumentation also adds a new main file which clashes with dummy.go found in non release-3.4 branches RUN if [ -f "dummy.go" ]; then sed -i 's/package main_test/package main/' dummy.go; fi RUN CGO_ENABLED=1 GO_GCFLAGS="all=-N -l" make build RUN go install github.com/go-delve/delve/cmd/dlv@latest FROM ubuntu:24.04 COPY --from=build /go/bin/dlv /bin/dlv COPY --from=build /etcd_instrumented/ /etcd # Move symbols to /symbols directory https://antithesis.com/docs/instrumentation/#symbolization RUN mv /etcd/symbols /symbols EXPOSE 2379 2380 CMD ["/etcd/customer/bin/etcd"]