1 |
|
2 | 'use strict'
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | const util = require('util')
|
12 |
|
13 | const jwt = require('jsonwebtoken')
|
14 | const ora = require('ora')
|
15 | const temp = require('temp').track()
|
16 |
|
17 | const info = require('./info.js')
|
18 | const deploy = require('../lib/deploy.js')
|
19 | const scope = require('../lib/scope.js')
|
20 | const upsertAPIEnvironment = require('../lib/upsert-api-environment.js')
|
21 | const getAPIInstance = require('../lib/get-api-instance.js')
|
22 | const getAWSAccount = require('../lib/get-aws-account.js')
|
23 | const serverlessCommand = require('./serverless.js')
|
24 | const serverless = require('../lib/serverless.js')
|
25 | const fqdnHelper = require('../lib/utils/fully-qualified-domain-name.js')
|
26 | const values = require('../lib/values.js')
|
27 |
|
28 | module.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 |
|
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 |
|
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 |
|
73 | const analyticsFlags = {}
|
74 | if (config.analytics) {
|
75 | const analytics = config.analytics
|
76 | if (analytics.key && analytics.secret) {
|
77 |
|
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 | }
|