Skip to content

Commit 3863a0f

Browse files
committed
build for multiple platforms only in CI, add s390x
Developers should not be forced to build for all platforms by default. We also don't want to copy-and-paste the go invocation for each new platform. To address both, the target platform(s) are now configurable via BUILD_PLATFORMS and additional platforms are only enabled in the Prow CI. For now this serves as a test that the source actually compiles for multiple platforms. Building images for different target platforms is a different problem.
1 parent 8322a7d commit 3863a0f

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

Diff for: build.make

+14-7
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,25 @@ else
6060
TESTARGS =
6161
endif
6262

63-
ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH))
64-
6563
# Specific packages can be excluded from each of the tests below by setting the *_FILTER_CMD variables
6664
# to something like "| grep -v 'github.com/kubernetes-csi/project/pkg/foobar'". See usage below.
6765

66+
# BUILD_PLATFORMS contains a set of <os> <arch> <suffix> triplets,
67+
# separated by semicolon. An empty variable or empty entry (= just a
68+
# semicolon) builds for the default platform of the current Go
69+
# toolchain.
70+
BUILD_PLATFORMS =
71+
72+
# This builds each command (= the sub-directories of ./cmd) for the target platform(s)
73+
# defined by BUILD_PLATFORMS.
6874
build-%: check-go-version-go
6975
mkdir -p bin
70-
CGO_ENABLED=0 GOOS=linux go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$*
71-
if [ "$$ARCH" = "amd64" ]; then \
72-
CGO_ENABLED=0 GOOS=windows go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \
73-
CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*-ppc64le ./cmd/$* ; \
74-
fi
76+
echo '$(BUILD_PLATFORMS)' | tr ';' '\n' | while read -r os arch suffix; do \
77+
if ! (set -x; CGO_ENABLED=0 GOOS="$$os" GOARCH="$$arch" go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o "./bin/$*$$suffix" ./cmd/$*); then \
78+
echo "Building $* for GOOS=$$os GOARCH=$$arch failed, see error(s) above."; \
79+
exit 1; \
80+
fi; \
81+
done
7582

7683
container-%: build-%
7784
docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) .

Diff for: prow.sh

+3-1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ get_versioned_variable () {
8585
echo "$value"
8686
}
8787

88+
configvar CSI_PROW_BUILD_PLATFORMS "linux amd64; windows amd64 .exe; linux ppc64le -ppc64le; linux s390x -s390x" "Go target platforms (= GOOS + GOARCH) and file suffix of the resulting binaries"
89+
8890
# If we have a vendor directory, then use it. We must be careful to only
8991
# use this for "make" invocations inside the project's repo itself because
9092
# setting it globally can break other go usages (like "go get <some command>"
@@ -1026,7 +1028,7 @@ main () {
10261028
images=
10271029
if ${CSI_PROW_BUILD_JOB}; then
10281030
# A successful build is required for testing.
1029-
run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make all' failed"
1031+
run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" "BUILD_PLATFORMS=${CSI_PROW_BUILD_PLATFORMS}" || die "'make all' failed"
10301032
# We don't want test failures to prevent E2E testing below, because the failure
10311033
# might have been minor or unavoidable, for example when experimenting with
10321034
# changes in "release-tools" in a PR (that fails the "is release-tools unmodified"

0 commit comments

Comments
 (0)