diff --git a/.circleci/config.yml b/.circleci/config.yml index 18a00a721d..0873ac0c1e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1098,10 +1098,12 @@ jobs: command: | IMAGE_BASE_PREFIX="us-docker.pkg.dev/oplabs-tools-artifacts/images" # Load from previous docker-build job + docker load < "/tmp/workspace/op-stack-go.tar" docker load < "/tmp/workspace/op-node.tar" docker load < "/tmp/workspace/op-proposer.tar" docker load < "/tmp/workspace/op-batcher.tar" # rename to the tags that the docker-compose of the devnet expects + docker tag "$IMAGE_BASE_PREFIX/op-stack-go:<>" "$IMAGE_BASE_PREFIX/op-stack-go:devnet" docker tag "$IMAGE_BASE_PREFIX/op-node:<>" "$IMAGE_BASE_PREFIX/op-node:devnet" docker tag "$IMAGE_BASE_PREFIX/op-proposer:<>" "$IMAGE_BASE_PREFIX/op-proposer:devnet" docker tag "$IMAGE_BASE_PREFIX/op-batcher:<>" "$IMAGE_BASE_PREFIX/op-batcher:devnet" @@ -1537,35 +1539,46 @@ workflows: - op-e2e-HTTP-tests - op-e2e-ext-geth-tests - op-service-rethdb-tests + - docker-build: # just to warm up the cache (other jobs run in parallel) + name: op-stack-go-docker-build + docker_name: op-stack-go + docker_tags: <>,<> + save_image_tag: <> # for devnet later - docker-build: name: op-node-docker-build docker_name: op-node docker_tags: <>,<> + requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-batcher-docker-build docker_name: op-batcher docker_tags: <>,<> + requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-program-docker-build docker_name: op-program docker_tags: <>,<> + requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-proposer-docker-build docker_name: op-proposer docker_tags: <>,<> + requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-challenger-docker-build docker_name: op-challenger docker_tags: <>,<> + requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - docker-build: name: op-heartbeat-docker-build docker_name: op-heartbeat docker_tags: <>,<> + requires: ['op-stack-go-docker-build'] save_image_tag: <> # for devnet later - cannon-prestate: requires: ["op-stack-go-lint"] @@ -1601,6 +1614,18 @@ workflows: only: /^(proxyd|chain-mon|indexer|ci-builder|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)\/v.*/ branches: ignore: /.*/ + - docker-build: # just to warm up the cache (other jobs run in parallel) + name: op-stack-go-docker-build-release + filters: + tags: + only: /^(proxyd|chain-mon|indexer|ci-builder|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)\/v.*/ + branches: + ignore: /.*/ + docker_name: op-stack-go + docker_tags: <> + platforms: "linux/amd64,linux/arm64" + requires: + - hold - docker-build: name: op-heartbeat-release filters: @@ -1610,7 +1635,7 @@ workflows: ignore: /.*/ docker_name: op-heartbeat docker_tags: <> - requires: ['hold'] + requires: ['op-stack-go-docker-build-release'] platforms: "linux/amd64,linux/arm64" publish: true release: true @@ -1625,7 +1650,7 @@ workflows: ignore: /.*/ docker_name: op-node docker_tags: <> - requires: ['hold'] + requires: ['op-stack-go-docker-build-release'] platforms: "linux/amd64,linux/arm64" publish: true release: true @@ -1640,7 +1665,7 @@ workflows: ignore: /.*/ docker_name: op-batcher docker_tags: <> - requires: ['hold'] + requires: ['op-stack-go-docker-build-release'] platforms: "linux/amd64,linux/arm64" publish: true release: true @@ -1655,7 +1680,7 @@ workflows: ignore: /.*/ docker_name: op-proposer docker_tags: <> - requires: ['hold'] + requires: ['op-stack-go-docker-build-release'] platforms: "linux/amd64,linux/arm64" publish: true release: true @@ -1670,7 +1695,7 @@ workflows: ignore: /.*/ docker_name: op-challenger docker_tags: <> - requires: ['hold'] + requires: ['op-stack-go-docker-build-release'] platforms: "linux/amd64,linux/arm64" publish: true release: true @@ -1798,10 +1823,19 @@ workflows: when: equal: [ build_hourly, <> ] jobs: + - docker-build: # just to warm up the cache (other jobs run in parallel) + name: op-stack-go-docker-build-publish + docker_name: op-stack-go + docker_tags: <>,<> + platforms: "linux/amd64,linux/arm64" + context: + - oplabs-gcr + - slack - docker-build: name: op-node-docker-publish docker_name: op-node docker_tags: <>,<> + requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -1811,6 +1845,7 @@ workflows: name: op-batcher-docker-publish docker_name: op-batcher docker_tags: <>,<> + requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -1820,6 +1855,7 @@ workflows: name: op-program-docker-publish docker_name: op-program docker_tags: <>,<> + requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -1829,6 +1865,7 @@ workflows: name: op-proposer-docker-publish docker_name: op-proposer docker_tags: <>,<> + requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -1838,6 +1875,7 @@ workflows: name: op-challenger-docker-publish docker_name: op-challenger docker_tags: <>,<> + requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: @@ -1847,6 +1885,7 @@ workflows: name: op-heartbeat-docker-publish docker_name: op-heartbeat docker_tags: <>,<> + requires: [ 'op-stack-go-docker-build-publish' ] platforms: "linux/amd64,linux/arm64" publish: true context: diff --git a/docker-bake.hcl b/docker-bake.hcl index f865c0996d..ae8bdd84a5 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -14,10 +14,8 @@ variable "GIT_DATE" { default = "0" } -// The default version to embed in the built images. -// During CI release builds this is set to <> variable "GIT_VERSION" { - default = "v0.0.0" + default = "docker" // original default as set in proxyd file, not used by full go stack, yet } variable "IMAGE_TAGS" { @@ -29,127 +27,96 @@ variable "PLATFORMS" { // Only a specify a single platform when `--load` ing into docker. // Multi-platform is supported when outputting to disk or pushing to a registry. // Multi-platform builds can be tested locally with: --set="*.output=type=image,push=false" - default = "" + default = "linux/amd64" } -// Each of the services can have a customized version, but defaults to the global specified version. -variable "OP_NODE_VERSION" { - default = "${GIT_VERSION}" -} - -variable "OP_BATCHER_VERSION" { - default = "${GIT_VERSION}" -} - -variable "OP_PROPOSER_VERSION" { - default = "${GIT_VERSION}" -} - -variable "OP_CHALLENGER_VERSION" { - default = "${GIT_VERSION}" -} - -variable OP_HEARTBEAT_VERSION { - default = "${GIT_VERSION}" -} - -variable OP_PROGRAM_VERSION { - default = "${GIT_VERSION}" -} - -variable CANNON_VERSION { - default = "${GIT_VERSION}" -} - -target "op-node" { +target "op-stack-go" { dockerfile = "ops/docker/op-stack-go/Dockerfile" context = "." args = { GIT_COMMIT = "${GIT_COMMIT}" GIT_DATE = "${GIT_DATE}" - OP_NODE_VERSION = "${OP_NODE_VERSION}" } - target = "op-node-target" + platforms = split(",", PLATFORMS) + tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-stack-go:${tag}"] +} + +target "op-node" { + dockerfile = "Dockerfile" + context = "./op-node" + args = { + OP_STACK_GO_BUILDER = "op-stack-go" + } + contexts = { + op-stack-go: "target:op-stack-go" + } platforms = split(",", PLATFORMS) tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-node:${tag}"] } target "op-batcher" { - dockerfile = "ops/docker/op-stack-go/Dockerfile" - context = "." + dockerfile = "Dockerfile" + context = "./op-batcher" args = { - GIT_COMMIT = "${GIT_COMMIT}" - GIT_DATE = "${GIT_DATE}" - OP_BATCHER_VERSION = "${OP_BATCHER_VERSION}" + OP_STACK_GO_BUILDER = "op-stack-go" + } + contexts = { + op-stack-go: "target:op-stack-go" } - target = "op-batcher-target" platforms = split(",", PLATFORMS) tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-batcher:${tag}"] } target "op-proposer" { - dockerfile = "ops/docker/op-stack-go/Dockerfile" - context = "." + dockerfile = "Dockerfile" + context = "./op-proposer" args = { - GIT_COMMIT = "${GIT_COMMIT}" - GIT_DATE = "${GIT_DATE}" - OP_PROPOSER_VERSION = "${OP_PROPOSER_VERSION}" + OP_STACK_GO_BUILDER = "op-stack-go" + } + contexts = { + op-stack-go: "target:op-stack-go" } - target = "op-proposer-target" platforms = split(",", PLATFORMS) tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-proposer:${tag}"] } target "op-challenger" { - dockerfile = "ops/docker/op-stack-go/Dockerfile" - context = "." + dockerfile = "Dockerfile" + context = "./op-challenger" args = { - GIT_COMMIT = "${GIT_COMMIT}" - GIT_DATE = "${GIT_DATE}" - OP_CHALLENGER_VERSION = "${OP_CHALLENGER_VERSION}" + OP_STACK_GO_BUILDER = "op-stack-go" + } + contexts = { + op-stack-go: "target:op-stack-go" } - target = "op-challenger-target" platforms = split(",", PLATFORMS) tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-challenger:${tag}"] } target "op-heartbeat" { - dockerfile = "ops/docker/op-stack-go/Dockerfile" - context = "." + dockerfile = "Dockerfile" + context = "./op-heartbeat" args = { - GIT_COMMIT = "${GIT_COMMIT}" - GIT_DATE = "${GIT_DATE}" - OP_HEARTBEAT_VERSION = "${OP_HEARTBEAT_VERSION}" + OP_STACK_GO_BUILDER = "op-stack-go" + } + contexts = { + op-stack-go: "target:op-stack-go" } - target = "op-heartbeat-target" platforms = split(",", PLATFORMS) tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-heartbeat:${tag}"] } target "op-program" { - dockerfile = "ops/docker/op-stack-go/Dockerfile" - context = "." + dockerfile = "Dockerfile" + context = "./op-program" args = { - GIT_COMMIT = "${GIT_COMMIT}" - GIT_DATE = "${GIT_DATE}" - OP_PROGRAM_VERSION = "${OP_PROGRAM_VERSION}" + OP_STACK_GO_BUILDER = "op-stack-go" } - target = "op-program-target" - platforms = split(",", PLATFORMS) - tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-program:${tag}"] -} - -target "cannon" { - dockerfile = "ops/docker/op-stack-go/Dockerfile" - context = "." - args = { - GIT_COMMIT = "${GIT_COMMIT}" - GIT_DATE = "${GIT_DATE}" - CANNON_VERSION = "${CANNON_VERSION}" + contexts = { + op-stack-go: "target:op-stack-go" } - target = "cannon-target" platforms = split(",", PLATFORMS) - tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/cannon:${tag}"] + tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-program:${tag}"] } target "proxyd" { diff --git a/op-batcher/Dockerfile b/op-batcher/Dockerfile new file mode 100644 index 0000000000..6732ecc656 --- /dev/null +++ b/op-batcher/Dockerfile @@ -0,0 +1,9 @@ +ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest +FROM $OP_STACK_GO_BUILDER as builder +# See "make golang-docker" and /ops/docker/op-stack-go + +FROM alpine:3.18 + +COPY --from=builder /usr/local/bin/op-batcher /usr/local/bin/op-batcher + +CMD ["op-batcher"] diff --git a/op-batcher/Dockerfile.dockerignore b/op-batcher/Dockerfile.dockerignore new file mode 100644 index 0000000000..4f26140750 --- /dev/null +++ b/op-batcher/Dockerfile.dockerignore @@ -0,0 +1,2 @@ +# ignore everything but the dockerfile, the op-stack-go base image performs the build +* diff --git a/op-challenger/Dockerfile b/op-challenger/Dockerfile new file mode 100644 index 0000000000..ad57e2b52b --- /dev/null +++ b/op-challenger/Dockerfile @@ -0,0 +1,17 @@ +ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest +FROM $OP_STACK_GO_BUILDER as builder +# See "make golang-docker" and /ops/docker/op-stack-go + +FROM alpine:3.18 + +# Make the bundled op-program the default cannon server +COPY --from=builder /usr/local/bin/op-program /usr/local/bin/op-program +ENV OP_CHALLENGER_CANNON_SERVER /usr/local/bin/op-program + +# Make the bundled cannon the default cannon executable +COPY --from=builder /usr/local/bin/cannon /usr/local/bin/cannon +ENV OP_CHALLENGER_CANNON_BIN /usr/local/bin/cannon + +COPY --from=builder /usr/local/bin/op-challenger /usr/local/bin/op-challenger + +CMD ["op-challenger"] diff --git a/op-challenger/Dockerfile.dockerignore b/op-challenger/Dockerfile.dockerignore new file mode 100644 index 0000000000..4f26140750 --- /dev/null +++ b/op-challenger/Dockerfile.dockerignore @@ -0,0 +1,2 @@ +# ignore everything but the dockerfile, the op-stack-go base image performs the build +* diff --git a/op-heartbeat/Dockerfile b/op-heartbeat/Dockerfile new file mode 100644 index 0000000000..2e3996cde6 --- /dev/null +++ b/op-heartbeat/Dockerfile @@ -0,0 +1,9 @@ +ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest +FROM $OP_STACK_GO_BUILDER as builder +# See "make golang-docker" and /ops/docker/op-stack-go + +FROM alpine:3.18 + +COPY --from=builder /usr/local/bin/op-heartbeat /usr/local/bin/op-heartbeat + +CMD ["op-heartbeat"] diff --git a/op-heartbeat/Dockerfile.dockerignore b/op-heartbeat/Dockerfile.dockerignore new file mode 100644 index 0000000000..4f26140750 --- /dev/null +++ b/op-heartbeat/Dockerfile.dockerignore @@ -0,0 +1,2 @@ +# ignore everything but the dockerfile, the op-stack-go base image performs the build +* diff --git a/op-node/Dockerfile b/op-node/Dockerfile new file mode 100644 index 0000000000..0cd7f16d9c --- /dev/null +++ b/op-node/Dockerfile @@ -0,0 +1,9 @@ +ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest +FROM $OP_STACK_GO_BUILDER as builder +# See "make golang-docker" and /ops/docker/op-stack-go + +FROM alpine:3.18 + +COPY --from=builder /usr/local/bin/op-node /usr/local/bin/op-node + +CMD ["op-node"] diff --git a/op-node/Dockerfile.dockerignore b/op-node/Dockerfile.dockerignore new file mode 100644 index 0000000000..4f26140750 --- /dev/null +++ b/op-node/Dockerfile.dockerignore @@ -0,0 +1,2 @@ +# ignore everything but the dockerfile, the op-stack-go base image performs the build +* diff --git a/op-program/Dockerfile b/op-program/Dockerfile new file mode 100644 index 0000000000..91688b5160 --- /dev/null +++ b/op-program/Dockerfile @@ -0,0 +1,9 @@ +ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest +FROM $OP_STACK_GO_BUILDER as builder +# See "make golang-docker" and /ops/docker/op-stack-go + +FROM alpine:3.18 + +COPY --from=builder /usr/local/bin/op-program /usr/local/bin/op-program + +CMD ["op-program"] diff --git a/op-program/Dockerfile.dockerignore b/op-program/Dockerfile.dockerignore new file mode 100644 index 0000000000..4f26140750 --- /dev/null +++ b/op-program/Dockerfile.dockerignore @@ -0,0 +1,2 @@ +# ignore everything but the dockerfile, the op-stack-go base image performs the build +* diff --git a/op-proposer/Dockerfile b/op-proposer/Dockerfile new file mode 100644 index 0000000000..8eb4b7cc0e --- /dev/null +++ b/op-proposer/Dockerfile @@ -0,0 +1,9 @@ +ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest +FROM $OP_STACK_GO_BUILDER as builder +# See "make golang-docker" and /ops/docker/op-stack-go + +FROM alpine:3.18 + +COPY --from=builder /usr/local/bin/op-proposer /usr/local/bin/op-proposer + +CMD ["op-proposer"] diff --git a/op-proposer/Dockerfile.dockerignore b/op-proposer/Dockerfile.dockerignore new file mode 100644 index 0000000000..4f26140750 --- /dev/null +++ b/op-proposer/Dockerfile.dockerignore @@ -0,0 +1,2 @@ +# ignore everything but the dockerfile, the op-stack-go base image performs the build +* diff --git a/op-wheel/Dockerfile b/op-wheel/Dockerfile new file mode 100644 index 0000000000..30f7a8a371 --- /dev/null +++ b/op-wheel/Dockerfile @@ -0,0 +1,8 @@ +ARG OP_STACK_GO_BUILDER=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:latest +FROM $OP_STACK_GO_BUILDER as builder +# See "make golang-docker" and /ops/docker/op-stack-go +FROM alpine:3.18 + +COPY --from=builder /app/op-wheel/bin/op-wheel /usr/local/bin + +CMD ["op-wheel"] diff --git a/op-wheel/Dockerfile.dockerignore b/op-wheel/Dockerfile.dockerignore new file mode 100644 index 0000000000..4f26140750 --- /dev/null +++ b/op-wheel/Dockerfile.dockerignore @@ -0,0 +1,2 @@ +# ignore everything but the dockerfile, the op-stack-go base image performs the build +* diff --git a/ops-bedrock/docker-compose.yml b/ops-bedrock/docker-compose.yml index ce49b4049e..12216ab510 100644 --- a/ops-bedrock/docker-compose.yml +++ b/ops-bedrock/docker-compose.yml @@ -11,6 +11,15 @@ volumes: services: + op_stack_go_builder: # Not an actual service, but builds the prerequisite go images + build: + context: ../ + dockerfile: ops/docker/op-stack-go/Dockerfile + args: + GIT_COMMIT: "dev" + GIT_DATE: "0" + image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet + entrypoint: ["echo", "build complete"] l1: build: @@ -47,12 +56,14 @@ services: op-node: depends_on: + - op_stack_go_builder - l1 - l2 build: context: ../ - dockerfile: ops/docker/op-stack-go/Dockerfile - target: op-node-target + dockerfile: ./op-node/Dockerfile + args: + OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:devnet command: > op-node @@ -92,13 +103,15 @@ services: op-proposer: depends_on: + - op_stack_go_builder - l1 - l2 - op-node build: context: ../ - dockerfile: ops/docker/op-stack-go/Dockerfile - target: op-proposer-target + dockerfile: ./op-proposer/Dockerfile + args: + OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-proposer:devnet ports: - "6062:6060" @@ -119,13 +132,15 @@ services: op-batcher: depends_on: + - op_stack_go_builder - l1 - l2 - op-node build: context: ../ - dockerfile: ops/docker/op-stack-go/Dockerfile - target: op-batcher-target + dockerfile: ./op-batcher/Dockerfile + args: + OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:devnet ports: - "6061:6060" diff --git a/ops/docker/op-stack-go/Dockerfile b/ops/docker/op-stack-go/Dockerfile index d613debc52..87d92ca392 100644 --- a/ops/docker/op-stack-go/Dockerfile +++ b/ops/docker/op-stack-go/Dockerfile @@ -1,12 +1,3 @@ -# automatically set by buildkit, can be changed with --platform flag -ARG TARGETOS -ARG TARGETARCH - -# All target images use this as base image, and add the final build results. -# It will default to the target platform. -ARG TARGET_BASE_IMAGE=alpine:3.18 - -# We may be cross-building for another platform. Specify which platform we need as builder. FROM --platform=$BUILDPLATFORM golang:1.21.3-alpine3.18 as builder RUN apk add --no-cache make gcc musl-dev linux-headers git jq bash @@ -20,7 +11,6 @@ WORKDIR /app RUN echo "go mod cache: $(go env GOMODCACHE)" RUN echo "go build cache: $(go env GOCACHE)" -# warm-up the cache RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build go mod download # NOTE: the Dockerfile.dockerignore file effectively describes all dependencies @@ -33,92 +23,62 @@ COPY . /app ARG GIT_COMMIT ARG GIT_DATE +ARG CANNON_VERSION=v0.0.0 +ARG OP_PROGRAM_VERSION=v0.0.0 + +ARG OP_HEARTBEAT_VERSION=v0.0.0 +ARG OP_WHEEL_VERSION=v0.0.0 + +ARG OP_NODE_VERSION=v0.0.0 +ARG OP_CHALLENGER_VERSION=v0.0.0 +ARG OP_BATCHER_VERSION=v0.0.0 +ARG OP_PROPOSER_VERSION=v0.0.0 + + # separate docker-builds: # - op-exporter # - op-ufm # - proxyd # - any JS/TS/smart-contract builds +ARG TARGETOS TARGETARCH + # Build the Go services, utilizing caches and share the many common packages. # The "id" defaults to the value of "target", the cache will thus be reused during this build. # "sharing" defaults to "shared", the cache will thus be available to other concurrent docker builds. -FROM --platform=$BUILDPLATFORM builder as cannon-builder -ARG CANNON_VERSION=v0.0.0 + RUN --mount=type=cache,target=/root/.cache/go-build cd cannon && make cannon \ GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$CANNON_VERSION" - -FROM --platform=$BUILDPLATFORM builder as op-program-builder -ARG OP_PROGRAM_VERSION=v0.0.0 # note: we only build the host, that's all the user needs. No Go MIPS cross-build in docker RUN --mount=type=cache,target=/root/.cache/go-build cd op-program && make op-program-host \ GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_PROGRAM_VERSION" -FROM --platform=$BUILDPLATFORM builder as op-heartbeat-builder -ARG OP_HEARTBEAT_VERSION=v0.0.0 RUN --mount=type=cache,target=/root/.cache/go-build cd op-heartbeat && make op-heartbeat \ GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_HEARTBEAT_VERSION" - -FROM --platform=$BUILDPLATFORM builder as op-wheel-builder -ARG OP_WHEEL_VERSION=v0.0.0 RUN --mount=type=cache,target=/root/.cache/go-build cd op-wheel && make op-wheel \ GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_WHEEL_VERSION" -FROM --platform=$BUILDPLATFORM builder as op-node-builder -ARG OP_NODE_VERSION=v0.0.0 RUN --mount=type=cache,target=/root/.cache/go-build cd op-node && make op-node \ GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_NODE_VERSION" - -FROM --platform=$BUILDPLATFORM builder as op-challenger-builder -ARG OP_CHALLENGER_VERSION=v0.0.0 RUN --mount=type=cache,target=/root/.cache/go-build cd op-challenger && make op-challenger \ GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_CHALLENGER_VERSION" - -FROM --platform=$BUILDPLATFORM builder as op-batcher-builder -ARG OP_BATCHER_VERSION=v0.0.0 RUN --mount=type=cache,target=/root/.cache/go-build cd op-batcher && make op-batcher \ GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_BATCHER_VERSION" - -FROM --platform=$BUILDPLATFORM builder as op-proposer-builder -ARG OP_PROPOSER_VERSION=v0.0.0 RUN --mount=type=cache,target=/root/.cache/go-build cd op-proposer && make op-proposer \ GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_PROPOSER_VERSION" -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as cannon-target -COPY --from=cannon-builder /app/cannon/bin/cannon /usr/local/bin/ -CMD ["cannon"] - -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-program-target -COPY --from=op-program-builder /app/op-program/bin/op-program /usr/local/bin/ -CMD ["op-program"] - -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-heartbeat-target -COPY --from=op-heartbeat-builder /app/op-heartbeat/bin/op-heartbeat /usr/local/bin/ -CMD ["op-heartbeat"] - -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-wheel-target -COPY --from=op-wheel-builder /app/op-wheel/bin/op-wheel /usr/local/bin/ -CMD ["op-wheel"] +FROM alpine:3.18 -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-node-target -COPY --from=op-node-builder /app/op-node/bin/op-node /usr/local/bin/ -CMD ["op-node"] +COPY --from=builder /app/cannon/bin/cannon /usr/local/bin/ +COPY --from=builder /app/op-program/bin/op-program /usr/local/bin/ -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-challenger-target -COPY --from=op-challenger-builder /app/op-challenger/bin/op-challenger /usr/local/bin/ -# Make the bundled op-program the default cannon server -COPY --from=op-program-builder /app/op-program/bin/op-program /usr/local/bin/ -ENV OP_CHALLENGER_CANNON_SERVER /usr/local/bin/op-program -# Make the bundled cannon the default cannon executable -COPY --from=cannon-builder /app/cannon/bin/cannon /usr/local/bin/ -ENV OP_CHALLENGER_CANNON_BIN /usr/local/bin/cannon -CMD ["op-challenger"] +COPY --from=builder /app/op-heartbeat/bin/op-heartbeat /usr/local/bin/ +COPY --from=builder /app/op-wheel/bin/op-wheel /usr/local/bin/ -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-batcher-target -COPY --from=op-batcher-builder /app/op-batcher/bin/op-batcher /usr/local/bin/ -CMD ["op-batcher"] +COPY --from=builder /app/op-node/bin/op-node /usr/local/bin/ +COPY --from=builder /app/op-challenger/bin/op-challenger /usr/local/bin/ +COPY --from=builder /app/op-batcher/bin/op-batcher /usr/local/bin/ +COPY --from=builder /app/op-proposer/bin/op-proposer /usr/local/bin/ -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-proposer-target -COPY --from=op-proposer-builder /app/op-proposer/bin/op-proposer /usr/local/bin/ -CMD ["op-proposer"]