Build changes: Static compile, add 1.7, add crossbuild-in-docker, etc.

* Adds support for statically building
* Adds crossbuild-in-docker
* Reworks nodeup-in-docker to just use golang image (saves time vs rebuilding image)
* Adds build rule for GCS upload
* Adds go1.7 build check
This commit is contained in:
Zach Loafman 2016-09-20 10:02:07 -07:00
parent 2869c6a07d
commit 642c68c842
6 changed files with 55 additions and 177 deletions

View File

@ -1,20 +1,35 @@
all: kops
DOCKER_REGISTRY=gcr.io/must-override/
S3_BUCKET=s3://must-override/
DOCKER_REGISTRY?=gcr.io/must-override/
S3_BUCKET?=s3://must-override/
GCS_LOCATION?=gs://must-override
GOPATH_1ST=$(shell echo ${GOPATH} | cut -d : -f 1)
UNIQUE:=$(shell date +%s)
GOVERSION=1.7
TAG=1.3
ifndef VERSION
VERSION := git-$(shell git rev-parse --short HEAD)
VERSION := git-$(shell git describe --always)
endif
# Go exports:
GO15VENDOREXPERIMENT=1
export GO15VENDOREXPERIMENT
ifdef STATIC_BUILD
CGO_ENABLED=0
export CGO_ENABLED
EXTRA_BUILDFLAGS=-installsuffix cgo
EXTRA_LDFLAGS=-s
endif
kops: gobindata
GO15VENDOREXPERIMENT=1 go install -ldflags "-X main.BuildVersion=${VERSION}" k8s.io/kops/cmd/kops/...
go install ${EXTRA_BUILDFLAGS} -ldflags "-X main.BuildVersion=${VERSION} ${EXTRA_LDFLAGS}" k8s.io/kops/cmd/kops/...
gobindata:
GO15VENDOREXPERIMENT=1 go build -o ${GOPATH_1ST}/bin/go-bindata k8s.io/kops/vendor/github.com/jteeuwen/go-bindata/go-bindata
go build ${EXTRA_BUILDFLAGS} -ldflags "${EXTRA_LDFLAGS}" -o ${GOPATH_1ST}/bin/go-bindata k8s.io/kops/vendor/github.com/jteeuwen/go-bindata/go-bindata
cd ${GOPATH_1ST}/src/k8s.io/kops; ${GOPATH_1ST}/bin/go-bindata -o upup/models/bindata.go -pkg models -prefix upup/models/ upup/models/cloudup/... upup/models/config/... upup/models/nodeup/... upup/models/proto/...
# Build in a docker container with golang 1.X
@ -29,13 +44,13 @@ check-builds-in-go17:
docker run -v ${GOPATH_1ST}/src/k8s.io/kops:/go/src/k8s.io/kops golang:1.7 make -f /go/src/k8s.io/kops/Makefile kops
codegen: gobindata
GO15VENDOREXPERIMENT=1 go install k8s.io/kops/upup/tools/generators/...
GO15VENDOREXPERIMENT=1 PATH=${GOPATH_1ST}/bin:${PATH} go generate k8s.io/kops/upup/pkg/fi/cloudup/awstasks
GO15VENDOREXPERIMENT=1 PATH=${GOPATH_1ST}/bin:${PATH} go generate k8s.io/kops/upup/pkg/fi/cloudup/gcetasks
GO15VENDOREXPERIMENT=1 PATH=${GOPATH_1ST}/bin:${PATH} go generate k8s.io/kops/upup/pkg/fi/fitasks
go install k8s.io/kops/upup/tools/generators/...
PATH=${GOPATH_1ST}/bin:${PATH} go generate k8s.io/kops/upup/pkg/fi/cloudup/awstasks
PATH=${GOPATH_1ST}/bin:${PATH} go generate k8s.io/kops/upup/pkg/fi/cloudup/gcetasks
PATH=${GOPATH_1ST}/bin:${PATH} go generate k8s.io/kops/upup/pkg/fi/fitasks
test:
GO15VENDOREXPERIMENT=1 go test k8s.io/kops/upup/pkg/... -args -v=1 -logtostderr
go test k8s.io/kops/upup/pkg/... -args -v=1 -logtostderr
godeps:
# I think strip-vendor is the workaround for 25572
@ -51,26 +66,37 @@ gofmt:
crossbuild:
mkdir -p .build/dist/
GOOS=darwin GOARCH=amd64 go build -o .build/dist/darwin/amd64/kops -ldflags "-X main.BuildVersion=${VERSION}" -v k8s.io/kops/cmd/kops/...
GOOS=linux GOARCH=amd64 go build -o .build/dist/linux/amd64/kops -ldflags "-X main.BuildVersion=${VERSION}" -v k8s.io/kops/cmd/kops/...
GOOS=darwin GOARCH=amd64 go build -a ${EXTRA_BUILDFLAGS} -o .build/dist/darwin/amd64/kops -ldflags "${EXTRA_LDFLAGS} -X main.BuildVersion=${VERSION}" k8s.io/kops/cmd/kops/...
GOOS=linux GOARCH=amd64 go build -a ${EXTRA_BUILDFLAGS} -o .build/dist/linux/amd64/kops -ldflags "${EXTRA_LDFLAGS} -X main.BuildVersion=${VERSION}" k8s.io/kops/cmd/kops/...
#GOOS=windows GOARCH=amd64 go build -o .build/dist/windows/amd64/kops -ldflags "-X main.BuildVersion=${VERSION}" -v k8s.io/kops/cmd/kops/...
kops-dist: crossbuild
crossbuild-in-docker:
docker pull golang:${GOVERSION} # Keep golang image up to date
docker run --name=kops-build-${UNIQUE} -e STATIC_BUILD=yes -e VERSION=${VERSION} -v ${GOPATH_1ST}/src/k8s.io/kops:/go/src/k8s.io/kops golang:${GOVERSION} make -f /go/src/k8s.io/kops/Makefile crossbuild
docker cp kops-build-${UNIQUE}:/go/.build .
kops-dist: crossbuild-in-docker
mkdir -p .build/dist/
(sha1sum .build/dist/darwin/amd64/kops | cut -d' ' -f1) > .build/dist/darwin/amd64/kops.sha1
(sha1sum .build/dist/linux/amd64/kops | cut -d' ' -f1) > .build/dist/linux/amd64/kops.sha1
upload: nodeup-dist kops-dist
rm -rf .build/s3
mkdir -p .build/s3/kops/${VERSION}/linux/amd64/
mkdir -p .build/s3/kops/${VERSION}/darwin/amd64/
cp .build/dist/nodeup .build/s3/kops/${VERSION}/linux/amd64/nodeup
cp .build/dist/nodeup.sha1 .build/s3/kops/${VERSION}/linux/amd64/nodeup.sha1
cp .build/dist/linux/amd64/kops .build/s3/kops/${VERSION}/linux/amd64/kops
cp .build/dist/linux/amd64/kops.sha1 .build/s3/kops/${VERSION}/linux/amd64/kops.sha1
cp .build/dist/darwin/amd64/kops .build/s3/kops/${VERSION}/darwin/amd64/kops
cp .build/dist/darwin/amd64/kops.sha1 .build/s3/kops/${VERSION}/darwin/amd64/kops.sha1
aws s3 sync --acl public-read .build/s3/ ${S3_BUCKET}
version-dist: nodeup-dist kops-dist
rm -rf .build/upload
mkdir -p .build/upload/kops/${VERSION}/linux/amd64/
mkdir -p .build/upload/kops/${VERSION}/darwin/amd64/
cp .build/dist/nodeup .build/upload/kops/${VERSION}/linux/amd64/nodeup
cp .build/dist/nodeup.sha1 .build/upload/kops/${VERSION}/linux/amd64/nodeup.sha1
cp .build/dist/linux/amd64/kops .build/upload/kops/${VERSION}/linux/amd64/kops
cp .build/dist/linux/amd64/kops.sha1 .build/upload/kops/${VERSION}/linux/amd64/kops.sha1
cp .build/dist/darwin/amd64/kops .build/upload/kops/${VERSION}/darwin/amd64/kops
cp .build/dist/darwin/amd64/kops.sha1 .build/upload/kops/${VERSION}/darwin/amd64/kops.sha1
upload: version-dist
aws s3 sync --acl public-read .build/upload/ ${S3_BUCKET}
gcs-upload: version-dist
gsutil -m rsync -r .build/upload/kops ${GCS_LOCATION}
push: nodeup-dist
scp -C .build/dist/nodeup ${TARGET}:/tmp/
@ -109,17 +135,13 @@ protokube-push: protokube-image
nodeup: nodeup-dist
nodeup-gocode: gobindata
go install -ldflags "-X main.BuildVersion=${VERSION}" k8s.io/kops/cmd/nodeup
go install ${EXTRA_BUILDFLAGS} -ldflags "${EXTRA_LDFLAGS} -X main.BuildVersion=${VERSION}" k8s.io/kops/cmd/nodeup
nodeup-builder-image:
docker build -t nodeup-builder images/nodeup-builder
nodeup-build-in-docker: nodeup-builder-image
docker run -it -e VERSION=${VERSION} -v `pwd`:/src nodeup-builder /onbuild.sh
nodeup-dist: nodeup-build-in-docker
nodeup-dist:
docker pull golang:${GOVERSION} # Keep golang image up to date
docker run --name=nodeup-build-${UNIQUE} -e STATIC_BUILD=yes -e VERSION=${VERSION} -v ${GOPATH_1ST}/src/k8s.io/kops:/go/src/k8s.io/kops golang:${GOVERSION} make -f /go/src/k8s.io/kops/Makefile nodeup-gocode
mkdir -p .build/dist
cp .build/artifacts/nodeup .build/dist/
docker cp nodeup-build-${UNIQUE}:/go/bin/nodeup .build/dist/
(sha1sum .build/dist/nodeup | cut -d' ' -f1) > .build/dist/nodeup.sha1

