UNPKG

firebase-ci

Version:

Simplified Firebase interaction for continuous integration including deploying hosting, functions, and database/storage rules.

164 lines (121 loc) 5.23 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.runActions = runActions; exports.default = deploy; var _get2 = _interopRequireDefault(require("lodash/get")); var _commandExists = _interopRequireDefault(require("command-exists")); var _chalk = _interopRequireDefault(require("chalk")); var _copyVersion = _interopRequireDefault(require("./copyVersion")); var _mapEnv = _interopRequireDefault(require("./mapEnv")); var _files = require("../utils/files"); var _logger = require("../utils/logger"); var _commands = require("../utils/commands"); var _deps = require("../utils/deps"); var _ci = require("../utils/ci"); var _async = require("../utils/async"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const SKIP_PREFIX = 'Skipping Firebase Deploy'; function getFirebaseTokenStr() { const { FIREBASE_TOKEN, FIREBASE_CI_WRAP_TOKEN } = process.env; if (!FIREBASE_TOKEN) { return ''; } if (FIREBASE_CI_WRAP_TOKEN) { (0, _logger.info)('Wrapping token in quotes'); return `--token "${FIREBASE_TOKEN}"`; } return `--token ${FIREBASE_TOKEN}`; } async function runActions() { (0, _copyVersion.default)(); const settings = (0, _files.getFile)('.firebaserc'); if ((0, _files.functionsExists)() && settings.ci && settings.ci.mapEnv) { const [mapEnvErr] = await (0, _async.to)((0, _mapEnv.default)()); if (mapEnvErr) { (0, _logger.error)('Could not map CI environment variables to Functions environment: ', mapEnvErr); throw mapEnvErr; } } (0, _logger.info)(`No ci action settings found in ${_chalk.default.cyan('.firebaserc')}. Skipping action phase.`); } async function deploy(opts) { const settings = (0, _files.getFile)('.firebaserc'); const firebaseJson = (0, _files.getFile)('firebase.json'); const branchName = (0, _ci.getBranch)(); if (typeof branchName === 'undefined' || opts && opts.test) { const nonCiMessage = `${_chalk.default.cyan(SKIP_PREFIX)} - Not a supported CI environment`; (0, _logger.warn)(nonCiMessage); return nonCiMessage; } if ((0, _ci.isPullRequest)()) { const pullRequestMessage = `${_chalk.default.cyan(SKIP_PREFIX)} - Build is a Pull Request`; (0, _logger.info)(pullRequestMessage); return pullRequestMessage; } if (!settings) { (0, _logger.error)('.firebaserc file is required'); throw new Error('.firebaserc file is required'); } if (!firebaseJson) { (0, _logger.error)('firebase.json file is required'); throw new Error('firebase.json file is required'); } const fallbackProjectName = (0, _ci.getFallbackProjectKey)(); const projectKey = (0, _ci.getProjectKey)(opts); const projectName = (0, _get2.default)(settings, `projects.${projectKey}`); const fallbackProjectSetting = (0, _get2.default)(settings, `projects.${fallbackProjectName}`); if (!projectName) { const nonProjectBranch = `${SKIP_PREFIX} - Project ${_chalk.default.cyan(projectKey)} is not an alias, checking for fallback...`; (0, _logger.info)(nonProjectBranch); if (!fallbackProjectSetting) { const nonFallbackBranch = `${SKIP_PREFIX} - Fallback Project: ${_chalk.default.cyan(fallbackProjectName)} is a not an alias, exiting...`; (0, _logger.info)(nonFallbackBranch); return nonProjectBranch; } return nonProjectBranch; } const { FIREBASE_TOKEN } = process.env; if (!FIREBASE_TOKEN) { (0, _logger.warn)(`${_chalk.default.cyan('FIREBASE_TOKEN')} environment variable not found, falling back to current Firebase auth`); } const message = await (0, _ci.getDeployMessage)(); if (!settings.skipDependencyInstall) { await (0, _deps.installDeps)(opts, settings); } else { (0, _logger.info)('firebase-tools and functions dependencies installs skipped'); } if (!opts.simple) { await runActions(opts.actions); } else { (0, _logger.info)('Simple mode enabled. Skipping CI actions'); } const firebaseTokenStr = getFirebaseTokenStr(); const npxExists = _commandExists.default.sync('npx'); const onlyString = opts && opts.only ? `--only ${opts.only}` : ''; const exceptString = opts && opts.except ? `--except ${opts.except}` : ''; const deployArgs = ['deploy', ...onlyString.split(' '), ...exceptString.split(' '), ...firebaseTokenStr.split(' '), '--non-interactive', '--project', projectKey, '--message', message].filter(Boolean); if (process.env.FIREBASE_CI_DEBUG || settings.debug) { deployArgs.push('--debug'); (0, _logger.info)(`Calling deploy with: ${deployArgs.join(' ')}`); } if (opts && opts.force) { deployArgs.push('--force'); } (0, _logger.info)(`Deploying to ${branchName} branch to ${projectKey} Firebase project "${projectName}"`); const [deployErr] = await (0, _async.to)((0, _commands.runCommand)({ command: npxExists ? 'npx' : 'firebase', args: npxExists ? ['firebase'].concat(deployArgs) : deployArgs, successMsg: `Successfully Deployed ${branchName} branch to ${projectKey} Firebase project "${projectName}"` })); if (deployErr) { (0, _logger.error)('Error in deploying to firebase:\n ', deployErr); throw deployErr; } }