1 |
|
2 | 'use strict'
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | const util = require('util')
|
13 |
|
14 | const jwt = require('jsonwebtoken')
|
15 | const ora = require('ora')
|
16 | const temp = require('temp').track()
|
17 | const semver = require('semver')
|
18 |
|
19 | const pkg = require('../package.json')
|
20 | const info = require('./info.js')
|
21 | const deploy = require('../lib/deploy.js')
|
22 | const scope = require('../lib/scope.js')
|
23 | const upsertAPIEnvironment = require('../lib/upsert-api-environment.js')
|
24 | const getAPIInstance = require('../lib/get-api-instance.js')
|
25 | const getAWSAccount = require('../lib/get-aws-account.js')
|
26 | const serverlessCommand = require('./serverless.js')
|
27 | const serverless = require('../lib/serverless.js')
|
28 | const fqdnHelper = require('../lib/utils/fully-qualified-domain-name.js')
|
29 | const values = require('../lib/values.js')
|
30 |
|
31 | module.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 |
|
54 |
|
55 |
|
56 |
|
57 | const apiInstance = await getAPIInstance(config, accessToken)
|
58 | const existingEnvironment = (
|
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 |
|
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 |
|
82 | const analyticsFlags = {}
|
83 | if (config.analytics) {
|
84 | const analytics = config.analytics
|
85 | if (analytics.key && analytics.secret) {
|
86 |
|
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 | }
|