UNPKG

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