Makefile 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. DOCKER_COMPOSE_FLAGS ?= -f docker-compose.yml --log-level ERROR
  2. BUILD_NUMBER ?= local
  3. BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD)
  4. PROJECT_NAME = web
  5. BUILD_DIR_NAME = $(shell pwd | xargs basename | tr -cd '[a-zA-Z0-9_.\-]')
  6. DOCKER_COMPOSE := BUILD_NUMBER=$(BUILD_NUMBER) \
  7. BRANCH_NAME=$(BRANCH_NAME) \
  8. PROJECT_NAME=$(PROJECT_NAME) \
  9. MOCHA_GREP=${MOCHA_GREP} \
  10. SHARELATEX_CONFIG=/app/test/acceptance/config/settings.test.coffee \
  11. docker-compose ${DOCKER_COMPOSE_FLAGS}
  12. MODULE_DIRS := $(shell find modules -mindepth 1 -maxdepth 1 -type d -not -name '.git' )
  13. MODULE_MAKEFILES := $(MODULE_DIRS:=/Makefile)
  14. MODULE_NAME=$(shell basename $(MODULE))
  15. LESSC := node_modules/.bin/lessc
  16. CLEANCSS := node_modules/.bin/cleancss
  17. LESS_FILES := $(shell find public/stylesheets -name '*.less')
  18. LESSC_COMMON_FLAGS := --source-map --autoprefix="last 2 versions, ie >= 10"
  19. CLEANCSS_FLAGS := --s0 --source-map
  20. LESS_SL_FILE := public/stylesheets/sl-style.less
  21. CSS_SL_FILE := public/stylesheets/sl-style.css
  22. LESS_OL_FILE := public/stylesheets/style.less
  23. CSS_OL_FILE := public/stylesheets/style.css
  24. LESS_OL_LIGHT_FILE := public/stylesheets/light-style.less
  25. CSS_OL_LIGHT_FILE := public/stylesheets/light-style.css
  26. LESS_OL_IEEE_FILE := public/stylesheets/ieee-style.less
  27. CSS_OL_IEEE_FILE := public/stylesheets/ieee-style.css
  28. CSS_FILES := $(CSS_SL_FILE) $(CSS_OL_FILE) $(CSS_OL_LIGHT_FILE) $(CSS_OL_IEEE_FILE)
  29. public/stylesheets/%.css: $(LESS_FILES)
  30. $(LESSC) $(LESSC_COMMON_FLAGS) $(@D)/$*.less $(@D)/$*.css
  31. css_full: $(CSS_FILES)
  32. css: $(CSS_OL_FILE)
  33. minify: $(CSS_FILES)
  34. $(CLEANCSS) $(CLEANCSS_FLAGS) -o $(CSS_SL_FILE) $(CSS_SL_FILE)
  35. $(CLEANCSS) $(CLEANCSS_FLAGS) -o $(CSS_OL_FILE) $(CSS_OL_FILE)
  36. $(CLEANCSS) $(CLEANCSS_FLAGS) -o $(CSS_OL_LIGHT_FILE) $(CSS_OL_LIGHT_FILE)
  37. $(CLEANCSS) $(CLEANCSS_FLAGS) -o $(CSS_OL_IEEE_FILE) $(CSS_OL_IEEE_FILE)
  38. compile: css
  39. compile_full: css_full
  40. $(MODULE_MAKEFILES): Makefile.module
  41. @set -e; \
  42. for makefile in $(MODULE_MAKEFILES); \
  43. do \
  44. cp Makefile.module $$makefile; \
  45. done
  46. #
  47. # Clean
  48. #
  49. clean:
  50. rm -f public/stylesheets/*.css*
  51. clean_ci:
  52. $(DOCKER_COMPOSE) down -v -t 0
  53. docker container list | grep 'days ago' | cut -d ' ' -f 1 - | xargs -r docker container stop
  54. docker image prune -af --filter "until=48h"
  55. docker network prune -f
  56. #
  57. # Tests
  58. #
  59. test: test_unit test_frontend test_acceptance
  60. test_module: test_unit_module test_acceptance_module
  61. #
  62. # Unit tests
  63. #
  64. test_unit: test_unit_app test_unit_modules
  65. test_unit_app:
  66. COMPOSE_PROJECT_NAME=unit_test_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) down -v -t 0
  67. COMPOSE_PROJECT_NAME=unit_test_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) run --name unit_test_$(BUILD_DIR_NAME) --rm test_unit
  68. COMPOSE_PROJECT_NAME=unit_test_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) down -v -t 0
  69. test_unit_modules:
  70. @set -e; \
  71. for dir in $(MODULE_DIRS); \
  72. do \
  73. if [ -e $$dir/test/unit ]; then \
  74. $(MAKE) test_unit_module MODULE=$$dir; \
  75. fi; \
  76. done
  77. test_unit_module: $(MODULE_MAKEFILES)
  78. @if [ -e modules/$(MODULE_NAME)/test/unit ]; then \
  79. COMPOSE_PROJECT_NAME=unit_test_$(BUILD_DIR_NAME)_$(MODULE_NAME) $(DOCKER_COMPOSE) down -v -t 0 \
  80. && cd modules/$(MODULE_NAME) && COMPOSE_PROJECT_NAME=unit_test_$(BUILD_DIR_NAME)_$(MODULE_NAME) $(MAKE) test_unit \
  81. && cd $(CURDIR) && COMPOSE_PROJECT_NAME=unit_test_$(BUILD_DIR_NAME)_$(MODULE_NAME) $(DOCKER_COMPOSE) down -v -t 0; \
  82. fi
  83. #
  84. # Frontend unit tests
  85. #
  86. test_frontend: compile build_test_frontend test_frontend_run
  87. test_frontend_run:
  88. COMPOSE_PROJECT_NAME=frontend_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) down -v -t 0
  89. COMPOSE_PROJECT_NAME=frontend_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) run --rm test_frontend
  90. COMPOSE_PROJECT_NAME=frontend_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) down -v -t 0
  91. test_frontend_build_run: build_test_frontend test_frontend_run
  92. #
  93. # Acceptance tests
  94. #
  95. test_acceptance: test_acceptance_app test_acceptance_modules
  96. test_acceptance_app:
  97. COMPOSE_PROJECT_NAME=acceptance_test_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) down -v -t 0
  98. COMPOSE_PROJECT_NAME=acceptance_test_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) run --rm test_acceptance
  99. COMPOSE_PROJECT_NAME=acceptance_test_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) down -v -t 0
  100. test_acceptance_modules:
  101. @set -e; \
  102. for dir in $(MODULE_DIRS); \
  103. do \
  104. if [ -e $$dir/test/acceptance ]; then \
  105. $(MAKE) test_acceptance_module MODULE=$$dir; \
  106. fi; \
  107. done
  108. test_acceptance_module: $(MODULE_MAKEFILES)
  109. @if [ -e modules/$(MODULE_NAME)/test/acceptance ]; then \
  110. COMPOSE_PROJECT_NAME=acceptance_test_$(BUILD_DIR_NAME)_$(MODULE_NAME) $(DOCKER_COMPOSE) down -v -t 0 \
  111. && cd modules/$(MODULE_NAME) && COMPOSE_PROJECT_NAME=acceptance_test_$(BUILD_DIR_NAME)_$(MODULE_NAME) $(MAKE) test_acceptance \
  112. && cd $(CURDIR) && COMPOSE_PROJECT_NAME=acceptance_test_$(BUILD_DIR_NAME)_$(MODULE_NAME) $(DOCKER_COMPOSE) down -v -t 0; \
  113. fi
  114. #
  115. # CI tests
  116. #
  117. ci:
  118. MOCHA_ARGS="--reporter tap" \
  119. $(MAKE) test
  120. #
  121. # Lint & format
  122. #
  123. format:
  124. npm -q run format
  125. format_fix:
  126. npm -q run format:fix
  127. lint:
  128. npm -q run lint
  129. #
  130. # Build & publish
  131. #
  132. build:
  133. docker build --pull --tag ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \
  134. --tag gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \
  135. .
  136. build_test_frontend:
  137. COMPOSE_PROJECT_NAME=frontend_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) build test_frontend
  138. publish:
  139. docker push $(DOCKER_REPO)/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER)
  140. tar:
  141. COMPOSE_PROJECT_NAME=tar_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) run --rm tar
  142. COMPOSE_PROJECT_NAME=tar_$(BUILD_DIR_NAME) $(DOCKER_COMPOSE) down -v -t 0
  143. .PHONY:
  144. css_full css minify minify_css minify_es compile compile_full \
  145. compile_css_full compile_modules compile_modules_full clean clean_frontend \
  146. clean_css clean_tests clean_ci test test_module test_unit test_unit_app \
  147. test_unit_modules test_unit_module test_frontend test_frontend_run \
  148. test_frontend_build_run test_acceptance test_acceptance_app \
  149. test_acceptance_modules test_acceptance_module ci format format_fix lint \
  150. build build_test_frontend publish tar