Skip to content

Instantly share code, notes, and snippets.

@prashtx
Last active April 8, 2022 13:26
Show Gist options
  • Save prashtx/8609726 to your computer and use it in GitHub Desktop.
Save prashtx/8609726 to your computer and use it in GitHub Desktop.
Deploy a slug tarball to Heroku from node.
#!/usr/bin/env node
/*jslint node:true */
'use strict';
/*
* Usage:
* ./deploy-slug.js my-cool-git-free-app slug.tgz `heroku auth:token`
*/
var fs = require('fs');
var request = require('request');
var name = process.argv[2];
var base = 'https://api.heroku.com/apps/' + name;
var slug = process.argv[3];
var rawToken = process.env.TOKEN || process.argv[4];
var token = (new Buffer(':' + rawToken)).toString('base64');
function allocate(name, done) {
request.post({
url: base + '/slugs',
json: {
process_types: {}
},
headers: {
'Accept': 'application/vnd.heroku+json; version=3',
'Authorization': token
}
}, function (error, response, body) {
if (error) {
console.log(error);
process.exit(1);
}
if (response.statusCode < 200 || response.statusCode >= 300) {
console.log('Got status ' + response.statusCode + ' trying to allocate a slug.');
process.exit(1);
}
done(null, body.id, body.blob.url);
});
}
function publish(url, done) {
var buf = fs.readFileSync(slug);
var req = request({
url: url,
method: 'PUT',
body: buf,
headers: {
'Content-Type': ''
}
}, function (error, response, body) {
if (error) {
console.log(error);
process.exit(1);
}
if (response.statusCode !== 200) {
console.log('Got status ' + response.statusCode + ' when publishing the slug to ' + url);
process.exit(1);
}
done(null);
});
}
function release(id, done) {
request.post({
url: base + '/releases',
json: {
slug: id
},
headers: {
'Accept': 'application/vnd.heroku+json; version=3',
'Authorization': token
}
}, function (error, response, body) {
if (error) {
console.log(error);
process.exit(1);
}
if (response.statusCode !== 201) {
console.log('Got status code ' + response.statusCode + ' when releasing the slug');
process.exit(1);
}
done(null, body);
});
}
console.log('Allocating a slug on Heroku for app ' + name);
allocate(name, function (error, id, url) {
console.log('Slug ID is ' + id);
console.log('Publishing tarball to Heroku at ' + url);
publish(url, function (error) {
console.log('Releasing slug');
release(id, function (error, body) {
console.log('Successfully deployed slug.');
console.log('Version ' + body.version);
console.log('Updated at ' + body.updated_at);
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment