diff --git a/.travis.yml b/.travis.yml index 71a2d457d..3acae29f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ before_deploy: sudo -E apt-get -yq update; sudo -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install docker-ce=${DOCKER_VERSION}*; docker version; - make image; + make build-image; if [ "$TRAVIS_TAG" ]; then make release-packages; fi; diff --git a/Makefile b/Makefile index 47a73dbea..7b7ac2fe3 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,22 @@ -.PHONY: all docs docs-serve clear-static +.PHONY: all docs docs-serve + +SRCS = $(shell git ls-files '*.go' | grep -v '^vendor/') + +TAG_NAME := $(shell git tag -l --contains HEAD) +SHA := $(shell git rev-parse HEAD) +VERSION_GIT := $(if $(TAG_NAME),$(TAG_NAME),$(SHA)) +VERSION := $(if $(VERSION),$(VERSION),$(VERSION_GIT)) + +BIND_DIR := "dist" + +GIT_BRANCH := $(subst heads/,,$(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)) +TRAEFIK_DEV_IMAGE := traefik-dev$(if $(GIT_BRANCH),:$(subst /,-,$(GIT_BRANCH))) + +REPONAME := $(shell echo $(REPO) | tr '[:upper:]' '[:lower:]') +TRAEFIK_IMAGE := $(if $(REPONAME),$(REPONAME),"containous/traefik") + +INTEGRATION_OPTS := $(if $(MAKE_DOCKER_HOST),-e "DOCKER_HOST=$(MAKE_DOCKER_HOST)", -e "TEST_CONTAINER=1" -v "/var/run/docker.sock:/var/run/docker.sock") +DOCKER_BUILD_ARGS := $(if $(DOCKER_VERSION), "--build-arg=DOCKER_VERSION=$(DOCKER_VERSION)",) TRAEFIK_ENVS := \ -e OS_ARCH_ARG \ @@ -11,93 +29,33 @@ TRAEFIK_ENVS := \ -e CI \ -e CONTAINER=DOCKER # Indicator for integration tests that we are running inside a container. -SRCS = $(shell git ls-files '*.go' | grep -v '^vendor/') - -TAG_NAME := $(shell git tag -l --contains HEAD) -SHA := $(shell git rev-parse HEAD) -VERSION_GIT := $(if $(TAG_NAME),$(TAG_NAME),$(SHA)) -VERSION := $(if $(VERSION),$(VERSION),$(VERSION_GIT)) - -BIND_DIR := "dist" TRAEFIK_MOUNT := -v "$(CURDIR)/$(BIND_DIR):/go/src/github.com/containous/traefik/$(BIND_DIR)" - -GIT_BRANCH := $(subst heads/,,$(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)) -TRAEFIK_DEV_IMAGE := traefik-dev$(if $(GIT_BRANCH),:$(subst /,-,$(GIT_BRANCH))) -REPONAME := $(shell echo $(REPO) | tr '[:upper:]' '[:lower:]') -TRAEFIK_IMAGE := $(if $(REPONAME),$(REPONAME),"containous/traefik") -INTEGRATION_OPTS := $(if $(MAKE_DOCKER_HOST),-e "DOCKER_HOST=$(MAKE_DOCKER_HOST)", -e "TEST_CONTAINER=1" -v "/var/run/docker.sock:/var/run/docker.sock") - -DOCKER_BUILD_ARGS := $(if $(DOCKER_VERSION), "--build-arg=DOCKER_VERSION=$(DOCKER_VERSION)",) DOCKER_RUN_OPTS := $(TRAEFIK_ENVS) $(TRAEFIK_MOUNT) "$(TRAEFIK_DEV_IMAGE)" DOCKER_RUN_TRAEFIK := docker run $(INTEGRATION_OPTS) -it $(DOCKER_RUN_OPTS) DOCKER_RUN_TRAEFIK_NOTTY := docker run $(INTEGRATION_OPTS) -i $(DOCKER_RUN_OPTS) -print-%: ; @echo $*=$($*) +PRE_TARGET ?= build-dev-image default: binary -all: generate-webui build ## validate all checks, build linux binary, run all tests\ncross non-linux binaries - $(DOCKER_RUN_TRAEFIK) ./script/make.sh - -binary: generate-webui build ## build the linux binary - $(DOCKER_RUN_TRAEFIK) ./script/make.sh generate binary - -crossbinary-default: generate-webui build - $(DOCKER_RUN_TRAEFIK_NOTTY) ./script/make.sh generate crossbinary-default - -crossbinary-default-parallel: - $(MAKE) generate-webui - $(MAKE) build crossbinary-default - -test: build ## run the unit and integration tests - $(DOCKER_RUN_TRAEFIK) ./script/make.sh generate test-unit binary test-integration - -test-unit: build ## run the unit tests - $(DOCKER_RUN_TRAEFIK) ./script/make.sh generate test-unit - -test-integration: build ## run the integration tests - $(DOCKER_RUN_TRAEFIK) ./script/make.sh generate binary test-integration - TEST_HOST=1 ./script/make.sh test-integration - -validate: build ## validate code, vendor - $(DOCKER_RUN_TRAEFIK) ./script/make.sh generate validate-lint validate-misspell validate-vendor - -build: dist +## Build Dev Docker image +build-dev-image: dist docker build $(DOCKER_BUILD_ARGS) -t "$(TRAEFIK_DEV_IMAGE)" -f build.Dockerfile . -build-no-cache: dist +## Build Dev Docker image without cache +build-dev-image-no-cache: dist docker build --no-cache -t "$(TRAEFIK_DEV_IMAGE)" -f build.Dockerfile . -shell: build ## start a shell inside the build env - $(DOCKER_RUN_TRAEFIK) /bin/bash - -image-dirty: binary ## build a docker traefik image - docker build -t $(TRAEFIK_IMAGE) . - -image: clear-static binary ## clean up static directory and build a docker traefik image - docker build -t $(TRAEFIK_IMAGE) . - -docs: - make -C ./docs docs - -docs-serve: - make -C ./docs docs-serve - +## Create the "dist" directory dist: mkdir dist -run-dev: - go generate - go build ./cmd/traefik - ./traefik - -clear-static: - rm -rf static - -build-webui: +## Build WebUI Docker image +build-webui-image: docker build -t traefik-webui -f webui/Dockerfile webui -generate-webui: build-webui +## Generate WebUI +generate-webui: build-webui-image if [ ! -d "static" ]; then \ mkdir -p static; \ docker run --rm -v "$$PWD/static":'/src/static' traefik-webui npm run build; \ @@ -105,29 +63,76 @@ generate-webui: build-webui echo 'For more informations show `webui/readme.md`' > $$PWD/static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md; \ fi -generate-crd: - ./script/update-generated-crd-code.sh +## Build the linux binary +binary: generate-webui $(PRE_TARGET) + $(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK)) ./script/make.sh generate binary -lint: - script/validate-lint +## Build the binary for the standard plaforms (linux, darwin, windows) +crossbinary-default: generate-webui build-dev-image + $(DOCKER_RUN_TRAEFIK_NOTTY) ./script/make.sh generate crossbinary-default -fmt: - gofmt -s -l -w $(SRCS) +## Build the binary for the standard plaforms (linux, darwin, windows) in parallel +crossbinary-default-parallel: + $(MAKE) generate-webui + $(MAKE) build-dev-image crossbinary-default +## Run the unit and integration tests +test: build-dev-image + $(DOCKER_RUN_TRAEFIK) ./script/make.sh generate test-unit binary test-integration + +## Run the unit tests +test-unit: $(PRE_TARGET) + $(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK)) ./script/make.sh generate test-unit + +## Pull all images for integration tests pull-images: grep --no-filename -E '^\s+image:' ./integration/resources/compose/*.yml | awk '{print $$2}' | sort | uniq | xargs -P 6 -n 1 docker pull +## Run the integration tests +test-integration: $(PRE_TARGET) + $(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK),TEST_CONTAINER=1) ./script/make.sh generate binary test-integration + TEST_HOST=1 ./script/make.sh test-integration + +## Validate code, vendor +validate: $(PRE_TARGET) + $(if $(PRE_TARGET),$(DOCKER_RUN_TRAEFIK)) ./script/make.sh generate validate-lint validate-misspell validate-vendor + +## Clean up static directory and build a Docker Traefik image +build-image: binary + rm -rf static + docker build -t $(TRAEFIK_IMAGE) . + +## Build a Docker Traefik image +build-image-dirty: binary + docker build -t $(TRAEFIK_IMAGE) . + +## Start a shell inside the build env +shell: build-dev-image + $(DOCKER_RUN_TRAEFIK) /bin/bash + +## Build documentation site +docs: + make -C ./docs docs + +## Serve the documentation site localy +docs-serve: + make -C ./docs docs-serve + +## Generate CRD clientset +generate-crd: + ./script/update-generated-crd-code.sh + +## Download dependencies dep-ensure: dep ensure -v ./script/prune-dep.sh +## Clean vendor directory dep-prune: ./script/prune-dep.sh -help: ## this help - @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) - -release-packages: generate-webui build +## Create packages for the release +release-packages: generate-webui build-dev-image rm -rf dist $(DOCKER_RUN_TRAEFIK_NOTTY) goreleaser release --skip-publish $(DOCKER_RUN_TRAEFIK_NOTTY) tar cfz dist/traefik-${VERSION}.src.tar.gz \ @@ -138,3 +143,12 @@ release-packages: generate-webui build --exclude .github \ --exclude dist . $(DOCKER_RUN_TRAEFIK_NOTTY) chown -R $(shell id -u):$(shell id -g) dist/ + +## Format the Code +fmt: + gofmt -s -l -w $(SRCS) + +run-dev: + go generate + go build ./cmd/traefik + ./traefik diff --git a/docs/content/contributing/building-testing.md b/docs/content/contributing/building-testing.md index 225d0649b..1a399f408 100644 --- a/docs/content/contributing/building-testing.md +++ b/docs/content/contributing/building-testing.md @@ -43,6 +43,19 @@ $ ls dist/ traefik* ``` +The following targets can be executed outside Docker (we don't recommend that): + +- `test-unit` +- `test-integration` +- `validate` +- `binary` (the webUI is still generated by using Docker) + +ex: + +```bash +PRE_TARGET= make test-unit +``` + ### Method 2: Using `go` You need `go` v1.9+. diff --git a/script/.validate b/script/.validate index 42b4cc70c..c8c87e3bc 100644 --- a/script/.validate +++ b/script/.validate @@ -5,14 +5,9 @@ if [ -z "${VALIDATE_UPSTREAM:-}" ]; then # are running more than one validate bundlescript VALIDATE_REPO='https://github.com/containous/traefik.git' + ## FIXME wrong assumption VALIDATE_BRANCH='master' - # Should not be needed for now O:) - # if [ "$TRAVIS" = 'true' -a "$TRAVIS_PULL_REQUEST" != 'false' ]; then - # VALIDATE_REPO="https://github.com/${TRAVIS_REPO_SLUG}.git" - # VALIDATE_BRANCH="${TRAVIS_BRANCH}" - # fi - VALIDATE_HEAD="$(git rev-parse --verify HEAD)" git fetch -q "$VALIDATE_REPO" "refs/heads/$VALIDATE_BRANCH" @@ -26,9 +21,4 @@ if [ -z "${VALIDATE_UPSTREAM:-}" ]; then git diff "$VALIDATE_COMMIT_DIFF" "$@" fi } - validate_log() { - if [ "$VALIDATE_UPSTREAM" != "$VALIDATE_HEAD" ]; then - git log "$VALIDATE_COMMIT_LOG" "$@" - fi - } fi diff --git a/script/crossbinary b/script/crossbinary deleted file mode 100755 index a0ee7817b..000000000 --- a/script/crossbinary +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -set -e - -./script/crossbinary-default -./script/crossbinary-others diff --git a/script/crossbinary-others b/script/crossbinary-others deleted file mode 100755 index aca441662..000000000 --- a/script/crossbinary-others +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/bash -set -e - -if ! test -e autogen/genstatic/gen.go; then - echo >&2 'error: generate must be run before crossbinary' - false -fi - -if [ -z "$VERSION" ]; then - VERSION=$(git rev-parse HEAD) -fi - -if [ -z "$CODENAME" ]; then - CODENAME=cheddar -fi - -if [ -z "$DATE" ]; then - DATE=$(date -u '+%Y-%m-%d_%I:%M:%S%p') -fi - -echo "Building ${VERSION} ${CODENAME} ${DATE}" - -GIT_REPO_URL='github.com/containous/traefik/pkg/version' -GO_BUILD_CMD="go build -ldflags" -GO_BUILD_OPT="-s -w -X ${GIT_REPO_URL}.Version=${VERSION} -X ${GIT_REPO_URL}.Codename=${CODENAME} -X ${GIT_REPO_URL}.BuildDate=${DATE}" - -# Build arm binaries -OS_PLATFORM_ARG=(linux windows darwin) -OS_ARCH_ARG=(386) -for OS in ${OS_PLATFORM_ARG[@]}; do - BIN_EXT='' - if [ "$OS" == "windows" ]; then - BIN_EXT='.exe' - fi - for ARCH in ${OS_ARCH_ARG[@]}; do - echo "Building binary for ${OS}/${ARCH}..." - GOARCH=${ARCH} GOOS=${OS} CGO_ENABLED=0 ${GO_BUILD_CMD} "${GO_BUILD_OPT}" -o "dist/traefik_${OS}-${ARCH}${BIN_EXT}" ./cmd/traefik/ - done -done - -# Build Bsd binaries -OS_PLATFORM_ARG=(freebsd openbsd) -OS_ARCH_ARG=(386 amd64) -for OS in ${OS_PLATFORM_ARG[@]}; do - for ARCH in ${OS_ARCH_ARG[@]}; do - # Get rid of existing binaries - rm -f dist/traefik_${OS}-${ARCH} - echo "Building binary for $OS/$ARCH..." - GOARCH=${ARCH} GOOS=${OS} CGO_ENABLED=0 ${GO_BUILD_CMD} "$GO_BUILD_OPT" -o "dist/traefik_$OS-$ARCH" ./cmd/traefik/ - done -done - -# Build arm binaries -OS_PLATFORM_ARG=(linux) -OS_ARCH_ARG=(arm) -ARM_ARG=(6) -for OS in ${OS_PLATFORM_ARG[@]}; do - for ARCH in ${OS_ARCH_ARG[@]}; do - for ARM in ${ARM_ARG[@]}; do - echo "Building binary for $OS/${ARCH}32v${ARM}..." - GOARCH=${ARCH} GOOS=${OS} GOARM=${ARM} CGO_ENABLED=0 ${GO_BUILD_CMD} "$GO_BUILD_OPT" -o "dist/traefik_$OS-${ARCH}" ./cmd/traefik/ - done - done -done - -# Build ppc64le binaries -OS_PLATFORM_ARG=(linux) -OS_ARCH_ARG=(ppc64le) -for OS in ${OS_PLATFORM_ARG[@]}; do - for ARCH in ${OS_ARCH_ARG[@]}; do - echo "Building binary for ${OS}/${ARCH}..." - GOARCH=${ARCH} GOOS=${OS} CGO_ENABLED=0 ${GO_BUILD_CMD} "${GO_BUILD_OPT}" -o "dist/traefik_${OS}-${ARCH}" ./cmd/traefik/ - done -done