-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathindex.js
146 lines (134 loc) · 3.97 KB
/
index.js
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
var AWS = require('aws-sdk')
var k8s = require('@kubernetes/client-node');
var fs = require('fs')
var yaml = require('js-yaml')
var kc = require('./kube_client')
var client = kc.makeApiClient(k8s.Extensions_v1beta1Api);
var patchClient = kc.makeApiClient(k8s.Apps_v1Api);
patchClient.defaultHeaders = {'Content-Type': 'application/strategic-merge-patch+json'}
exports.handler = async (event, context) => {
var codepipeline = new AWS.CodePipeline();
var jobId = event["CodePipeline.job"].id;
var keyName = event['CodePipeline.job'].data.actionConfiguration.configuration.UserParameters
/* Helper methods */
var putJobSuccess = (message) => {
var params = {
jobId: jobId
};
return codepipeline.putJobSuccessResult(params, (err, data) => {
if(err) {
context.fail(err);
} else {
console.log(mesage);
context.succeed(message);
}
});
};
var putJobFailure = (message) => {
var params = {
jobId: jobId,
failureDetails: {
message: JSON.stringify(message),
type: 'JobFailed',
externalExecutionId: context.invokeid
}
};
return codepipeline.putJobFailureResult(params, (err, data) => {
console.log(message);
context.fail(message);
});
};
var ecr = new AWS.ECR()
/* Get latest image tag */
var imageParams = {
repositoryName: keyName,
filter: { tagStatus: 'TAGGED' }
}
let repoImages
try {
repoImages = await ecr.describeImages(imageParams).promise()
}
catch (err) {
console.log(err);
putJobFailure(`Error fetching images for repository ${keyName}`)
}
var sortedImages = repoImages.imageDetails.sort((a, b) => {
return b.imagePushedAt - a.imagePushedAt;
})
var latestImage = sortedImages[0]
if (!latestImage) {
putJobFailure(`Missing images for repository ${keyName}`)
}
var latestImageTag = latestImage.imageTags[0]
/* Get repository URI */
var repoParams = {
repositoryNames: [ keyName ]
}
let repoData
try {
repoData = await ecr.describeRepositories(repoParams).promise()
}
catch (err) {
console.log(err);
putJobFailure(`Error fetching repository ${keyName} detail`)
}
var targetRepo = repoData.repositories[0]
if (!targetRepo) {
putJobFailure(`Missing repository for name ${keyName}`)
}
var repoURI = targetRepo.repositoryUri
/* FINAL IMAGE URI */
var imageUri = `${repoURI}:${latestImageTag}`
/* Prepare kubernetes client */
return client.listNamespacedDeployment('default')
.then((res) => {
var deployments = res.body.items
var existDeployment = deployments.find((item) => {
return item.metadata.name === keyName
})
/* Already deployed, update the deployment */
if (existDeployment !== undefined) {
return patchClient.patchNamespacedDeployment(keyName, 'default', {
spec: {
template: {
spec: {
containers: [
{
name: keyName,
image: imageUri
}
]
}
}
}
})
.then(() => {
console.log('Patch success');
return putJobSuccess("Deploy success.");
})
.catch((err) => {
console.log(err);
return putJobFailure(err)
})
} else {
/* Create a new deployment */
var raw = fs.readFileSync('./deploy-first', 'utf8')
raw = raw.replace(/\$EKS_DEPLOYMENT_NAME/g, keyName)
raw = raw.replace(/\$DEPLY_IMAGE/g, imageUri)
var deployConfig = yaml.safeLoad(raw)
return client.createNamespacedDeployment('default', deployConfig)
.then(() => {
console.log('success');
return putJobSuccess("Deploy success.");
})
.catch((err) => {
console.log(err);
return putJobFailure(err)
})
}
})
.catch((err) => {
console.log(err);
return putJobFailure(err)
})
}