View File

@ -1,26 +0,0 @@
FROM golang:1.6-alpine
ARG KOPS_SRC=_src
COPY $KOPS_SRC/ /go/src/k8s.io/kops/
# KUBECTL_SOURCE: Change to kubernetes-dev/ci for CI
ARG KUBECTL_SOURCE=kubernetes-release/release
# KUBECTL_TRACK: Currently latest from KUBECTL_SOURCE. Change to latest-1.3.txt, etc. if desired.
ARG KUBECTL_TRACK=latest.txt
ARG KUBECTL_ARCH=linux/amd64
RUN apk add --no-cache --update build-base curl git mercurial --virtual .kops-deps && \
cd "${GOPATH}/src/k8s.io/kops" && make && \
MODELS=$(readlink "${GOPATH}/bin/models") && mv "${MODELS}" /usr/local/bin && rm "${GOPATH}/bin/models" && mv ${GOPATH}/bin/* /usr/local/bin && \
GITISH=$(git describe --always) && \
KUBECTL_VERSION=${KUBECTL_VERSION:-$(curl -SsL --retry 5 "https://storage.googleapis.com/${KUBECTL_SOURCE}/${KUBECTL_TRACK}")} && \
echo "=== Fetching kubectl ${KUBECTL_VERSION} ===" && \
curl -SsL --retry 5 "https://storage.googleapis.com/${KUBECTL_SOURCE}/${KUBECTL_VERSION}/${KUBECTL_ARCH}/kubectl" > /usr/local/bin/kubectl && \
chmod +x /usr/local/bin/kubectl && \
/usr/local/bin/kubectl version --client && \
cd / && rm -rf "${GOPATH}" && rm -rf /usr/local/go && rm /usr/local/bin/go-wrapper && apk del .kops-deps && \
echo "=== Built kops at ${GITISH}, fetched kubectl ${KUBECTL_VERSION} ==="
CMD "/go/bin/kops"

View File

@ -1,15 +0,0 @@
# Running Kops in Docker
The Dockerfile here is offered primarily as a way to build continuous
integration versions of `kops` until we figure out how we want to
release/package it.
To use it, e.g. (assumes your `$HOME` is correct and that `$KOPS_STATE_STORE` is correct):
```shell
$ docker build -t kops .
$ KOPS="docker run -v $HOME/.aws:/root/.aws:ro -v $HOME/.ssh:/root/.ssh:ro -v $HOME/.kube:/root/.kube -it kops kops --state=$KOPS_STATE_STORE"
```
This creates a shell variable that runs the `kops` container with `~/.aws` mounted in (for AWS credentials), `~/.ssh` mounted in (for SSH keys, for AWS specifically), and `~/.kube` mounted in (so `kubectl` can add newly created clusters).
After this, you can just use `$KOPS` where you would generally use `kops`, e.g. `$KOPS get cluster`.

View File

@ -1,77 +0,0 @@
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
readonly DOCKER_ROOT=$(dirname "${BASH_SOURCE}")
readonly GITISH="$(git describe --always)"
readonly ARCH=${BUILD_ARCH:-"linux/amd64"}
readonly NAME=${BUILD_NAME:-"ci-${GITISH}-${ARCH/\//-}"} # e.g. ci-bef7faf-linux-amd64
readonly TMPNAME="${NAME}-$(date +%s)" # e.g. ci-bef7faf-linux-amd64-12345678
readonly TAG=${BUILD_DOCKER_TAG:-"b.gcr.io/kops-ci/kops:${NAME}"}
readonly PUSH_TAG=${BUILD_PUSH_TAG:-"no"}
readonly CLEAN_TAG=${BUILD_CLEAN_TAG:-"yes"}
readonly TMPTAG="${TAG}-$(date +%s)"
readonly LINK=${BUILD_LINK:-} # Also pushes to e.g. ci-{BUILD_LINK}-linux-amd64, i.e. for "latest"
readonly SYMBOLIC_TAG=${BUILD_SYMBOLIC_TAG:-"b.gcr.io/kops-ci/kops:ci-${LINK}-${ARCH/\//-}"}
if [[ "${ARCH}" != "linux/amd64" ]]; then
echo "!!! Alternate architecture build not supported yet. !!!"
exit 1
fi
if [[ -z "${GITISH}" ]]; then
echo "!!! git hash not found, are you sure you're in a git tree and git is installed? !!!"
git config -l
exit 1
fi
echo
echo "=== Copying src to docker/_src ==="
echo
rsync -a --exclude=/docker/ "${DOCKER_ROOT}/.." "${DOCKER_ROOT}/_src"
echo
echo "=== Building at ${GITISH} for ${ARCH} ==="
echo
# Build -> $TMPTAG
docker build -t "${TMPTAG}" --build-arg "KUBECTL_ARCH=${ARCH}" --force-rm=true --rm=true --pull=true --no-cache=true "${DOCKER_ROOT}"
# Squash -> $TAG
docker create --name="${TMPNAME}" "${TMPTAG}"
docker export "${TMPNAME}" | docker import - "${TAG}"
if [[ "${PUSH_TAG}" == "yes" ]]; then
echo
echo "=== Pushing ${TAG} ==="
echo
gcloud docker push "${TAG}"
fi
if [[ -n "${LINK}" ]]; then
echo
echo "=== Pushing ${SYMBOLIC_TAG} ==="
echo
docker tag "${TAG}" "${SYMBOLIC_TAG}"
gcloud docker push "${SYMBOLIC_TAG}"
fi
echo
echo "=== Cleaning up ==="
echo
docker rm "${TMPNAME}" || true
docker rmi -f "${TMPTAG}" || true
if [[ -n "${LINK}" ]]; then
docker rmi -f "${SYMBOLIC_TAG}" || true
fi
if [[ "${CLEAN_TAG}" == "yes" ]]; then
docker rmi -f "${TAG}" || true
else
echo
echo "=== ${TAG} leaked (BUILD_CLEAN_TAG not set) ==="
echo
fi

View File

@ -1,13 +0,0 @@
FROM debian:jessie
# Install packages:
# curl (to download golang)
# git (for getting the current head)
# gcc make (for compilation)
RUN apt-get update && apt-get install --yes curl git gcc make
# Install golang
RUN curl -L https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz | tar zx -C /usr/local
ENV PATH $PATH:/usr/local/go/bin
COPY onbuild.sh /onbuild.sh

View File

@ -1,13 +0,0 @@
#!/bin/bash
mkdir -p /go
export GOPATH=/go
mkdir -p /go/src/k8s.io
ln -s /src/ /go/src/k8s.io/kops
cd /go/src/k8s.io/kops/
make nodeup-gocode
mkdir -p /src/.build/artifacts/
cp /go/bin/nodeup /src/.build/artifacts/