Merge pull request #385 from kadel/test-in-docker

Container for running tests and Makefile cleanup
This commit is contained in:
Tomas Kral 2017-01-24 12:18:29 +01:00 committed by GitHub
commit 001e19c4b3
18 changed files with 132 additions and 366 deletions

View File

@ -20,18 +20,7 @@ install:
- true
script:
- make check-vendor
- make validate
- make test-unit-cover
- make test
# gover collects all .coverprofile files and saves it to one file gover.coverprofile
- gover
- goveralls -coverprofile=gover.coverprofile -service=travis-ci
# make test-cmd requires kompose binary
- make bin
# $GOPATH/bin is in $PATH
- mkdir -p $GOPATH/bin
- cp kompose $GOPATH/bin/
- make test-cmd

View File

@ -13,47 +13,86 @@
# See the License for the specific language governing permissions and
# limitations under the License.
.PHONY: all
KOMPOSE_ENVS := \
-e OS_PLATFORM_ARG \
-e OS_ARCH_ARG \
-e TESTDIRS \
-e TESTFLAGS \
-e TESTVERBOSE
BIND_DIR := bundles
GITCOMMIT := $(shell git rev-parse --short HEAD)
BUILD_FLAGS := -ldflags="-w -X github.com/kubernetes-incubator/kompose/version.GITCOMMIT=$(GITCOMMIT)"
PKGS := $(shell glide novendor)
TEST_IMAGE := kompose/tests:latest
default: bin
all: validate
CGO_ENABLED=1 ./script/make.sh
.PHONY: all
all: bin
.PHONY: bin
bin:
CGO_ENABLED=1 ./script/make.sh binary
go build ${BUILD_FLAGS} -o kompose main.go
.PHONY: install
install:
go install ${BUILD_FLAGS}
# kompile kompose for multiple platforms
.PHONY: cross
cross:
# CGO_ENABLED=1 ./script/make.sh binary-cross
./script/make.sh binary-cross
gox -os="darwin linux windows" -arch="386 amd64" -output="bundles/kompose_{{.OS}}-{{.Arch}}/kompose" $(BUILD_FLAGS)
.PHONY: clean
clean:
./script/make.sh clean
rm -f kompose
rm -r -f bundles
.PHONY: test-unit
test-unit:
./script/make.sh test-unit
test-cmd:
./script/make.sh test-cmd
test-unit-cover:
./script/make.sh test-unit-cover
go test $(BUILD_FLAGS) -race -cover -v $(PKGS)
# Run unit tests and collect coverage
.PHONY: test-unit-cover
test-unit-cover:
# First install packages that are dependencies of the test.
go test -i -race -cover $(PKGS)
# go test doesn't support colleting coverage across multiple packages,
# generate go test commands using go list and run go test for every package separately
go list -f '"go test -race -cover -v -coverprofile={{.Dir}}/.coverprofile {{.ImportPath}}"' github.com/kubernetes-incubator/kompose/... | grep -v "vendor" | xargs -L 1 -P4 sh -c
# run commandline tests
.PHONY: test-cmd
test-cmd:
./script/test/cmd/tests.sh
# run all validation tests
.PHONY: validate
validate: gofmt vet lint
.PHONY: vet
vet:
./script/make.sh validate-vet
lint:
./script/make.sh validate-lint
gofmt:
./script/make.sh validate-gofmt
go vet $(PKGS)
.PHONY: lint
lint:
./script/check-lint.sh
.PHONY: gofmt
gofmt:
./script/check-gofmt.sh
# Checks if there are nested vendor dirs inside Kompose vendor and if vendor was cleaned by glide-vc
.PHONY: check-vendor
check-vendor:
./script/make.sh check-vendor
./script/check-vendor.sh
# Run all tests
.PHONY: test
test: check-vendor validate test-unit-cover install test-cmd
# build docker image that is used for running all test localy
.PHONY: test-image
test-image:
docker build -t $(TEST_IMAGE) -f script/test_in_container/Dockerfile script/test_in_container/
# run all test localy in docker image (image can be build by by build-test-image target)
.PHONY: test-container
test-container:
docker run -v `pwd`:/opt/tmp/kompose:ro -it $(TEST_IMAGE)

View File

@ -26,9 +26,12 @@ func CreateLocalDirectory(t *testing.T) string {
func CreateLocalGitDirectory(t *testing.T) string {
dir := CreateLocalDirectory(t)
cmd := NewCommand(
`git init && touch README &&
git add README &&
git commit -m 'testcommit'`)
`git init &&
git config user.email "you@example.com" &&
git config user.name "Your Name" &&
touch README &&
git add README &&
git commit --no-gpg-sign -m 'testcommit'`)
cmd.Dir = dir
_, err := cmd.Output()
if err != nil {

View File

@ -1,19 +0,0 @@
#!/bin/bash
# Copyright 2016 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.
GITCOMMIT=$(git rev-parse --short HEAD)
BUILD_FLAGS=(-ldflags="-w -X github.com/kubernetes-incubator/kompose/version.GITCOMMIT=${GITCOMMIT}")

View File

@ -1,18 +0,0 @@
#!/bin/bash
# Copyright 2016 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.
# all Kompose packages (skip vendor dir)
PKGS=$( go list -e ./... | grep -v '/vendor/' )

View File

@ -1,28 +0,0 @@
#! /bin/bash
# Copyright 2016 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.
: ${PROG:=$(basename ${BASH_SOURCE})}
_cli_bash_autocomplete() {
local cur opts base
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion )
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
}
complete -F _cli_bash_autocomplete $PROG

View File

@ -1,36 +0,0 @@
#!/bin/bash
# Copyright 2016 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 -e
source "$(dirname "$BASH_SOURCE")/.build"
OUT_FILE="./kompose"
# Get rid of existing binary
rm -f $OUT_FILE
# Build binary
go build \
"${BUILD_FLAGS[@]}" \
-o $OUT_FILE \
main.go
if [ $? -eq 0 ]; then
echo "Build successful. Program saved as ${OUT_FILE}"
else
echo "Build failed."
fi

View File

@ -1,42 +0,0 @@
#!/bin/bash
# Copyright 2016 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 -e
source "$(dirname "$BASH_SOURCE")/.build"
if [ -z "$1" ]; then
OS_PLATFORM_ARG=(-os="darwin linux windows")
else
OS_PLATFORM_ARG=($1)
fi
if [ -z "$2" ]; then
OS_ARCH_ARG=(-arch="386 amd64")
else
OS_ARCH_ARG=($2)
fi
GITCOMMIT=$(git rev-parse --short HEAD)
# Get rid of existing binaries
rm -f kompose*
# Build binaries
gox "${OS_PLATFORM_ARG[@]}" "${OS_ARCH_ARG[@]}" \
-output="bundles/kompose_{{.OS}}-{{.Arch}}/kompose" \
"${BUILD_FLAGS[@]}" \
.

View File

@ -14,11 +14,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
source "$(dirname "$BASH_SOURCE")/.validate"
# This checks if all go source files in current directory are format using gofmt
GO_FILES=$(find . -path ./vendor -prune -o -name '*.go' -print )
for file in $GO_FILES; do
gofmtOutput=$(gofmt -l "$file")
if [ "$gofmtOutput" ]; then
@ -27,7 +27,6 @@ for file in $GO_FILES; do
done
if [ ${#errors[@]} -eq 0 ]; then
echo "gofmt OK"
else

View File

@ -15,9 +15,8 @@ set -e
# See the License for the specific language governing permissions and
# limitations under the License.
source "$(dirname "$BASH_SOURCE")/.validate"
for pkg in $PKGS; do
for pkg in $(glide novendor); do
lintOutput=$(golint "$pkg")
# if lineOutput is not empty, save it to errros array
if [ "$lintOutput" ]; then

View File

@ -14,12 +14,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# Check if there are nested vendor dirs inside Kompose vendor.
# All dependencies should be flattened and there shouldn't be vendor in inside vendor.
function check_nested_vendor() {
echo "Checking if there are nested vendor dirs"
echo "Checking for nested vendor dirs"
# count all vendor directories inside Kompose vendor
NO_NESTED_VENDORS=$(find vendor/ -type d | sed 's/^[^/]*.//g' | grep -E "vendor$" | grep -v _vendor | wc -l)
@ -41,7 +40,7 @@ function check_glide-vc() {
echo "Checking if vendor was cleaned using glide-vc."
# dry run glide-vc and count how many could be deleted.
NO_DELETED_FILES=$($GOPATH/bin/glide-vc --only-code --no-tests --dryrun | wc -l)
NO_DELETED_FILES=$(glide-vc --only-code --no-tests --dryrun | wc -l)
if [ $NO_DELETED_FILES -ne 0 ]; then
echo "ERROR"

View File

@ -1,46 +0,0 @@
#!/usr/bin/env bash
# Copyright 2016 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 -e
export KOMPOSE_PKG='github.com/kubernetes-incubator/kompose'
# List of bundles to create when no argument is passed
DEFAULT_BUNDLES=(
validate-gofmt
validate-git-marks
validate-lint
validate-vet
binary
)
bundle() {
local bundle="$1"; shift
echo "---> Making bundle: $(basename "$bundle") (in $DEST)"
source "script/$bundle" "$@"
}
if [ $# -lt 1 ]; then
bundles=(${DEFAULT_BUNDLES[@]})
else
bundles=($@)
fi
for bundle in ${bundles[@]}; do
export DEST=.
ABS_DEST="$(cd "$DEST" && pwd -P)"
bundle "$bundle"
echo
done

View File

@ -1,17 +0,0 @@
#!/bin/bash
# Copyright 2016 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.
./script/test/cmd/tests.sh

View File

@ -1,27 +0,0 @@
#!/bin/bash
# Copyright 2016 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.
source "$(dirname "$BASH_SOURCE")/.build"
# Install packages that are dependencies of the test. (this will speed up go test runs)
go test -i -race -cover $( go list github.com/kubernetes-incubator/kompose/... | grep -v '/vendor/' )
# go test doesn't support colleting coverage across multiple packages,
# so this is why this runs go test for each package separately
# generate go test commands using go list and run tests
go list -f '"go test -race -cover -v -coverprofile={{.Dir}}/.coverprofile {{.ImportPath}}"' github.com/kubernetes-incubator/kompose/... | grep -v "vendor" | xargs -L 1 -P4 sh -c

View File

@ -0,0 +1,46 @@
# Copyright 2016 The Kubernetes Authors.
#
# 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.
# This Dockefile creates image where all Kompose tests can be run
FROM registry.centos.org/centos/centos:7
RUN yum install -y epel-release
RUN yum install -y golang make git jq &&\
yum -y clean all
ENV GOPATH="/opt/go" \
# KOMPOSE_TMP_SRC is where kompose source will be mounted from host
KOMPOSE_TMP_SRC="/opt/tmp/kompose"
ENV PATH="$PATH:$GOPATH/bin" \
# KOMPOSE_SRC is where kompose source will be copied when container starts (by run.sh script)
# this is to ensure that we won't write anything to host volume mount
KOMPOSE_SRC="$GOPATH/src/github.com/kubernetes-incubator/kompose"
RUN go get github.com/Masterminds/glide &&\
go get github.com/sgotti/glide-vc &&\
go get github.com/golang/lint/golint
WORKDIR $KOMPOSE_SRC
# This image can be run as any user
RUN chmod -R ugo+rw $GOPATH
COPY run.sh /opt/tools/
ENTRYPOINT ["/opt/tools/run.sh"]

View File

@ -1,6 +1,8 @@
#!/bin/bash
# Copyright 2016 The Kubernetes Authors All rights reserved.
set -e
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -14,8 +16,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
set -e
source "$(dirname "$BASH_SOURCE")/.build"
# Container should be started with Kompose source mounted as read-only volume $KOMPOSE_TMP_SRC
# Copy Kompose sources to another directory after container starts.
# We can be sure that this container won't modify any files on hosts disk.
cp -r $KOMPOSE_TMP_SRC/ $(dirname $KOMPOSE_SRC)
go test "${BUILD_FLAGS[@]}" -race -cover -v $( go list github.com/kubernetes-incubator/kompose/... | grep -v '/vendor/' )
make test

View File

@ -1,58 +0,0 @@
#!/usr/bin/env bash
# Copyright 2016 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.
source "$(dirname "$BASH_SOURCE")/.validate"
# folders=$(find * -type d | egrep -v '^Godeps|bundles|.git')
IFS=$'\n'
files=( $(validate_diff --diff-filter=ACMR --name-only -- '*' | grep -v '^vendor/' || true) )
unset IFS
badFiles=()
for f in "${files[@]}"; do
if [ $(grep -r "^<<<<<<<" $f) ]; then
badFiles+=( "$f" )
continue
fi
if [ $(grep -r "^>>>>>>>" $f) ]; then
badFiles+=( "$f" )
continue
fi
if [ $(grep -r "^=======$" $f) ]; then
badFiles+=( "$f" )
continue
fi
set -e
done
if [ ${#badFiles[@]} -eq 0 ]; then
echo 'Congratulations! There is no conflict.'
else
{
echo "There is trace of conflict(s) in the following files :"
for f in "${badFiles[@]}"; do
echo " - $f"
done
echo
echo 'Please fix the conflict(s) commit the result.'
echo
} >&2
false
fi

View File

@ -1,21 +0,0 @@
#!/bin/bash
set -e
# Copyright 2016 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.
source "$(dirname "$BASH_SOURCE")/.validate"
go vet $PKGS;