-
Notifications
You must be signed in to change notification settings - Fork 124
/
deploy-modules-stage.ts
94 lines (85 loc) · 2.8 KB
/
deploy-modules-stage.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import { Construct } from '@aws-cdk/cdk'
import codeBuild = require('@aws-cdk/aws-codebuild')
import { defaultEnvironment } from '../code-build-environments'
import StageName from '../stage-name'
import config from '../../config'
import CodeBuildRole from '../code-build-role'
import { Bucket } from '@aws-cdk/aws-s3'
import {
Parallel,
Choice,
Condition,
Succeed
} from '@aws-cdk/aws-stepfunctions'
import { BuildJob } from './build-job'
import { Function } from '@aws-cdk/aws-lambda'
export interface DeployModulesStageProps {
stageNo: number
stageModules: string[]
stageName: StageName
codeBuildRole: CodeBuildRole
checkCodeBuildFunction: Function
runCodeBuildFunction: Function
artifactsBucket: Bucket
}
export default class DeployModulesStage extends Construct {
readonly deployModuleProjects: { [name: string]: codeBuild.Project } = {}
readonly stageState: Parallel
constructor(scope: Construct, props: DeployModulesStageProps) {
super(scope, `${props.stageName}DeployStage${props.stageNo}`)
const { stageName, stageModules, stageNo } = props
this.stageState = new Parallel(this, `${stageName}Deploy${stageNo}`, {
inputPath: '$',
outputPath: '$'
})
stageModules.forEach((moduleName, moduleIndex) => {
this.deployModuleProjects[moduleName] = new codeBuild.Project(
this,
`${stageName}_${moduleName}_deploy_project`,
{
projectName: `${stageName}_${moduleName}_deploy`,
buildSpec: {
version: '0.2',
env: {
variables: {
MODULE_NAME: moduleName,
SLIC_STAGE: stageName,
CROSS_ACCOUNT_ID: config.accountIds[stageName]
}
},
phases: {
build: {
commands: [`bash ./build-scripts/deploy-module.sh`]
}
}
},
environment: defaultEnvironment,
role: props.codeBuildRole
}
)
const deployJob = new BuildJob(
this,
`${moduleName}_${stageName}_deploy_job`,
{
codeBuildProjectArn: this.deployModuleProjects[moduleName].projectArn,
checkCodeBuildFunction: props.checkCodeBuildFunction,
runCodeBuildFunction: props.runCodeBuildFunction,
sourceLocationPath: `$.[${moduleIndex}].runBuildResult.${moduleName}_${stageName}_build_job`
}
)
const ifChangedChoice = new Choice(
this,
`${moduleName} changed? ${stageName} deploy`
)
.when(
Condition.booleanEquals(
`$.[${moduleIndex}].changes.${moduleName}`,
true
),
deployJob.task
)
.otherwise(new Succeed(this, `Skip ${stageName} ${moduleName} deploy`))
this.stageState.branch(ifChangedChoice)
})
}
}