| 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)" |
| |
| # Replacing math/rand with etcd's antithesis-sdk-go/random wrapper |
| # See https://antithesis.com/docs/configuration/the_antithesis_environment/?sid=8fce.35&sterm=random&marks=Random#random-devices |
| WORKDIR /etcd |
| COPY pkg /etcd/tests/antithesis/pkg |
| RUN find . -path "./tests/antithesis" -prune -type f -o -name 'go.mod' -type f -execdir go mod edit -replace=math/rand=$(git rev-parse --show-toplevel)/tests/antithesis/pkg/rand \; |
| RUN find . -path "./tests/antithesis" -prune -type f -o -name 'go.mod' -type f -execdir go mod edit -replace=math/rand/v2=$(git rev-parse --show-toplevel)/tests/antithesis/pkg/rand/v2 \; |
| RUN find . -name 'go.mod' -type f -execdir go mod tidy \; |
| |
| ## 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.7.2 |
| 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 |
| COPY server/inject/* . |
| RUN if [ "${REF}" = "main" ]; then git apply *.patch; fi |
| WORKDIR /etcd/client/pkg |
| RUN go mod tidy |
| WORKDIR /etcd/server |
| 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.7.2 |
| RUN go install github.com/antithesishq/antithesis-sdk-go/tools/antithesis-go-instrumentor@v0.7.2 |
| 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"] |