UNPKG

4.05 kBJavaScriptView Raw
1/* @flow */
2'use strict'
3
4/* ::
5import type {
6 CLIFlags,
7 CLIOptions
8} from '../types.js'
9*/
10
11const util = require('util')
12
13const jwt = require('jsonwebtoken')
14const ora = require('ora')
15const temp = require('temp').track()
16
17const info = require('./info.js')
18const deploy = require('../lib/deploy.js')
19const scope = require('../lib/scope.js')
20const upsertAPIEnvironment = require('../lib/upsert-api-environment.js')
21const getAPIInstance = require('../lib/get-api-instance.js')
22const getAWSAccount = require('../lib/get-aws-account.js')
23const serverlessCommand = require('./serverless.js')
24const serverless = require('../lib/serverless.js')
25const fqdnHelper = require('../lib/utils/fully-qualified-domain-name.js')
26const values = require('../lib/values.js')
27
28module.exports = async function(
29 input /* : Array<string> */,
30 flags /* : CLIFlags */,
31 logger /* : typeof console */,
32 options /* : CLIOptions */
33) /* : Promise<void> */ {
34 const blinkMobileIdentity = options.blinkMobileIdentity
35 const cwd = flags.cwd
36 const env = flags.env
37 const force = flags.force
38 await info(input, flags, logger, options)
39 const confirmation = await deploy.confirm(logger, force, env)
40 if (!confirmation) {
41 return
42 }
43 const config = await scope.read(cwd)
44 const [awsCredentials, accessToken] = await deploy.authenticate(
45 config,
46 blinkMobileIdentity,
47 env
48 )
49
50 // If environment does not exist or --provision flag is set, full deploy
51 const apiInstance = await getAPIInstance(config, accessToken)
52 const environmentExists =
53 Array.isArray(apiInstance.environments) &&
54 apiInstance.environments.some(
55 apiEnvironment => apiEnvironment.environment === env
56 )
57 if (flags.provision || !environmentExists) {
58 const zipFilePath = await deploy.zip(cwd)
59 const bundleKey = await deploy.upload(zipFilePath, awsCredentials, config)
60 await deploy.deploy(bundleKey, accessToken, env, config)
61 return
62 }
63
64 const spinner = ora('Deploying project...').start()
65 try {
66 // otherwise, just update lambda
67 const service = scope.serverCLIServiceConfig(config)
68 const mkdir = util.promisify(temp.mkdir)
69 const tempDirectory = await mkdir('server-cli')
70 const awsAccount = await getAWSAccount(apiInstance, config, accessToken)
71
72 // if the analytics key is available, pass it through to be used by the instance
73 const analyticsFlags = {}
74 if (config.analytics) {
75 const analytics = config.analytics
76 if (analytics.key && analytics.secret) {
77 // generate JWT
78 analyticsFlags.analyticsCollectorToken = jwt.sign(
79 {
80 iss: analytics.key
81 },
82 analytics.secret,
83 {
84 expiresIn: '3650d'
85 }
86 )
87 }
88 analyticsFlags.analyticsOrigin =
89 analytics.origin || values.ANALYTICS_ORIGIN
90 }
91 await serverlessCommand(
92 [],
93 Object.assign({}, flags, analyticsFlags, {
94 out: tempDirectory,
95 deploymentBucket: service.bucket,
96 executionRole: `arn:aws:iam::${
97 awsAccount.accountNumber
98 }:role/ServerCLI-${config.project || ''}-execution`,
99 vpcSecurityGroups: apiInstance.vpcSecurityGroupIds || '',
100 vpcSubnets: apiInstance.vpcSubnetIds || ''
101 }),
102 logger,
103 options
104 )
105 const functionName = serverless.getFunctionName(config, env)
106 await serverless.executeSLSCommand(
107 ['deploy', 'function', '--function', functionName, '--force'],
108 {
109 cwd: tempDirectory,
110 env: Object.assign({}, process.env, {
111 AWS_ACCESS_KEY_ID: awsCredentials.accessKeyId,
112 AWS_SECRET_ACCESS_KEY: awsCredentials.secretAccessKey,
113 AWS_SESSION_TOKEN: awsCredentials.sessionToken
114 })
115 }
116 )
117 await upsertAPIEnvironment(config, apiInstance, env, cwd, accessToken)
118 spinner.succeed(
119 `Deployment complete - Origin: https://${fqdnHelper.getFQDN(
120 apiInstance.id,
121 env
122 )}`
123 )
124 } catch (error) {
125 spinner.fail('Deployment failed...')
126 throw error
127 }
128}