github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/Makefile (about)

     1  .PHONY: build package run stop run-client run-server stop-client stop-server restart restart-server restart-client start-docker clean-dist clean nuke check-style check-client-style check-server-style check-unit-tests test dist setup-mac prepare-enteprise run-client-tests setup-run-client-tests cleanup-run-client-tests test-client build-linux build-osx build-windows internal-test-web-client vet run-server-for-web-client-tests
     2  
     3  ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
     4  
     5  IS_CI ?= false
     6  # Build Flags
     7  BUILD_NUMBER ?= $(BUILD_NUMBER:)
     8  BUILD_DATE = $(shell date -u)
     9  BUILD_HASH = $(shell git rev-parse HEAD)
    10  # If we don't set the build number it defaults to dev
    11  ifeq ($(BUILD_NUMBER),)
    12  	BUILD_NUMBER := dev
    13  endif
    14  BUILD_ENTERPRISE_DIR ?= ../enterprise
    15  BUILD_ENTERPRISE ?= true
    16  BUILD_ENTERPRISE_READY = false
    17  BUILD_TYPE_NAME = team
    18  BUILD_HASH_ENTERPRISE = none
    19  LDAP_DATA ?= test
    20  ifneq ($(wildcard $(BUILD_ENTERPRISE_DIR)/.),)
    21  	ifeq ($(BUILD_ENTERPRISE),true)
    22  		BUILD_ENTERPRISE_READY = true
    23  		BUILD_TYPE_NAME = enterprise
    24  		BUILD_HASH_ENTERPRISE = $(shell cd $(BUILD_ENTERPRISE_DIR) && git rev-parse HEAD)
    25  	else
    26  		BUILD_ENTERPRISE_READY = false
    27  		BUILD_TYPE_NAME = team
    28  	endif
    29  else
    30  	BUILD_ENTERPRISE_READY = false
    31  	BUILD_TYPE_NAME = team
    32  endif
    33  BUILD_WEBAPP_DIR ?= ../xenia-webapp
    34  BUILD_CLIENT = false
    35  BUILD_HASH_CLIENT = independant
    36  ifneq ($(wildcard $(BUILD_WEBAPP_DIR)/.),)
    37  	ifeq ($(BUILD_CLIENT),true)
    38  		BUILD_CLIENT = true
    39  		BUILD_HASH_CLIENT = $(shell cd $(BUILD_WEBAPP_DIR) && git rev-parse HEAD)
    40  	else
    41  		BUILD_CLIENT = false
    42  	endif
    43  else
    44  	BUILD_CLIENT = false
    45  endif
    46  
    47  # Golang Flags
    48  GOPATH ?= $(shell go env GOPATH)
    49  GOFLAGS ?= $(GOFLAGS:)
    50  GO=go
    51  DELVE=dlv
    52  LDFLAGS += -X "github.com/xzl8028/xenia-server/model.BuildNumber=$(BUILD_NUMBER)"
    53  LDFLAGS += -X "github.com/xzl8028/xenia-server/model.BuildDate=$(BUILD_DATE)"
    54  LDFLAGS += -X "github.com/xzl8028/xenia-server/model.BuildHash=$(BUILD_HASH)"
    55  LDFLAGS += -X "github.com/xzl8028/xenia-server/model.BuildHashEnterprise=$(BUILD_HASH_ENTERPRISE)"
    56  LDFLAGS += -X "github.com/xzl8028/xenia-server/model.BuildEnterpriseReady=$(BUILD_ENTERPRISE_READY)"
    57  
    58  # GOOS/GOARCH of the build host, used to determine whether we're cross-compiling or not
    59  BUILDER_GOOS_GOARCH="$(shell $(GO) env GOOS)_$(shell $(GO) env GOARCH)"
    60  
    61  PLATFORM_FILES="./cmd/xenia/main.go"
    62  
    63  # Output paths
    64  DIST_ROOT=dist
    65  DIST_PATH=$(DIST_ROOT)/xenia
    66  
    67  # Tests
    68  TESTS=.
    69  
    70  TESTFLAGS ?= -short
    71  TESTFLAGSEE ?= -short
    72  
    73  # Packages lists
    74  TE_PACKAGES=$(shell go list ./...|grep -v plugin_tests)
    75  
    76  # Plugins Packages
    77  PLUGIN_PACKAGES=xenia-plugin-zoom-v1.0.7
    78  PLUGIN_PACKAGES += xenia-plugin-autolink-v1.0.0
    79  PLUGIN_PACKAGES += xenia-plugin-nps-v1.0.0
    80  PLUGIN_PACKAGES += xenia-plugin-custom-attributes-v1.0.0
    81  PLUGIN_PACKAGES += xenia-plugin-github-v0.10.2
    82  PLUGIN_PACKAGES += xenia-plugin-welcomebot-v1.0.0
    83  PLUGIN_PACKAGES += xenia-plugin-aws-SNS-v1.0.0
    84  PLUGIN_PACKAGES += xenia-plugin-jira-v2.0.6
    85  
    86  # Prepares the enterprise build if exists. The IGNORE stuff is a hack to get the Makefile to execute the commands outside a target
    87  ifeq ($(BUILD_ENTERPRISE_READY),true)
    88  	IGNORE:=$(shell echo Enterprise build selected, preparing)
    89  	IGNORE:=$(shell rm -f imports/imports.go)
    90  	IGNORE:=$(shell cp $(BUILD_ENTERPRISE_DIR)/imports/imports.go imports/)
    91  	IGNORE:=$(shell rm -f enterprise)
    92  	IGNORE:=$(shell ln -s $(BUILD_ENTERPRISE_DIR) enterprise)
    93  else
    94  	IGNORE:=$(shell rm -f imports/imports.go)
    95  endif
    96  
    97  EE_PACKAGES=$(shell go list ./enterprise/...)
    98  
    99  ifeq ($(BUILD_ENTERPRISE_READY),true)
   100  ALL_PACKAGES=$(TE_PACKAGES) $(EE_PACKAGES)
   101  else
   102  ALL_PACKAGES=$(TE_PACKAGES)
   103  endif
   104  
   105  
   106  all: run ## Alias for 'run'.
   107  
   108  include build/*.mk
   109  
   110  start-docker: ## Starts the docker containers for local development.
   111  ifeq ($(IS_CI),false)
   112  	@echo Starting docker containers
   113  
   114  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-mysql$$ | wc -l) -eq 0 ]; then \
   115  		echo starting xenia-mysql; \
   116  		docker run --name xenia-mysql -p 3306:3306 \
   117  			-e MYSQL_ROOT_PASSWORD=mostest \
   118  			-e MYSQL_USER=mmuser \
   119  			-e MYSQL_PASSWORD=mostest \
   120  			-e MYSQL_DATABASE=xenia_test \
   121  			-d mysql:5.7 > /dev/null; \
   122  	elif [ $(shell docker ps --no-trunc --quiet --filter name=^/xenia-mysql$$ | wc -l) -eq 0 ]; then \
   123  		echo restarting xenia-mysql; \
   124  		docker start xenia-mysql > /dev/null; \
   125  	fi
   126  
   127  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-postgres$$ | wc -l) -eq 0 ]; then \
   128  		echo starting xenia-postgres; \
   129  		docker run --name xenia-postgres -p 5432:5432 \
   130  			-e POSTGRES_USER=mmuser \
   131  			-e POSTGRES_PASSWORD=mostest \
   132  			-e POSTGRES_DB=xenia_test \
   133  			-d postgres:9.4 > /dev/null; \
   134  	elif [ $(shell docker ps --no-trunc --quiet --filter name=^/xenia-postgres$$ | wc -l) -eq 0 ]; then \
   135  		echo restarting xenia-postgres; \
   136  		docker start xenia-postgres > /dev/null; \
   137  	fi
   138  
   139  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-inbucket$$ | wc -l) -eq 0 ]; then \
   140  		echo starting xenia-inbucket; \
   141  		docker run --name xenia-inbucket -p 9000:10080 -p 2500:10025 -d jhillyerd/inbucket:release-1.2.0 > /dev/null; \
   142  	elif [ $(shell docker ps --no-trunc --quiet --filter name=^/xenia-inbucket$$ | wc -l) -eq 0 ]; then \
   143  		echo restarting xenia-inbucket; \
   144  		docker start xenia-inbucket > /dev/null; \
   145  	fi
   146  
   147  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-minio$$ | wc -l) -eq 0 ]; then \
   148  		echo starting xenia-minio; \
   149  		docker run --name xenia-minio -p 9001:9000 -e "MINIO_ACCESS_KEY=minioaccesskey" \
   150  		-e "MINIO_SSE_MASTER_KEY=my-minio-key:6368616e676520746869732070617373776f726420746f206120736563726574" \
   151  		-e "MINIO_SECRET_KEY=miniosecretkey" -d minio/minio:RELEASE.2019-04-23T23-50-36Z server /data > /dev/null; \
   152  		docker exec -it xenia-minio /bin/sh -c "mkdir -p /data/xenia-test" > /dev/null; \
   153  	elif [ $(shell docker ps --no-trunc --quiet --filter name=^/xenia-minio$$ | wc -l) -eq 0 ]; then \
   154  		echo restarting xenia-minio; \
   155  		docker start xenia-minio > /dev/null; \
   156  	fi
   157  
   158  ifeq ($(BUILD_ENTERPRISE_READY),true)
   159  	@echo Ldap test user test.one
   160  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-openldap$$ | wc -l) -eq 0 ]; then \
   161  		echo starting xenia-openldap; \
   162  		docker run --name xenia-openldap -p 389:389 -p 636:636 \
   163  			-e LDAP_TLS_VERIFY_CLIENT="never" \
   164  			-e LDAP_ORGANISATION="Xenia Test" \
   165  			-e LDAP_DOMAIN="mm.test.com" \
   166  			-e LDAP_ADMIN_PASSWORD="mostest" \
   167  			-d osixia/openldap:1.2.2 > /dev/null;\
   168  		sleep 10; \
   169  		docker cp tests/test-data.ldif xenia-openldap:/test-data.ldif;\
   170  		docker cp tests/qa-data.ldif xenia-openldap:/qa-data.ldif;\
   171  		docker exec -ti xenia-openldap bash -c 'ldapadd -x -D "cn=admin,dc=mm,dc=test,dc=com" -w mostest -f /$(LDAP_DATA)-data.ldif';\
   172  	elif [ $(shell docker ps | grep -ci xenia-openldap) -eq 0 ]; then \
   173  		echo restarting xenia-openldap; \
   174  		docker start xenia-openldap > /dev/null; \
   175  		sleep 10; \
   176  	fi
   177  
   178  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-elasticsearch$$ | wc -l) -eq 0 ]; then \
   179  		echo starting xenia-elasticsearch; \
   180  		docker run --name xenia-elasticsearch -p 9200:9200 -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" -e "ES_JAVA_OPTS=-Xms250m -Xmx250m" -d xenia/xenia-elasticsearch-docker:6.5.1 > /dev/null; \
   181  	elif [ $(shell docker ps --no-trunc --quiet --filter name=^/xenia-elasticsearch$$ | wc -l) -eq 0 ]; then \
   182  		echo restarting xenia-elasticsearch; \
   183  		docker start xenia-elasticsearch> /dev/null; \
   184  	fi
   185  
   186  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-redis$$ | wc -l) -eq 0 ]; then \
   187  		echo starting xenia-redis; \
   188  		docker run --name xenia-redis -p 6379:6379 -d redis > /dev/null; \
   189  	elif [ $(shell docker ps --no-trunc --quiet --filter name=^/xenia-redis$$ | wc -l) -eq 0 ]; then \
   190  		echo restarting xenia-redis; \
   191  		docker start xenia-redis > /dev/null; \
   192  	fi
   193  endif
   194  else
   195  	@echo CI Build: skipping docker start
   196  endif
   197  
   198  stop-docker: ## Stops the docker containers for local development.
   199  	@echo Stopping docker containers
   200  
   201  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-mysql$$ | wc -l) -eq 1 ]; then \
   202  		echo stopping xenia-mysql; \
   203  		docker stop xenia-mysql > /dev/null; \
   204  	fi
   205  
   206  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-mysql-unittest$$ | wc -l) -eq 1 ]; then \
   207  		echo stopping xenia-mysql-unittest; \
   208  		docker stop xenia-mysql-unittest > /dev/null; \
   209  	fi
   210  
   211  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-postgres$$ | wc -l) -eq 1 ]; then \
   212  		echo stopping xenia-postgres; \
   213  		docker stop xenia-postgres > /dev/null; \
   214  	fi
   215  
   216  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-postgres-unittest$$ | wc -l) -eq 1 ]; then \
   217  		echo stopping xenia-postgres-unittest; \
   218  		docker stop xenia-postgres-unittest > /dev/null; \
   219  	fi
   220  
   221  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-openldap$$ | wc -l) -eq 1 ]; then \
   222  		echo stopping xenia-openldap; \
   223  		docker stop xenia-openldap > /dev/null; \
   224  	fi
   225  
   226  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-inbucket$$ | wc -l) -eq 1 ]; then \
   227  		echo stopping xenia-inbucket; \
   228  		docker stop xenia-inbucket > /dev/null; \
   229  	fi
   230  
   231  		@if [ $(shell docker ps -a | grep -ci xenia-minio) -eq 1 ]; then \
   232  		echo stopping xenia-minio; \
   233  		docker stop xenia-minio > /dev/null; \
   234  	fi
   235  
   236  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-elasticsearch$$ | wc -l) -eq 1 ]; then \
   237  		echo stopping xenia-elasticsearch; \
   238  		docker stop xenia-elasticsearch > /dev/null; \
   239  	fi
   240  
   241  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-redis$$ | wc -l) -eq 1 ]; then \
   242  		echo stopping xenia-redis; \
   243  		docker stop xenia-redis > /dev/null; \
   244  	fi
   245  
   246  clean-docker: ## Deletes the docker containers for local development.
   247  	@echo Removing docker containers
   248  
   249  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-mysql$$ | wc -l) -eq 1 ]; then \
   250  		echo removing xenia-mysql; \
   251  		docker stop xenia-mysql > /dev/null; \
   252  		docker rm -v xenia-mysql > /dev/null; \
   253  	fi
   254  
   255  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-mysql-unittest$$ | wc -l) -eq 1 ]; then \
   256  		echo removing xenia-mysql-unittest; \
   257  		docker stop xenia-mysql-unittest > /dev/null; \
   258  		docker rm -v xenia-mysql-unittest > /dev/null; \
   259  	fi
   260  
   261  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-postgres$$ | wc -l) -eq 1 ]; then \
   262  		echo removing xenia-postgres; \
   263  		docker stop xenia-postgres > /dev/null; \
   264  		docker rm -v xenia-postgres > /dev/null; \
   265  	fi
   266  
   267  	@if [ $(shell docker ps -a --no-trunc --quiet --filter name=^/xenia-postgres-unittest$$ | wc -l) -eq 1 ]; then \
   268  		echo removing xenia-postgres-unittest; \
   269  		docker stop xenia-postgres-unittest > /dev/null; \
   270  		docker rm -v xenia-postgres-unittest > /dev/null; \
   271  	fi
   272  
   273  	@if [ $(shell docker ps -a | grep -ci xenia-openldap) -eq 1 ]; then \
   274  		echo removing xenia-openldap; \
   275  		docker stop xenia-openldap > /dev/null; \
   276  		docker rm -v xenia-openldap > /dev/null; \
   277  	fi
   278  
   279  	@if [ $(shell docker ps -a | grep -ci xenia-inbucket) -eq 1 ]; then \
   280  		echo removing xenia-inbucket; \
   281  		docker stop xenia-inbucket > /dev/null; \
   282  		docker rm -v xenia-inbucket > /dev/null; \
   283  	fi
   284  
   285  	@if [ $(shell docker ps -a | grep -ci xenia-minio) -eq 1 ]; then \
   286  		echo removing xenia-minio; \
   287  		docker stop xenia-minio > /dev/null; \
   288  		docker rm -v xenia-minio > /dev/null; \
   289  	fi
   290  
   291  	@if [ $(shell docker ps -a | grep -ci xenia-elasticsearch) -eq 1 ]; then \
   292  		echo removing xenia-elasticsearch; \
   293  		docker stop xenia-elasticsearch > /dev/null; \
   294  		docker rm -v xenia-elasticsearch > /dev/null; \
   295  	fi
   296  
   297  govet: ## Runs govet against all packages.
   298  	@echo Running GOVET
   299  	$(GO) get golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
   300  	$(GO) vet $(GOFLAGS) $(ALL_PACKAGES) || exit 1
   301  	$(GO) vet -vettool=$(GOPATH)/bin/shadow $(GOFLAGS) $(ALL_PACKAGES) || exit 1
   302  
   303  gofmt: ## Runs gofmt against all packages.
   304  	@echo Running GOFMT
   305  
   306  	@for package in $(TE_PACKAGES) $(EE_PACKAGES); do \
   307  		echo "Checking "$$package; \
   308  		files=$$(go list -f '{{range .GoFiles}}{{$$.Dir}}/{{.}} {{end}}' $$package); \
   309  		if [ "$$files" ]; then \
   310  			gofmt_output=$$(gofmt -d -s $$files 2>&1); \
   311  			if [ "$$gofmt_output" ]; then \
   312  				echo "$$gofmt_output"; \
   313  				echo "gofmt failure"; \
   314  				exit 1; \
   315  			fi; \
   316  		fi; \
   317  	done
   318  	@echo "gofmt success"; \
   319  
   320  megacheck: ## Run megacheck on codebasis
   321  	env GO111MODULE=off go get -u honnef.co/go/tools/cmd/megacheck
   322  	$(GOPATH)/bin/megacheck $(TE_PACKAGES)
   323  
   324  ifeq ($(BUILD_ENTERPRISE_READY),true)
   325  	$(GOPATH)/bin/megacheck $(EE_PACKAGES) || exit 1
   326  endif
   327  
   328  i18n-extract: ## Extract strings for translation from the source code
   329  	env GO111MODULE=off go get -u github.com/xzl8028/xenia-utilities/mmgotool
   330  	$(GOPATH)/bin/mmgotool i18n extract
   331  
   332  store-mocks: ## Creates mock files.
   333  	env GO111MODULE=off go get -u github.com/vektra/mockery/...
   334  	$(GOPATH)/bin/mockery -dir store -all -output store/storetest/mocks -note 'Regenerate this file using `make store-mocks`.'
   335  
   336  filesstore-mocks: ## Creates mock files.
   337  	env GO111MODULE=off go get -u github.com/vektra/mockery/...
   338  	$(GOPATH)/bin/mockery -dir services/filesstore -all -output services/filesstore/mocks -note 'Regenerate this file using `make filesstore-mocks`.'
   339  
   340  ldap-mocks: ## Creates mock files for ldap.
   341  	env GO111MODULE=off go get -u github.com/vektra/mockery/...
   342  	$(GOPATH)/bin/mockery -dir enterprise/ldap -all -output enterprise/ldap/mocks -note 'Regenerate this file using `make ldap-mocks`.'
   343  
   344  plugin-mocks: ## Creates mock files for plugins.
   345  	env GO111MODULE=off go get -u github.com/vektra/mockery/...
   346  	$(GOPATH)/bin/mockery -dir plugin -name API -output plugin/plugintest -outpkg plugintest -case underscore -note 'Regenerate this file using `make plugin-mocks`.'
   347  	$(GOPATH)/bin/mockery -dir plugin -name Hooks -output plugin/plugintest -outpkg plugintest -case underscore -note 'Regenerate this file using `make plugin-mocks`.'
   348  	$(GOPATH)/bin/mockery -dir plugin -name Helpers -output plugin/plugintest -outpkg plugintest -case underscore -note 'Regenerate this file using `make plugin-mocks`.'
   349  
   350  pluginapi: ## Generates api and hooks glue code for plugins
   351  	go generate ./plugin
   352  
   353  check-licenses: ## Checks license status.
   354  	./scripts/license-check.sh $(TE_PACKAGES) $(EE_PACKAGES)
   355  
   356  check-prereqs: ## Checks prerequisite software status.
   357  	./scripts/prereq-check.sh
   358  
   359  check-style: govet gofmt check-licenses ## Runs govet and gofmt against all packages.
   360  
   361  test-te-race: ## Checks for race conditions in the team edition.
   362  	@echo Testing TE race conditions
   363  
   364  	@echo "Packages to test: "$(TE_PACKAGES)
   365  
   366  	@for package in $(TE_PACKAGES); do \
   367  		echo "Testing "$$package; \
   368  		$(GO) test $(GOFLAGS) -race -run=$(TESTS) -test.timeout=4000s $$package || exit 1; \
   369  	done
   370  
   371  test-ee-race: ## Checks for race conditions in the enterprise edition.
   372  	@echo Testing EE race conditions
   373  
   374  ifeq ($(BUILD_ENTERPRISE_READY),true)
   375  	@echo "Packages to test: "$(EE_PACKAGES)
   376  
   377  	for package in $(EE_PACKAGES); do \
   378  		echo "Testing "$$package; \
   379  		$(GO) test $(GOFLAGS) -race -run=$(TESTS) -c $$package; \
   380  		if [ -f $$(basename $$package).test ]; then \
   381  			echo "Testing "$$package; \
   382  			./$$(basename $$package).test -test.timeout=2000s || exit 1; \
   383  			rm -r $$(basename $$package).test; \
   384  		fi; \
   385  	done
   386  
   387  	rm -f config/*.crt
   388  	rm -f config/*.key
   389  endif
   390  
   391  test-server-race: test-te-race test-ee-race ## Checks for race conditions.
   392  	find . -type d -name data -not -path './vendor/*' | xargs rm -rf
   393  
   394  do-cover-file: ## Creates the test coverage report file.
   395  	@echo "mode: count" > cover.out
   396  
   397  go-junit-report:
   398  	env GO111MODULE=off go get -u github.com/jstemmer/go-junit-report
   399  
   400  test-compile:
   401  	@echo COMPILE TESTS
   402  
   403  	for package in $(TE_PACKAGES) $(EE_PACKAGES); do \
   404  		$(GO) test $(GOFLAGS) -c $$package; \
   405  	done
   406  
   407  test-db-migration: start-docker
   408  	./scripts/mysql-migration-test.sh
   409  	./scripts/psql-migration-test.sh
   410  
   411  test-server: start-docker go-junit-report do-cover-file ## Runs tests.
   412  ifeq ($(BUILD_ENTERPRISE_READY),true)
   413  	@echo Running all tests
   414  else
   415  	@echo Running only TE tests
   416  endif
   417  	./scripts/test.sh "$(GO)" "$(GOFLAGS)" "$(ALL_PACKAGES)" "$(TESTS)" "$(TESTFLAGS)"
   418  
   419  internal-test-web-client: ## Runs web client tests.
   420  	$(GO) run $(GOFLAGS) $(PLATFORM_FILES) test web_client_tests
   421  
   422  run-server-for-web-client-tests: ## Tests the server for web client.
   423  	$(GO) run $(GOFLAGS) $(PLATFORM_FILES) test web_client_tests_server
   424  
   425  test-client: ## Test client app.
   426  	@echo Running client tests
   427  
   428  	cd $(BUILD_WEBAPP_DIR) && $(MAKE) test
   429  
   430  test: test-server test-client ## Runs all checks and tests below (except race detection and postgres).
   431  
   432  cover: ## Runs the golang coverage tool. You must run the unit tests first.
   433  	@echo Opening coverage info in browser. If this failed run make test first
   434  
   435  	$(GO) tool cover -html=cover.out
   436  	$(GO) tool cover -html=ecover.out
   437  
   438  test-data: start-docker ## Add test data to the local instance.
   439  	$(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) config set TeamSettings.MaxUsersPerTeam 100
   440  	$(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) sampledata -w 4 -u 60 
   441  
   442  	@echo You may need to restart the Xenia server before using the following
   443  	@echo ========================================================================
   444  	@echo Login with a system admin account username=sysadmin password=sysadmin
   445  	@echo Login with a regular account username=user-1 password=user-1
   446  	@echo ========================================================================
   447  
   448  run-server: start-docker ## Starts the server.
   449  	@echo Running xenia for development
   450  
   451  	mkdir -p $(BUILD_WEBAPP_DIR)/dist/files
   452  	$(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) --disableconfigwatch | \
   453  	    $(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) logs --logrus &
   454  
   455  debug-server: start-docker
   456  	mkdir -p $(BUILD_WEBAPP_DIR)/dist/files
   457  	$(DELVE) debug $(PLATFORM_FILES) --build-flags="-ldflags '\
   458  		-X github.com/xzl8028/xenia-server/model.BuildNumber=$(BUILD_NUMBER)\
   459  		-X \"github.com/xzl8028/xenia-server/model.BuildDate=$(BUILD_DATE)\"\
   460  		-X github.com/xzl8028/xenia-server/model.BuildHash=$(BUILD_HASH)\
   461  		-X github.com/xzl8028/xenia-server/model.BuildHashEnterprise=$(BUILD_HASH_ENTERPRISE)\
   462  		-X github.com/xzl8028/xenia-server/model.BuildEnterpriseReady=$(BUILD_ENTERPRISE_READY)'"
   463  
   464  run-cli: start-docker ## Runs CLI.
   465  	@echo Running xenia for development
   466  	@echo Example should be like 'make ARGS="-version" run-cli'
   467  
   468  	$(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) ${ARGS}
   469  
   470  run-client: ## Runs the webapp.
   471  	@echo Running xenia client for development
   472  
   473  	ln -nfs $(BUILD_WEBAPP_DIR)/dist client
   474  	cd $(BUILD_WEBAPP_DIR) && $(MAKE) run
   475  
   476  run-client-fullmap: ## Legacy alias to run-client
   477  	@echo Running xenia client for development
   478  
   479  	cd $(BUILD_WEBAPP_DIR) && $(MAKE) run
   480  
   481  run: check-prereqs run-server run-client ## Runs the server and webapp.
   482  
   483  run-fullmap: run-server run-client ## Legacy alias to run
   484  
   485  stop-server: ## Stops the server.
   486  	@echo Stopping xenia
   487  
   488  ifeq ($(BUILDER_GOOS_GOARCH),"windows_amd64")
   489  	wmic process where "Caption='go.exe' and CommandLine like '%go.exe run%'" call terminate
   490  	wmic process where "Caption='xenia.exe' and CommandLine like '%go-build%'" call terminate
   491  else
   492  	@for PID in $$(ps -ef | grep "[g]o run" | awk '{ print $$2 }'); do \
   493  		echo stopping go $$PID; \
   494  		kill $$PID; \
   495  	done
   496  	@for PID in $$(ps -ef | grep "[g]o-build" | awk '{ print $$2 }'); do \
   497  		echo stopping xenia $$PID; \
   498  		kill $$PID; \
   499  	done
   500  endif
   501  
   502  stop-client: ## Stops the webapp.
   503  	@echo Stopping xenia client
   504  
   505  	cd $(BUILD_WEBAPP_DIR) && $(MAKE) stop
   506  
   507  stop: stop-server stop-client ## Stops server and client.
   508  
   509  restart: restart-server restart-client ## Restarts the server and webapp.
   510  
   511  restart-server: | stop-server run-server ## Restarts the xenia server to pick up development change.
   512  
   513  restart-client: | stop-client run-client ## Restarts the webapp.
   514  
   515  run-job-server: ## Runs the background job server.
   516  	@echo Running job server for development
   517  	$(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) jobserver --disableconfigwatch &
   518  
   519  config-ldap: ## Configures LDAP.
   520  	@echo Setting up configuration for local LDAP
   521  
   522  	@sed -i'' -e 's|"LdapServer": ".*"|"LdapServer": "dockerhost"|g' config/config.json
   523  	@sed -i'' -e 's|"BaseDN": ".*"|"BaseDN": "dc=mm,dc=test,dc=com"|g' config/config.json
   524  	@sed -i'' -e 's|"BindUsername": ".*"|"BindUsername": "cn=admin,dc=mm,dc=test,dc=com"|g' config/config.json
   525  	@sed -i'' -e 's|"BindPassword": ".*"|"BindPassword": "mostest"|g' config/config.json
   526  	@sed -i'' -e 's|"FirstNameAttribute": ".*"|"FirstNameAttribute": "cn"|g' config/config.json
   527  	@sed -i'' -e 's|"LastNameAttribute": ".*"|"LastNameAttribute": "sn"|g' config/config.json
   528  	@sed -i'' -e 's|"NicknameAttribute": ".*"|"NicknameAttribute": "cn"|g' config/config.json
   529  	@sed -i'' -e 's|"EmailAttribute": ".*"|"EmailAttribute": "mail"|g' config/config.json
   530  	@sed -i'' -e 's|"UsernameAttribute": ".*"|"UsernameAttribute": "uid"|g' config/config.json
   531  	@sed -i'' -e 's|"IdAttribute": ".*"|"IdAttribute": "uid"|g' config/config.json
   532  	@sed -i'' -e 's|"LoginIdAttribute": ".*"|"LoginIdAttribute": "uid"|g' config/config.json
   533  	@sed -i'' -e 's|"GroupDisplayNameAttribute": ".*"|"GroupDisplayNameAttribute": "cn"|g' config/config.json
   534  	@sed -i'' -e 's|"GroupIdAttribute": ".*"|"GroupIdAttribute": "entryUUID"|g' config/config.json
   535  
   536  config-reset: ## Resets the config/config.json file to the default.
   537  	@echo Resetting configuration to default
   538  	rm -f config/config.json
   539  	OUTPUT_CONFIG=$(PWD)/config/config.json go generate ./config
   540  
   541  clean: stop-docker ## Clean up everything except persistant server data.
   542  	@echo Cleaning
   543  
   544  	rm -Rf $(DIST_ROOT)
   545  	go clean $(GOFLAGS) -i ./...
   546  
   547  	cd $(BUILD_WEBAPP_DIR) && $(MAKE) clean
   548  
   549  	find . -type d -name data -not -path './vendor/*' | xargs rm -rf
   550  	rm -rf logs
   551  
   552  	rm -f xenia.log
   553  	rm -f xenia.log.jsonl
   554  	rm -f npm-debug.log
   555  	rm -f .prepare-go
   556  	rm -f enterprise
   557  	rm -f cover.out
   558  	rm -f ecover.out
   559  	rm -f *.out
   560  	rm -f *.test
   561  	rm -f imports/imports.go
   562  	rm -f cmd/platform/cprofile*.out
   563  	rm -f cmd/xenia/cprofile*.out
   564  
   565  nuke: clean clean-docker ## Clean plus removes persistent server data.
   566  	@echo BOOM
   567  
   568  	rm -rf data
   569  
   570  setup-mac: ## Adds macOS hosts entries for Docker.
   571  	echo $$(boot2docker ip 2> /dev/null) dockerhost | sudo tee -a /etc/hosts
   572  
   573  update-dependencies: ## Uses go get -u to update all the dependencies while holding back any that require it.
   574  	@echo Updating Dependencies
   575  
   576  	# Update all dependencies (does not update across major versions)
   577  	go get -u
   578  
   579  	# Keep back because of breaking API changes
   580  	go get -u github.com/segmentio/analytics-go@2.1.1
   581  
   582  	# Tidy up
   583  	go mod tidy
   584  
   585  	# Copy everything to vendor directory
   586  	go mod vendor
   587  
   588  
   589  todo: ## Display TODO and FIXME items in the source code.
   590  	@! ag --ignore Makefile --ignore-dir vendor --ignore-dir runtime TODO
   591  	@! ag --ignore Makefile --ignore-dir vendor --ignore-dir runtime XXX
   592  	@! ag --ignore Makefile --ignore-dir vendor --ignore-dir runtime FIXME
   593  	@! ag --ignore Makefile --ignore-dir vendor --ignore-dir runtime "FIX ME"
   594  ifeq ($(BUILD_ENTERPRISE_READY),true)
   595  	@! ag --ignore Makefile --ignore-dir vendor --ignore-dir runtime TODO enterprise/
   596  	@! ag --ignore Makefile --ignore-dir vendor --ignore-dir runtime XXX enterprise/
   597  	@! ag --ignore Makefile --ignore-dir vendor --ignore-dir runtime FIXME enterprise/
   598  	@! ag --ignore Makefile --ignore-dir vendor --ignore-dir runtime "FIX ME" enterprise/
   599  endif
   600  
   601  ## Help documentatin à la https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
   602  help:
   603  	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' ./Makefile | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'