diff --git a/cmd/godoc/Dockerfile.prod b/cmd/godoc/Dockerfile.prod index 21fb92d8..f357b8b7 100644 --- a/cmd/godoc/Dockerfile.prod +++ b/cmd/godoc/Dockerfile.prod @@ -6,7 +6,17 @@ FROM golang:1.11 AS build RUN apt-get update && apt-get install -y \ zip # required for generate-index.bash -ENV GODOC_REF release-branch.go1.11 +# Check out the desired version of Go, both to build the godoc binary and serve +# as the goroot for content serving. +ARG GO_REF +RUN test -n "$GO_REF" # GO_REF is required. +RUN git clone --single-branch --depth=1 -b $GO_REF https://go.googlesource.com/go /goroot +RUN cd /goroot/src && ./make.bash + +ENV GOROOT /goroot +ENV PATH=/goroot/bin:$PATH + +RUN go version RUN go get -v -d \ golang.org/x/net/context \ @@ -18,11 +28,24 @@ RUN go get -v -d \ COPY . /go/src/golang.org/x/tools WORKDIR /go/src/golang.org/x/tools/cmd/godoc -RUN git clone --single-branch --depth=1 -b $GODOC_REF https://go.googlesource.com/go /docset -RUN GODOC_DOCSET=/docset ./generate-index.bash +RUN GODOC_DOCSET=/goroot ./generate-index.bash RUN go build -o /godoc -tags=golangorg golang.org/x/tools/cmd/godoc +# Clean up goroot for the final image. +RUN cd /goroot && git clean -xdf + +# Add build metadata. +ARG TOOLS_HEAD +ARG TOOLS_CLEAN +ARG DOCKER_TAG +RUN cd /goroot && echo "go repo HEAD: $(git rev-parse HEAD)" >> /goroot/buildinfo +RUN echo "requested go ref: ${GO_REF}" >> /goroot/buildinfo +RUN echo "x/tools HEAD: ${TOOLS_HEAD}" >> /goroot/buildinfo +RUN echo "x/tools clean: ${TOOLS_CLEAN}" >> /goroot/buildinfo +RUN echo "image: ${DOCKER_TAG}" >> /goroot/buildinfo + +RUN rm -rf /goroot/.git # Final image ############# @@ -33,7 +56,7 @@ WORKDIR /app COPY --from=build /godoc /app/ COPY --from=build /go/src/golang.org/x/tools/cmd/godoc/hg-git-mapping.bin /app/ -COPY --from=build /docset /goroot +COPY --from=build /goroot /goroot ENV GOROOT /goroot COPY --from=build /go/src/golang.org/x/tools/cmd/godoc/index.split.* /app/ diff --git a/cmd/godoc/Makefile b/cmd/godoc/Makefile index 217515bb..aae6b763 100644 --- a/cmd/godoc/Makefile +++ b/cmd/godoc/Makefile @@ -4,21 +4,48 @@ .PHONY: usage +GO_REF ?= release-branch.go1.11 +TOOLS_HEAD := $(shell git rev-parse HEAD) +TOOLS_CLEAN := $(shell (git status --porcelain | grep -q .) && echo dirty || echo clean) +ifeq ($(TOOLS_CLEAN),clean) + DOCKER_VERSION ?= $(TOOLS_HEAD) +else + DOCKER_VERSION ?= $(TOOLS_HEAD)-dirty +endif +GCP_PROJECT := golang-org +DOCKER_TAG := gcr.io/$(GCP_PROJECT)/godoc:$(DOCKER_VERSION) + usage: - echo "See Makefile" + echo "See Makefile and README.godoc-app" exit 1 -docker-prod: Dockerfile.prod - cd ../..; docker build -f cmd/godoc/Dockerfile.prod --tag=gcr.io/golang-org/godoc:$(VERSION) . +docker: Dockerfile.prod + # NOTE(cbro): move up in directory to include entire tools repo. + cd ../..; docker build \ + -f cmd/godoc/Dockerfile.prod \ + --build-arg GO_REF=$(GO_REF) \ + --build-arg TOOLS_HEAD=$(TOOLS_HEAD) \ + --build-arg TOOLS_CLEAN=$(TOOLS_CLEAN) \ + --build-arg DOCKER_TAG=$(DOCKER_TAG) \ + --tag=$(DOCKER_TAG) \ + . -push-prod: docker-prod - docker push gcr.io/golang-org/godoc:$(VERSION) +push: docker + docker push $(DOCKER_TAG) -deploy-prod: push-prod - gcloud -q app deploy app.prod.yaml --project golang-org --no-promote --image-url gcr.io/golang-org/godoc:$(VERSION) +deploy: push + gcloud -q app deploy app.prod.yaml \ + --project $(GCP_PROJECT) \ + --no-promote \ + --image-url $(DOCKER_TAG) get-latest-url: - @gcloud app versions list -s default --project golang-org --sort-by=~version.createTime --format='value(version.versionUrl)' --limit 1 | cut -f1 + @gcloud app versions list \ + -s default \ + --project $(GCP_PROJECT) \ + --sort-by=~version.createTime \ + --format='value(version.versionUrl)' \ + --limit 1 | cut -f1 # NOTE(cbro): gcloud prints out createTime as the second field. regtest: ./regtest.bash $(shell make get-latest-url) diff --git a/cmd/godoc/README.godoc-app b/cmd/godoc/README.godoc-app index 0bb81120..6a2ae3ea 100644 --- a/cmd/godoc/README.godoc-app +++ b/cmd/godoc/README.godoc-app @@ -37,7 +37,7 @@ Running locally, in production mode, using Docker Build the app's Docker container: - VERSION=$(git rev-parse HEAD) make docker-prod + make docker Make sure redis is running on port 6379: @@ -68,7 +68,7 @@ Deploying to golang.org Build the image, push it to gcr.io, and deploy to Flex: - VERSION=$(git rev-parse HEAD) make deploy-prod + make deploy Run regression tests: