From d21b0897a9d8d45c7c178ffd0c8713a6e1babae0 Mon Sep 17 00:00:00 2001 From: Paul Hinze Date: Fri, 19 Feb 2016 17:57:39 -0600 Subject: [PATCH] Makefile/docs: Lock in 1.6 req, doc vendored deps * Drop Go 1.5 compatibility env vars * Drop `make updatedeps` from `Makefile` and docs * Update README w/ vendored dep instructions --- BUILDING.md | 5 +--- Makefile | 32 ++++++++------------------ README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++---- scripts/build.sh | 4 ---- 4 files changed, 67 insertions(+), 34 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 3d0b528a9..fae3a9e8e 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -41,15 +41,12 @@ vagrant ssh # The current "terraform" directory is then sync'd into the gopath cd /opt/gopath/src/github.com/hashicorp/terraform/ -# Fetch dependencies -make updatedeps - # Verify unit tests pass make test # Build the release # This generates binaries for each platform and places them in the pkg folder -make release +make bin ``` After running these commands, you should have binaries for all supported diff --git a/Makefile b/Makefile index 885c77110..60ed0886d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -TEST?=$$(GO15VENDOREXPERIMENT=1 go list ./... | grep -v /vendor/) +TEST?=$$(go list ./... | grep -v /vendor/) VETARGS?=-all default: test vet @@ -19,7 +19,7 @@ quickdev: generate # changes will require a rebuild of everything, in which case the dev # target should be used. core-dev: fmtcheck generate - GO15VENDOREXPERIMENT=1 go install github.com/hashicorp/terraform + go install github.com/hashicorp/terraform # Shorthand for quickly testing the core of Terraform (i.e. "not providers") core-test: generate @@ -28,12 +28,12 @@ core-test: generate # Shorthand for building and installing just one plugin for local testing. # Run as (for example): make plugin-dev PLUGIN=provider-aws plugin-dev: fmtcheck generate - GO15VENDOREXPERIMENT=1 go install github.com/hashicorp/terraform/builtin/bins/$(PLUGIN) + go install github.com/hashicorp/terraform/builtin/bins/$(PLUGIN) mv $(GOPATH)/bin/$(PLUGIN) $(GOPATH)/bin/terraform-$(PLUGIN) # test runs the unit tests test: fmtcheck generate - TF_ACC= GO15VENDOREXPERIMENT=1 go test $(TEST) $(TESTARGS) -timeout=30s -parallel=4 + TF_ACC= go test $(TEST) $(TESTARGS) -timeout=30s -parallel=4 # testacc runs acceptance tests testacc: fmtcheck generate @@ -42,30 +42,18 @@ testacc: fmtcheck generate echo " make testacc TEST=./builtin/providers/aws"; \ exit 1; \ fi - TF_ACC=1 GO15VENDOREXPERIMENT=1 go test $(TEST) -v $(TESTARGS) -timeout 120m + TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m # testrace runs the race checker testrace: fmtcheck generate - TF_ACC= GO15VENDOREXPERIMENT=1 go test -race $(TEST) $(TESTARGS) - -# updatedeps installs all the dependencies that Terraform needs to run -# and build. -updatedeps: - go get -u github.com/mitchellh/gox - go get -u golang.org/x/tools/cmd/stringer - go list ./... \ - | xargs go list -f '{{join .Deps "\n"}}' \ - | grep -v github.com/hashicorp/terraform \ - | grep -v '/internal/' \ - | sort -u \ - | xargs go get -f -u -v + TF_ACC= go test -race $(TEST) $(TESTARGS) cover: @go tool cover 2>/dev/null; if [ $$? -eq 3 ]; then \ go get -u golang.org/x/tools/cmd/cover; \ fi - GO15VENDOREXPERIMENT=1 go test $(TEST) -coverprofile=coverage.out - GO15VENDOREXPERIMENT=1 go tool cover -html=coverage.out + go test $(TEST) -coverprofile=coverage.out + go tool cover -html=coverage.out rm coverage.out # vet runs the Go source code static analysis tool `vet` to find @@ -75,7 +63,7 @@ vet: go get golang.org/x/tools/cmd/vet; \ fi @echo "go tool vet $(VETARGS) ." - @GO15VENDOREXPERIMENT=1 go tool vet $(VETARGS) $$(ls -d */ | grep -v vendor) ; if [ $$? -eq 1 ]; then \ + @go tool vet $(VETARGS) $$(ls -d */ | grep -v vendor) ; if [ $$? -eq 1 ]; then \ echo ""; \ echo "Vet found suspicious constructs. Please check the reported constructs"; \ echo "and fix them if necessary before submitting the code for review."; \ @@ -88,7 +76,7 @@ generate: @which stringer ; if [ $$? -ne 0 ]; then \ go get -u golang.org/x/tools/cmd/stringer; \ fi - GO15VENDOREXPERIMENT=1 go generate $$(GO15VENDOREXPERIMENT=1 go list ./... | grep -v /vendor/) + go generate $$(go list ./... | grep -v /vendor/) fmt: gofmt -w . diff --git a/README.md b/README.md index d24221435..cd750a0d1 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,7 @@ If you wish to work on Terraform itself or any of its built-in providers, you'll For local dev first make sure Go is properly installed, including setting up a [GOPATH](http://golang.org/doc/code.html#GOPATH). You will also need to add `$GOPATH/bin` to your `$PATH`. Next, install the following software packages, which are needed for some dependencies: -- [Git](http://git-scm.com/) -- [Mercurial](http://mercurial.selenic.com/) - -Next, clone this repository into `$GOPATH/src/github.com/hashicorp/terraform` and run `make`. This will compile dependencies and run the tests. If this exits with exit status 0, then everything is working! +Next, using [Git](https://git-scm.com/), clone this repository into `$GOPATH/src/github.com/hashicorp/terraform`. All the necessary dependencies are either vendored or automatically installed, so you just need to type `make`. This will compile the code and then run the tests. If this exits with exit status 0, then everything is working! ```sh $ make @@ -70,6 +67,61 @@ If you're working on the core of Terraform, and only wish to rebuild that withou $ make core-dev ``` +### Dependencies + +Terraform stores its dependencies under `vendor/`, which [Go 1.6+ will automatically recognize and load](https://golang.org/cmd/go/#hdr-Vendor_Directories). We use [`godep`](https://github.com/tools/godep) to manage the vendored dependencies. + +If you're developing Terraform, there are a few tasks you might need to perform. + +#### Adding a dependency + +If you're adding a dependency. You'll need to vendor it in the same Pull Request as the code that depends on it. You should do this in a separate commit from your code, as makes PR review easier and Git history simpler to read in the future. + +Because godep captures new dependencies from the local `$GOPATH`, you first need to `godep restore` from the master branch to ensure that the only diff is your new dependency. + +Assuming your work is on a branch called `my-feature-branch`, the steps look like this: + +```bash +# Get latest master branch's dependencies staged in local $GOPATH +git checkout master +git pull +godep restore -v # flag is optional, enables verbose output + +# Capture the new dependency referenced from my-feature-branch +git checkout my-feature-branch +git rebase master +godep save ./... + +# There should now be a diff in `vendor/` with added files for your dependency, +# and a diff in Godeps/Godeps.json with metadata for your dependency. + +# Make a commit with your new dependencies added +git add -A +git commit -m "vendor: Capture new dependency upstream-pkg" + +# Push to your branch (may need -f if you rebased) +git push origin my-feature-branch +``` + +#### Updating a dependency + +If you're updating an existing dependency, godep provides a specific command to snag the newer version from your `$GOPATH`. + +```bash +# Update the dependncy to the version currently in your $GOPATH +godep update github.com/some/dependency/... + +# There should now be a diff in `vendor/` with changed files for your dependency, +# and a diff in Godeps/Godeps.json with metadata for the updated dependency. + +# Make a commit with the updated dependency +git add -A +git commit -m "vendor: Update dependency upstream-pkg to 1.4.6" + +# Push to your branch +git push origin my-feature-branch +``` + ### Acceptance Tests Terraform also has a comprehensive [acceptance test](http://en.wikipedia.org/wiki/Acceptance_testing) suite covering most of the major features of the built-in providers. diff --git a/scripts/build.sh b/scripts/build.sh index c311f8279..2e86e0eb8 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -18,16 +18,12 @@ GIT_DIRTY=$(test -n "`git status --porcelain`" && echo "+CHANGES" || true) XC_ARCH=${XC_ARCH:-"386 amd64 arm"} XC_OS=${XC_OS:-linux darwin windows freebsd openbsd solaris} -# Use vendored dependencies -export GO15VENDOREXPERIMENT=1 - # Delete the old dir echo "==> Removing old directory..." rm -f bin/* rm -rf pkg/* mkdir -p bin/ - # If its dev mode, only build for ourself if [ "${TF_DEV}x" != "x" ]; then XC_OS=$(go env GOOS)