From 823392e4e30f5219be8f793c0dda6d41499016ec Mon Sep 17 00:00:00 2001 From: Eric Paris Date: Tue, 4 Aug 2015 00:45:39 -0400 Subject: [PATCH] New test and commit hook to make sure changes to Godeps are reproducable It is a pretty slow test (it downloads fresh) all of kube's Godeps, so only run it when needed in pre-commit hook. This also means that random changes to other non-kube repositories could cause travis/shippable to just randomly stop working for all PRs which touch Godeps after that moment (even though no changes have been made to Godeps by us). Examples would be things like other repos completely disappearing. Or even the directory we include disappearing in master in the remote project (even though the directory may exist at the commit we care about) This is a bugwin godep, but it is a problem we have seen happen with kube Godeps. --- .travis.yml | 1 + hack/verify-godeps.sh | 74 +++++++++++++++++++++++++++++++++++++++++++ hooks/pre-commit | 14 ++++++++ shippable.yml | 1 + 4 files changed, 90 insertions(+) create mode 100755 hack/verify-godeps.sh diff --git a/.travis.yml b/.travis.yml index dfe9cec28e..f7d3836605 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,6 +23,7 @@ script: - ./hack/verify-swagger-spec.sh - ./hack/verify-linkcheck.sh - ./hack/verify-flags-underscore.py + - ./hack/verify-godeps.sh $TRAVIS_BRANCH notifications: irc: "chat.freenode.net#kubernetes-dev" diff --git a/hack/verify-godeps.sh b/hack/verify-godeps.sh new file mode 100755 index 0000000000..cd212f0f05 --- /dev/null +++ b/hack/verify-godeps.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# Copyright 2015 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. +source "${KUBE_ROOT}/hack/lib/init.sh" + +branch="${1:-master}" +# notice this uses ... to find the first shared ancestor +if ! git diff origin/"${branch}"...HEAD | grep 'Godeps/' > /dev/null; then + exit 0 +fi + +# create a nice clean place to put our new godeps +_tmpdir="$(mktemp -d -t gopath.XXXXXX)" +function cleanup { + echo "Removing ${_tmpdir}" + rm -rf "${_tmpdir}" +} +trap cleanup EXIT + +# build the godep tool +export GOPATH="${_tmpdir}" +go get -u github.com/tools/godep 2>/dev/null +go install github.com/tools/godep 2>/dev/null +GODEP="${_tmpdir}/bin/godep" + +# fill out that nice clean place with the kube godeps +echo "Starting to download all kubernetes godeps. This takes a while" +"${GODEP}" restore +echo "Download finished" + +# copy the contents of your kube directory into the nice clean place +_kubetmp="${_tmpdir}/src/k8s.io/" +mkdir -p "${_kubetmp}" +#should create ${_kubectmp}/kubernetes +git archive --format=tar --prefix=kubernetes/ $(git write-tree) | (cd "${_kubetmp}" && tar xf -) +_kubetmp="${_kubetmp}/kubernetes" + +# destroy godeps in our COPY of the kube tree +pushd "${_kubetmp}" > /dev/null +rm -rf ./Godeps + +# for some reason the kube tree needs to be a git repo for the godep tool to run. Doesn't make sense +git init > /dev/null 2>&1 + +# recreate the Godeps using the nice clean set we just downloaded +"${GODEP}" save ./... +popd > /dev/null + +# Check for any (meaninful) differences between the godeps in the tree and this nice clean one we just built +if ! _out="$(diff -NIaupr --ignore-matching-lines='^\s*\"GoVersion\":' --ignore-matching-lines='^\s*\"Comment\":' ${KUBE_ROOT}/Godeps/ ${_kubetmp}/Godeps/)"; then + echo "Your godeps changes are not reproducable" + echo "${_out}" + exit 1 +fi + +# ex: ts=2 sw=2 et filetype=sh diff --git a/hooks/pre-commit b/hooks/pre-commit index 6b845d8913..e691fe7841 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -16,6 +16,20 @@ else fi echo "${reset}" +# Check if changes to Godeps are reproducable... +files=($(git diff --cached --name-only --diff-filter ACM | grep "Godeps")) +if [[ "${#files[@]}" -ne 0 ]]; then + echo -ne "Check if changes to Godeps are reproducable (this is pretty slow)..." + if ! OUT=$("hack/verify-godeps.sh" 2>&1); then + echo + echo "${red}${OUT}" + exit_code=1 + else + echo "${green}OK" + fi + echo "${reset}" +fi + echo -ne "Checking for files that need gofmt... " files_need_gofmt=() files=($(git diff --cached --name-only --diff-filter ACM | grep "\.go" | grep -v -e "third_party" -e "Godeps")) diff --git a/shippable.yml b/shippable.yml index 064949cf82..61ec8dd52b 100644 --- a/shippable.yml +++ b/shippable.yml @@ -33,6 +33,7 @@ install: - ./hack/verify-boilerplate.sh - ./hack/verify-description.sh - ./hack/verify-flags-underscore.py + - ./hack/verify-godeps.sh ${BASE_BRANCH} - ./hack/travis/install-std-race.sh - ./hack/verify-generated-conversions.sh - ./hack/verify-generated-deep-copies.sh