Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,18 @@ module.exports = {
options: {
secretKey: 'a super secret key, maybe with emojis? 🍕',
addressCallback: 'http://localhost/endpoint/for/notifying',
callbackPayload: { 'extraData': 'something' },
requestBodyHandler: (reqBody) => {
// Do something with request body
},
preDeploy: ({ spawn, eventEmitter}) => {
// Do things before deploying, then emit an event
// to start deployment process
const prepare = spawn('npm', ['run', 'mytask'])
prepare.on('exit', (exitcode) => {
eventEmitter.emit('predeploy-finished');
});
}
},
},
],
Expand Down Expand Up @@ -56,3 +68,5 @@ axios(config)

* secretKey - Required; The secret key which is required for triggering the deployment process.
* addressCallback - Optional; If defined, the plugin will send REST request with data on the deployment process.
* requestBodyHandler - Optional; function to handle/process additional data passed in request body
* preDeploy - Optional; function that run before the actual deployment process started
71 changes: 46 additions & 25 deletions gatsby-node.js
Original file line number Diff line number Diff line change
@@ -1,48 +1,29 @@
const { spawn } = require("child_process");
const axios = require("axios");
const bodyParser = require('body-parser')
const bodyParser = require('body-parser');
const events = require('events');

exports.onCreateDevServer = ({ app, reporter }, pluginOptions) => {

const { secretKey, addressCallback } = pluginOptions;
const { secretKey, addressCallback, requestBodyHandler, preDeploy, callbackPayload } = pluginOptions;

if (!secretKey) {
reporter.error('You must have a secret key. Please look at the plugin documentation.');
return;
}

const notifyEventListener = (data) => {

if (!addressCallback) {
return;
}

axios.post(addressCallback, data).then((response) => {
reporter.success('The event has been arrived to the listener');
}, (error) => {
reporter.error(error);
});
};

reporter.success('The trigger deploy plugin is ready.');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('/deploy', function(req, res) {

const payloadSecretKey = req.headers['secret_key'] || req.body['secret_key'];

if (payloadSecretKey !== secretKey) {
const message = 'The secret which passed in the header is missing or does not matching the desired secret key';

reporter.error(message);
res.status(401).send({message});
}

res.status(200).send({message: 'Deployment process has started'});

// Deploying.
const startDeployment = ({predeploy, payloadSecretKey, eventEmitter}) => () => {
const deploy = spawn('npm', ['run', 'deploy']);

deploy.stderr.on('data', (data) => {
Expand All @@ -59,12 +40,52 @@ exports.onCreateDevServer = ({ app, reporter }, pluginOptions) => {
deploy.on('close', (code) => {
reporter.success(`The deployment process has went OK`);

notifyEventListener({
let notifyPayload = {
event: 'deployment',
status: 'succeeded',
secret_key: payloadSecretKey,
});
}

if (typeof callbackPayload !== 'undefined') {
notifyPayload = {...notifyPayload, ...callbackPayload};
}

if (predeploy) {
eventEmitter.removeListener('predeploy-finished', startDeployment);
}

notifyEventListener(notifyPayload);
});
}

reporter.success('The trigger deploy plugin is ready.');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('/deploy', function(req, res) {
const payloadSecretKey = req.headers['secret_key'] || req.body['secret_key'];
const eventEmitter = new events.EventEmitter();
if (payloadSecretKey !== secretKey) {
const message = 'The secret which passed in the header is missing or does not matching the desired secret key';

reporter.error(message);
res.status(401).send({message});
}

res.status(200).send({message: 'Deployment process has started'});

// Handle request body
if (typeof requestBodyHandler !== 'undefined') {
requestBodyHandler(req.body);
}

// Handle pre deploy
if (typeof preDeploy !== 'undefined') {
preDeploy({ spawn, eventEmitter });
eventEmitter.on('predeploy-finished', startDeployment({preDeploy, payloadSecretKey, eventEmitter }));
} else {
startDeployment({preDeploy, payloadSecretKey, eventEmitter});
}
})
}