Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pubish npm package #763

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
*
!app/
!package.json
!package-lock.json
!README.md
!LICENSE
41 changes: 23 additions & 18 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,47 +5,45 @@ node_js:
services:
- docker

env:
global:
- BUILD_TIME="$(date '+%Y-%m-%d %H:%M:%S')"

script:
# Audit npm packages. Fail build whan a PR audit fails, otherwise report the vulnerability and proceed.
- if [ "${TRAVIS_PULL_REQUEST}" != "false" ]; then npx audit-ci --low -a node-fetch; else npx audit-ci --low -a node-fetch || true; fi
- npm run lint
- npm test
- npm run test:apollo:default
- npm run test:apollo:local
- npm run test:apollo:passport.local
- export BUILD_TIME=`date '+%Y-%m-%d %H:%M:%S'`
- docker build --rm --build-arg BUILD_TIME="$BUILD_TIME" --build-arg BUILD_ID="${TRAVIS_BUILD_NUMBER}-${TRAVIS_COMMIT}" -t "quay.io/razee/razeedash-api:${TRAVIS_COMMIT}" .
- travis_fold start "npx.audit-ci" && if [ "${TRAVIS_PULL_REQUEST}" != "false" ]; then npx audit-ci; else npx audit-ci || true; fi && travis_fold end "npx.audit-ci"
- travis_fold start "npm.lint" && npm run lint && travis_fold end "npm.lint"
- travis_fold start "npm.test" && npm test && travis_fold end "npm.test"
- travis_fold start "npm.test:apollo:default" && npm run test:apollo:default && travis_fold end "npm.test:apollo:default"
- travis_fold start "npm.test:apollo:local" && npm run test:apollo:local && travis_fold end "npm.test:apollo:local"
- travis_fold start "npm.test:apollo:passport.local" && npm run test:apollo:passport.local && travis_fold end "npm.test:apollo:passport.local"
- travis_fold start "docker.build" && docker build --rm --build-arg BUILD_TIME="$BUILD_TIME" --build-arg BUILD_ID="${TRAVIS_BUILD_NUMBER}-${TRAVIS_COMMIT}" -t "quay.io/razee/razeedash-api:${TRAVIS_COMMIT}" . && travis_fold end "docker.build"
- if [ -n "${TRAVIS_TAG}" ]; then docker tag quay.io/razee/razeedash-api:${TRAVIS_COMMIT} quay.io/razee/razeedash-api:${TRAVIS_TAG}; fi
- docker images
- ./build/process-template.sh kubernetes/razeedash-api/resource.yaml >/tmp/resource.yaml
- if [[ "${TRAVIS_TAG}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?$ ]]; then npm version --no-git-tag-version "${TRAVIS_TAG}"; fi

before_deploy:
- docker login -u="${QUAY_ID}" -p="${QUAY_TOKEN}" quay.io

deploy:
adamkingit marked this conversation as resolved.
Show resolved Hide resolved
# Deploy alpha builds
# Publish builds tagged as 1.2.3 for release, or 1.2.3-1 as release candidates
- provider: script
script: docker push "quay.io/razee/razeedash-api:${TRAVIS_TAG}"
skip_cleanup: true
draft: true
on:
tags: true
condition: ${TRAVIS_TAG} =~ ^[0-9]+\.[0-9]+\.[0-9]+_[0-9]{3}$
condition: ${TRAVIS_TAG} =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?$
- provider: releases
file: /tmp/resource.yaml
skip_cleanup: true
draft: true
on:
tags: true
condition: ${TRAVIS_TAG} =~ ^[0-9]+\.[0-9]+\.[0-9]+_[0-9]{3}$
condition: ${TRAVIS_TAG} =~ ^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+$
api_key: "${GITHUB_TOKEN}"
name: "${TRAVIS_TAG}"
# Deploy released builds
- provider: script
script: docker push "quay.io/razee/razeedash-api:${TRAVIS_TAG}"
skip_cleanup: true
on:
tags: true
condition: ${TRAVIS_TAG} =~ ^[0-9]+\.[0-9]+\.[0-9]+$
- provider: releases
file: /tmp/resource.yaml
skip_cleanup: true
Expand All @@ -54,3 +52,10 @@ deploy:
condition: ${TRAVIS_TAG} =~ ^[0-9]+\.[0-9]+\.[0-9]+$
api_key: "${GITHUB_TOKEN}"
name: "${TRAVIS_TAG}"
- provider: npm
email: "${NPMJS_EMAIL}"
api_key: "${NPMJS_API_KEY}"
skip_cleanup: true
on:
tags: true
condition: ${TRAVIS_TAG} =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?$
13 changes: 6 additions & 7 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ USER node
WORKDIR /home/node

COPY --chown=node . /home/node
RUN npm install --production --loglevel=warn
RUN npm ci --production --loglevel=warn


#######################################
Expand All @@ -36,13 +36,12 @@ FROM node:lts-alpine
USER node
WORKDIR /home/node

RUN export BUILD_TIME=`date '+%Y-%m-%d %H:%M:%S'`
ARG BUILD_TIME
ENV BUILD_TIME=${BUILD_TIME}
ARG BUILD_ID
ENV BUILD_ID=${BUILD_ID}
ARG BUILD_TIME="$(date '+%Y-%m-%d %H:%M:%S')"
ENV BUILD_TIME="${BUILD_TIME}"
ARG BUILD_ID="dev"
ENV BUILD_ID="${BUILD_ID}"

COPY --chown=node --from=buildImg /home/node /home/node

EXPOSE 3333
CMD ["npm", "start"]
CMD ["./bin/main"]
198 changes: 96 additions & 102 deletions app/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright 2019 IBM Corp. All Rights Reserved.
* Copyright 2019, 2021 IBM Corp. 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.
Expand All @@ -13,114 +13,108 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/

const express = require('express');
const app = express();
const http = require('http');
const compression = require('compression');
const body_parser = require('body-parser');
const ebl = require('express-bunyan-logger');
const addRequestId = require('express-request-id')();
const {router, initialize} = require('./routes/index.js');
const log = require('./log').log;
const getBunyanConfig = require('./utils/bunyan.js').getBunyanConfig;
const port = 3333;

const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');
const apollo = require('./apollo');

const promClient = require('prom-client');
const collectDefaultMetrics = promClient.collectDefaultMetrics;
collectDefaultMetrics({ timeout: 5000 }); //Collect all default metrics
const connections = new promClient.Gauge({ name: 'razee_server_connections_count', help: 'Razee server request count' });

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));

router.use(ebl(getBunyanConfig('razeedash-api')));

app.set('trust proxy', true);
app.use(addRequestId);
app.use(compression());

app.use(body_parser.json({ limit: '8mb' }));
app.use(body_parser.urlencoded({ extended: false }));
app.set('port', port);
app.use('/api', router); // only for everything under /api

// eslint-disable-next-line no-unused-vars
app.use(function errorHandler(err, req, res, next) {
if (err) {
if (req.log && req.log.error)
req.log.error(err);
else
log.error(err);
if (!res.headersSent) {
let statusCode = err.statusCode || 500;
return res.status(statusCode).send();
} else {
return next(err);
function run() {
const express = require('express');
const app = express();
const http = require('http');
const compression = require('compression');
const body_parser = require('body-parser');
const ebl = require('express-bunyan-logger');
const addRequestId = require('express-request-id')();
const { router, initialize } = require('./routes/index.js');
const log = require('./log').log;
const getBunyanConfig = require('./utils/bunyan.js').getBunyanConfig;
const port = 3333;

const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');
const apollo = require('./apollo');

const promClient = require('prom-client');
const collectDefaultMetrics = promClient.collectDefaultMetrics;
collectDefaultMetrics({ timeout: 5000 }); //Collect all default metrics
const connections = new promClient.Gauge({ name: 'razee_server_connections_count', help: 'Razee server request count' });

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));

router.use(ebl(getBunyanConfig('razeedash-api')));

app.set('trust proxy', true);
app.use(addRequestId);
app.use(compression());

app.use(body_parser.json({ limit: '8mb' }));
app.use(body_parser.urlencoded({ extended: false }));
app.set('port', port);
app.use('/api', router); // only for everything under /api

app.use(function errorHandler(err, req, res, next) {
if (err) {
if (req.log && req.log.error)
req.log.error(err);
else
log.error(err);
if (!res.headersSent) {
let statusCode = err.statusCode || 500;
return res.status(statusCode).send();
} else {
return next(err);
}
}
}
next();
});

app.get('/metrics', function (request, response) {
response.writeHead(200, {'Content-Type': promClient.register.contentType});
response.end(promClient.register.metrics());
});

const server = http.createServer(app);

server.on('ready', onReady);
server.on('error', onError);
server.on('listening', onListening);
server.on('connection', onConnection);

initialize().then((db) => {
app.set('db', db);
server.emit('ready');
});


async function onReady() {
await apollo({app, httpServer: server});
server.listen(port);
}
next();
});

function onListening() {
const addr = server.address();
const bind = typeof addr === 'string' ? `pipe ${addr}` : `port ${addr.port}`;
log.info(`🏄 razeedash-api listening on ${bind}/api`);
}
app.get('/metrics', function (request, response) {
response.writeHead(200, { 'Content-Type': promClient.register.contentType });
response.end(promClient.register.metrics());
});

function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
const server = http.createServer(app);

const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;
server.on('ready', async () => {
await apollo({ app, httpServer: server });
server.listen(port);
});

// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
log.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
log.error(bind + ' is already in use');
process.exit(1);
break;
default:
server.on('error', (error) => {
if (error.syscall !== 'listen') {
throw error;
}
}
const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
log.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
log.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
});

}
server.on('listening', () => {
const addr = server.address();
const bind = typeof addr === 'string' ? `pipe ${addr}` : `port ${addr.port}`;
log.info(`🏄 razeedash-api listening on ${bind}/api`);
});

// emitted when new client connects
function onConnection(){
server.getConnections(function(error,count){
//console.log('Number of concurrent connections to the server : ' + count);
connections.set(count);
server.on('connection', () => {
server.getConnections(function (error, count) {
//console.log('Number of concurrent connections to the server : ' + count);
connections.set(count);
});
});

initialize().then((db) => {
app.set('db', db);
server.emit('ready');
});
}

module.exports = {
run
};
3 changes: 3 additions & 0 deletions bin/main
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env node

require('..').run();
Loading