diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c38fa4e005685a861be5fdbe8fcbb03f84a216b0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.idea
+*.iml
diff --git a/files/Makefile b/files/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..869646b82da041c02e9c11411605bbd710be8328
--- /dev/null
+++ b/files/Makefile
@@ -0,0 +1,37 @@
+PKG := "${CI_SERVER_HOST}/${CI_PROJECT_NAMESPACE}/$(CI_PROJECT_NAME)"
+PKG_LIST := $(shell go list ${PKG}/... | grep -v /vendor/)
+GO_FILES := $(shell find . -name '*.go' | grep -v /vendor/ | grep -v _test.go)
+
+.PHONY: all dep build clean test coverage coverhtml lint
+
+all: build
+
+lint:
+	@golint -set_exit_status ${PKG_LIST}
+
+test:
+	@go test -v ${PKG_LIST}
+
+race: dep
+	@go test -v -race ${PKG_LIST}
+
+msan: dep
+	@go test -v -msan ${PKG_LIST}
+
+coverage:
+	./tools/coverage.sh;
+
+coverhtml:
+	./tools/coverage.sh html;
+
+dep:
+	@go get -v ./...
+
+build: dep
+	@gox -output="${CI_PROJECT_DIR}/${CI_PROJECT_NAME}/{{.Dir}}_{{.OS}}_{{.Arch}}" -parallel=6 -osarch '!darwin/386'
+
+clean:
+	@rm -rf "${CI_PROJECT_DIR}/${CI_PROJECT_NAME}"
+
+help:
+	@grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'