Skip to content
Snippets Groups Projects
Commit 128282d7 authored by Lucendio's avatar Lucendio
Browse files

Add make target to start db and app in a transparent way

* adjust mongoose configuration
* documents more make targets in readme
* applied npm scripts convention of the client to the corresponding
  server scripts in order to be more consistent (`start` is now meant
  for local development)
parent 317dd7b4
No related branches found
No related tags found
No related merge requests found
......@@ -47,6 +47,10 @@ MONGODB_SHA256 ?= $(shell cat $(STACK_DIR)/versions/mongodb.256.sums | grep $(PL
SERVER_PUBLIC_URL ?= http://localhost:3000
CLIENT_BUILD_PATH ?= $(MKFILE_DIR)/app/server/src/public
default: all
......@@ -66,28 +70,32 @@ install-deps: $(APP_NODE_MODULE_DIRS)
run-db: export PATH := $(BIN_DIR):$(PATH)
run-db: | $(LOG_DIR)/ $(DATA_DIR)/
mkdir -p $(DATA_DIR)/db
mongod --config $(STACK_DIR)/mongod.conf
mongod --config $(STACK_DIR)/local.mongod.conf
.PHONY: run-local
run-local: export PATH := $(BIN_DIR):$(PATH)
run-local:
run-local: build
cd $(MKFILE_DIR)/app/server \
&& npm run dev
&& npm start
.PHONY: test
test: export PATH := $(BIN_DIR):$(PATH)
test: randomString = $(shell LC_ALL=C tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 | head -n 1)
test:
cd $(MKFILE_DIR)/app/client \
&& npm run test
cd $(MKFILE_DIR)/app/server \
PORT=3002 \
MONGODB_URL=mongodb://localhost:27017/$(randomString) \
JWT_SECRET=$(randomString) \
&& npm run test
.PHONY: test-local
test-local: export PATH := $(BIN_DIR):$(PATH)
test-local:
.PHONY: test-client-local
test-client-local: export PATH := $(BIN_DIR):$(PATH)
test-client-local:
cd $(MKFILE_DIR)/app/client \
&& npm run test:dev
......@@ -95,10 +103,11 @@ test-local:
.PHONY: build
build: export PATH := $(BIN_DIR):$(PATH)
build:
rm -rf $(CLIENT_BUILD_PATH)
cd $(MKFILE_DIR)/app/client \
&& rm -rf ./build \
&& PUBLIC_URL=http://localhost:3000 \
npm run build
&& PUBLIC_URL=$(SERVER_PUBLIC_URL) \
BUILD_PATH=$(CLIENT_BUILD_PATH) \
node ./scripts/build.js
......@@ -108,6 +117,32 @@ clean: clean-stack clean-modules
.PHONY: start
start: export PATH := $(BIN_DIR):$(PATH)
start: SERVER_PUBLIC_URL = http://localhost:3001
start: build
start: | $(DATA_DIR)/ $(LOG_DIR)/
mkdir -p $(DATA_DIR)/db
(exec mongod \
--port 27017 \
--bind_ip localhost \
--logpath /dev/stdout \
--dbpath $(DATA_DIR)/db \
) & PIDS[1]=$$!; \
\
(PORT=3001 \
MONGODB_URL=mongodb://localhost:27017/todo-app \
JWT_SECRET=myjwtsecret \
exec node $(MKFILE_DIR)/app/server/src/index.js \
) & PIDS[2]=$$!; \
\
for PID in $${PIDS[*]}; do wait $${PID}; done;
$(LOCAL_DIR)/%/:
mkdir -p $(@)
......
......@@ -13,10 +13,16 @@ For more information regarding the app, please have a look into its [README](./a
The `Makefile` is the main entry point for this repository. It's meant to be used for documentation purposes and local
development/invocation only. The following commands are available:
*NOTE:*
The `Makefile` is solely meant to showcase how to interact with the application and the code base, it is not recommended
to invoke make targets from the CI/CD, but rather use automation-specific interfaces (e.g. `Jenkinsfile`, `.travis.yml`,
etc.), which would then invoke logic also shown under some make target.
#### `make install-stack`
* install technology stack (nodejs, npm, mongodb) locally within the project
* install technology stack (Nodejs, npm, MongoDB) as prebuild binaries locally within the project
* in order for the application-related targets to pick up these binaries, the `PATH` variable is adjusted and exported
for the corresponding target
......@@ -38,22 +44,40 @@ development/invocation only. The following commands are available:
#### `make run-local`
*NOTE: it might be desired to start a database first (e.g. `make run-db`)*
* build client
* start server with development configuration
* file watcher enabled
#### `make test-local`
#### `make test`
*NOTE: requires MongoDB to be running (e.g. `make run-db`)*
* run client tests in [CI mode](https://jestjs.io/docs/en/cli.html#--ci) (exits regardless of the test outcome; closed tty)
* run server tests in [CI mode](https://jestjs.io/docs/en/cli.html#--ci) (exits regardless of the test outcome; closed tty)
#### `make test-client-local`
* run client tests
#### `make test`
#### `make build`
* run client tests in [CI mode](https://jestjs.io/docs/en/cli.html#--ci) (exits regardless of the test outcome; closed tty)
* run server tests in [CI mode](https://jestjs.io/docs/en/cli.html#--ci) (exits regardless of the test outcome; closed tty)
* build client
#### `make clean`
* removes all dependencies that were installed locally
* node, npm, mongo
* npm modules for server and client
### Notes
#### `make start`
* the `Makefile` shows how to interact with the code base, it is not recommended to invoke make targets from the CI/CD,
but rather use automation-specific interfaces (e.g. `Jenkinsfile`, `.travis.yml`, etc.).
* start a MongoDB process with an explicit inline-configuration
* start the application process with variables being set only visible to that invocation (as an alternative to the
environment configuration file `app/server/dev.env`)
* block terminal to keep it as the output medium. To stop again, send a termination signal via `Ctrl+C`
......@@ -4,9 +4,9 @@
"main": "index.js",
"license": "MIT",
"scripts": {
"start": "node src/index",
"dev": "env-cmd -f ./dev.env nodemon src/index",
"test": "env-cmd -f ./dev.env jest --ci"
"start": "env-cmd -f ./dev.env nodemon src/index.js",
"test": "jest --ci",
"test:dev": "env-cmd -f ./dev.env jest"
},
"devDependencies": {
"@shelf/jest-mongodb": "^1.1.5",
......
......@@ -7,12 +7,13 @@ const mongooseInstance_ = mongoose.connect(
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true,
// NOTE: as of the docs `connectTimeoutMS` should be used when `useUnifiedTopology: true`,
// but apparently it has no impact what so ever. Instead, the following works ¯\_(ツ)_/¯
serverSelectionTimeoutMS: 10000 // 10 sec
useUnifiedTopology: true,
heartbeatFrequencyMS: 1000 * 5, // 1 sec * 5
serverSelectionTimeoutMS: 1000 * 10 // 1 sec * 10
},
// TODO: make use of the event emitter to indicate each retry in logs & to increase
// the overall timeout to 10 min (see https://mongoosejs.com/docs/connections.html#connection-events)
function( err ){
if( typeof err !== 'undefined' && err !== null ){
console.error( new Error( `Cannot connect to database: ${ process.env.MONGODB_URL }` ) );
......
File moved
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment