Commit 26eac671 authored by Sam Stokes's avatar Sam Stokes Committed by GitHub

Fix docker cross-platform builds (#10827)

* Disable CGO for op-node. Test cross-platform

* Install latest gcp cli version before publishing docker image

* Add oplabs-gcr context to docker-build job so it can publish

* Do not save op-node docker image tag for devnet

* Use TARGETARCH to conditionally set CC, CXX

* Remove BUILDPLATFORM

* Fix dangling && in dockerfile

* Use apk instead of apt-get

* Install correct apk cross build packages

* Remove non-existent cross-build apk package

* Use bullseye instead of alpine

* Remove hardcoded CGO_ENABLED=0

* Set CC and CXX in makefile

* Add echo to makefile

* Remove echo from makefile

* Remove check-cross-platform test

* Remove default values for CC and CXX from makefile

* Add TARGETOS and TARGETARCH to top of dockerfile

* Remove echo from dockerfile

* Use debian TARGET_BASE_IMAGE

* Add cross platform args to all relevant Makefiles

* Add temp circle ci job to publish and check-cross-platform

* Set CGO_ENABLED=0. Use alpine for TARGET_BASE_IMAGE

* Use CMD instead of ENTRYPOINT for op-supervisor-target image

* Add CC, CXX, CGO_ENABLED args to op-plasma

* Remove CC and CXX from Makefiles

* Use alpine image for builder

* scheduled-docker-publish trigger changed to hourly or manual

* Fix circle ci config

* Fix warnings in dockerfile

* Attempt cross compile without setting CGO_ENABLED=0

* Add CGO_ENABLED=0 back for make op-node
parent 5be91416
......@@ -32,6 +32,9 @@ parameters:
sdk_dispatch:
type: boolean
default: false
docker_publish_dispatch:
type: boolean
default: false
orbs:
go: circleci/go@1.8.0
......@@ -316,7 +319,10 @@ jobs:
- run:
command: mkdir -p /tmp/docker_images
- when:
condition: "<<parameters.release>>"
condition:
or:
- "<<parameters.publish>>"
- "<<parameters.release>>"
steps:
- gcp-cli/install
- when:
......@@ -2093,7 +2099,10 @@ workflows:
scheduled-docker-publish:
when:
equal: [ build_hourly, <<pipeline.schedule.name>> ]
or:
- equal: [ build_hourly, <<pipeline.schedule.name>> ]
# Trigger on manual triggers if explicitly requested
- equal: [ true, << pipeline.parameters.docker_publish_dispatch >> ]
jobs:
- docker-build:
name: op-node-docker-publish
......@@ -2104,6 +2113,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-node-cross-platform
op_component: op-node
requires:
- op-node-docker-publish
- docker-build:
name: op-batcher-docker-publish
docker_name: op-batcher
......@@ -2113,6 +2127,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-batcher-cross-platform
op_component: op-batcher
requires:
- op-batcher-docker-publish
- docker-build:
name: op-program-docker-publish
docker_name: op-program
......@@ -2122,6 +2141,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-program-cross-platform
op_component: op-program
requires:
- op-program-docker-publish
- docker-build:
name: op-proposer-docker-publish
docker_name: op-proposer
......@@ -2131,6 +2155,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-proposer-cross-platform
op_component: op-proposer
requires:
- op-proposer-docker-publish
- docker-build:
name: op-challenger-docker-publish
docker_name: op-challenger
......@@ -2140,6 +2169,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-challenger-cross-platform
op_component: op-challenger
requires:
- op-challenger-docker-publish
- docker-build:
name: op-dispute-mon-docker-publish
docker_name: op-dispute-mon
......@@ -2149,6 +2183,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-dispute-mon-cross-platform
op_component: op-dispute-mon
requires:
- op-dispute-mon-docker-publish
- docker-build:
name: op-conductor-docker-publish
docker_name: op-conductor
......@@ -2158,6 +2197,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-conductor-cross-platform
op_component: op-conductor
requires:
- op-conductor-docker-publish
- docker-build:
name: op-heartbeat-docker-publish
docker_name: op-heartbeat
......@@ -2167,6 +2211,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-heartbeat-cross-platform
op_component: op-heartbeat
requires:
- op-heartbeat-docker-publish
- docker-build:
name: op-supervisor-docker-publish
docker_name: op-supervisor
......@@ -2176,6 +2225,11 @@ workflows:
context:
- oplabs-gcr
- slack
- check-cross-platform:
name: op-supervisor-cross-platform
op_component: op-supervisor
requires:
- op-supervisor-docker-publish
- docker-build:
name: chain-mon-docker-publish
docker_name: chain-mon
......
......@@ -26,7 +26,7 @@ variable "IMAGE_TAGS" {
variable "PLATFORMS" {
// You can override this as "linux/amd64,linux/arm64".
// Only a specify a single platform when `--load` ing into docker.
// Only 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 = ""
......
......@@ -25,7 +25,7 @@ ifeq ($(shell uname),Darwin)
endif
op-batcher:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-batcher ./cmd
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-batcher ./cmd
clean:
rm bin/op-batcher
......
......@@ -14,7 +14,7 @@ ifeq ($(shell uname),Darwin)
endif
op-challenger:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-challenger ./cmd
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-challenger ./cmd
fuzz:
go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzKeccak ./game/keccak/matrix
......
......@@ -8,7 +8,7 @@ LDFLAGSSTRING +=-X main.Version=$(VERSION)
LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
op-conductor:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-conductor ./cmd
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-conductor ./cmd
clean:
rm bin/op-conductor
......
......@@ -9,7 +9,7 @@ LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-dispute-mon/version.
LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
op-dispute-mon:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-dispute-mon ./cmd
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-dispute-mon ./cmd
.PHONY: op-dispute-mon
clean:
......
......@@ -8,7 +8,7 @@ LDFLAGSSTRING +=-X main.Version=$(VERSION)
LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
op-heartbeat:
env GO111MODULE=on go build -v $(LDFLAGS) -o ./bin/op-heartbeat ./cmd
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-heartbeat ./cmd
clean:
rm bin/op-heartbeat
......
......@@ -26,7 +26,7 @@ ifeq ($(shell uname),Darwin)
endif
op-node:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-node ./cmd/main.go
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-node ./cmd/main.go
clean:
rm bin/op-node
......
......@@ -8,7 +8,7 @@ LDFLAGSSTRING +=-X main.Version=$(VERSION)
LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
da-server:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/da-server ./cmd/daserver
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/da-server ./cmd/daserver
clean:
rm bin/da-server
......
......@@ -21,7 +21,7 @@ op-program: \
op-program-client-mips
op-program-host:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v -ldflags "$(LDFLAGSSTRING)" -o ./bin/op-program ./host/cmd/main.go
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v -ldflags "$(LDFLAGSSTRING)" -o ./bin/op-program ./host/cmd/main.go
op-program-client:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v -ldflags "$(PC_LDFLAGSSTRING)" -o ./bin/op-program-client ./client/cmd/main.go
......
......@@ -20,7 +20,7 @@ LDFLAGSSTRING +=-X main.Version=$(VERSION)
LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
op-proposer:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-proposer ./cmd
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-proposer ./cmd
clean:
rm bin/op-proposer
......
......@@ -8,9 +8,8 @@ LDFLAGSSTRING +=-X main.Version=$(VERSION)
LDFLAGSSTRING +=-X main.Meta=$(VERSION_META)
LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
op-supervisor:
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-supervisor ./cmd
env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-supervisor ./cmd
clean:
rm bin/op-supervisor
......
......@@ -4,15 +4,13 @@
# TARGETARCH
# TARGETPLATFORM
# BUILDPLATFORM
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
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
......@@ -38,102 +36,97 @@ COPY . /app
ARG GIT_COMMIT
ARG GIT_DATE
ARG TARGETOS
ARG TARGETARCH
# separate docker-builds:
# - proxyd
# - any JS/TS/smart-contract builds
# TODO: if the build involves optional CGO, then:
# 1) we may have to disable CGO explicitly
# 3) apk install cross-build gcc,
# and specify to go to use that, with the CC flag
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
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
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
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
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
FROM --platform=$BUILDPLATFORM builder AS op-node-builder
ARG OP_NODE_VERSION=v0.0.0
RUN echo TARGETOS=$TARGETOS TARGETARCH=$TARGETARCH BUILDPLATFORM=$BUILDPLATFORM TARGETPLATFORM=$TARGETPLATFORM OP_NODE_VERSION=$OP_NODE_VERSION
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
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-dispute-mon-builder
FROM --platform=$BUILDPLATFORM builder AS op-dispute-mon-builder
ARG OP_DISPUTE_MON_VERSION=v0.0.0
RUN --mount=type=cache,target=/root/.cache/go-build cd op-dispute-mon && make op-dispute-mon \
GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_DISPUTE_MON_VERSION"
FROM --platform=$BUILDPLATFORM builder as op-batcher-builder
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
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=$BUILDPLATFORM builder as op-conductor-builder
FROM --platform=$BUILDPLATFORM builder AS op-conductor-builder
ARG OP_CONDUCTOR_VERSION=v0.0.0
RUN --mount=type=cache,target=/root/.cache/go-build cd op-conductor && make op-conductor \
GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_CONDUCTOR_VERSION"
FROM --platform=$BUILDPLATFORM builder as da-server-builder
FROM --platform=$BUILDPLATFORM builder AS da-server-builder
RUN --mount=type=cache,target=/root/.cache/go-build cd op-plasma && make da-server \
GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE
FROM --platform=$BUILDPLATFORM builder as op-supervisor-builder
FROM --platform=$BUILDPLATFORM builder AS op-supervisor-builder
ARG OP_SUPERVISOR_VERSION=v0.0.0
RUN --mount=type=cache,target=/root/.cache/go-build cd op-supervisor && make op-supervisor \
GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_SUPERVISOR_VERSION"
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as cannon-target
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
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
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
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 --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-node-target
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"]
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-challenger-target
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/
......@@ -143,26 +136,26 @@ COPY --from=cannon-builder /app/cannon/bin/cannon /usr/local/bin/
ENV OP_CHALLENGER_CANNON_BIN /usr/local/bin/cannon
CMD ["op-challenger"]
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-dispute-mon-target
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE AS op-dispute-mon-target
COPY --from=op-dispute-mon-builder /app/op-dispute-mon/bin/op-dispute-mon /usr/local/bin/
CMD ["op-dispute-mon"]
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-batcher-target
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"]
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-proposer-target
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"]
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-conductor-target
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE AS op-conductor-target
COPY --from=op-conductor-builder /app/op-conductor/bin/op-conductor /usr/local/bin/
CMD ["op-conductor"]
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as da-server-target
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE AS da-server-target
COPY --from=da-server-builder /app/op-plasma/bin/da-server /usr/local/bin/
CMD ["da-server"]
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as op-supervisor-target
FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE AS op-supervisor-target
COPY --from=op-supervisor-builder /app/op-supervisor/bin/op-supervisor /usr/local/bin/
ENTRYPOINT ["op-supervisor"]
CMD ["op-supervisor"]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment