heroku
Version:
CLI to interact with Heroku
114 lines (113 loc) • 5.25 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const command_1 = require("@heroku-cli/command");
const core_1 = require("@oclif/core");
const heroku_cli_util_1 = require("@heroku/heroku-cli-util");
const DockerHelper = require("../../lib/container/docker_helper");
const helpers_1 = require("../../lib/container/helpers");
const debug_1 = require("../../lib/container/debug");
async function selectJobs(jobs, processTypes, recursive) {
let filteredJobs = {};
let selectedJobs = [];
if (Object.keys(jobs).length === 0) {
return selectedJobs;
}
if (recursive) {
if (processTypes.length > 0) {
filteredJobs = DockerHelper.filterByProcessType(jobs, processTypes);
}
else {
filteredJobs = jobs;
}
selectedJobs = await DockerHelper.chooseJobs(filteredJobs);
}
else if (jobs.standard) {
jobs.standard.forEach(pj => {
pj.resource = pj.resource.replace(/standard$/, processTypes[0]);
});
selectedJobs = jobs.standard || [];
}
return selectedJobs;
}
class Push extends command_1.Command {
async run() {
const { argv: processTypes, flags } = await this.parse(Push);
const { verbose, app, recursive, arg, 'context-path': contextPath } = flags;
if (verbose) {
debug_1.debug.enabled = true;
}
if (processTypes.length === 0 && !recursive) {
core_1.ux.error('Requires either --recursive or one or more process types', { exit: 1 });
}
if (processTypes.length > 1 && !recursive) {
core_1.ux.error('Requires exactly one target process type, or --recursive option', { exit: 1 });
}
const { body: appBody } = await this.heroku.get(`/apps/${app}`);
(0, helpers_1.ensureContainerStack)(appBody, 'push');
const herokuHost = process.env.HEROKU_HOST || 'heroku.com';
const registry = `registry.${herokuHost}`;
const dockerfiles = DockerHelper.getDockerfiles(process.cwd(), recursive);
const possibleJobs = DockerHelper.getJobs(`${registry}/${app}`, dockerfiles);
const jobs = await selectJobs(possibleJobs, processTypes, recursive);
if (jobs.length === 0) {
core_1.ux.error('No images to push', { exit: 1 });
}
const buildArgs = (arg === undefined) ? [] : arg.split(',');
try {
for (const job of jobs) {
if (job.name === 'standard') {
heroku_cli_util_1.hux.styledHeader(`Building ${processTypes} (${job.dockerfile})`);
}
else {
heroku_cli_util_1.hux.styledHeader(`Building ${job.name} (${job.dockerfile})`);
}
await DockerHelper.buildImage({
dockerfile: job.dockerfile,
resource: job.resource,
buildArgs,
path: contextPath,
arch: this.config.arch,
});
}
}
catch (error) {
core_1.ux.error(`docker build exited with ${error}`, { exit: 1 });
}
try {
for (const job of jobs) {
if (job.name === 'standard') {
heroku_cli_util_1.hux.styledHeader(`Pushing ${processTypes} (${job.dockerfile})`);
}
else {
heroku_cli_util_1.hux.styledHeader(`Pushing ${job.name} (${job.dockerfile})`);
}
await DockerHelper.pushImage(job.resource);
}
const plural = jobs.length !== 1;
core_1.ux.log(`Your image${plural ? 's have' : ' has'} been successfully pushed. You can now release ${plural ? 'them' : 'it'} with the 'container:release' command.`);
}
catch (error) {
core_1.ux.error(`docker push exited with ${error}`, { exit: 1 });
}
}
}
exports.default = Push;
Push.topic = 'container';
Push.description = 'builds, then pushes Docker images to deploy your Heroku app';
Push.strict = false;
Push.flags = {
app: command_1.flags.app({ required: true }),
verbose: command_1.flags.boolean({ char: 'v' }),
recursive: command_1.flags.boolean({ char: 'R', description: 'pushes Dockerfile.<process> found in current and subdirectories' }),
arg: command_1.flags.string({ description: 'set build-time variables' }),
'context-path': command_1.flags.string({ description: 'path to use as build context (defaults to Dockerfile dir)' }),
remote: command_1.flags.remote({ char: 'r' }),
};
Push.examples = [
'$ heroku container:push web # Pushes Dockerfile to web process type',
'$ heroku container:push worker # Pushes Dockerfile to worker process type',
'$ heroku container:push web worker --recursive # Pushes Dockerfile.web and Dockerfile.worker',
'$ heroku container:push --recursive # Pushes Dockerfile.*',
'$ heroku container:push web --arg ENV=live,HTTPS=on # Build-time variables',
'$ heroku container:push --recursive --context-path . # Pushes Dockerfile.* using current dir as build context',
];
;