-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.coffee
99 lines (84 loc) · 3.02 KB
/
server.coffee
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
_ = require "lodash"
async = require "async"
aws = require "aws-sdk"
debug = require("debug") "autodeploy:main"
debugSync = require("debug") "autodeploy:sync"
config = require "./config"
ECR = require "./app/ecr"
Kube = require "./app/kube"
request = require "request"
{ deployCheck, DEPLOY_STATUS } = require "./app/deploy"
# You Can add your error reporting service here
reportError = (err) ->
return unless err?
console.error err
# You can add your deploy messaging here
onDeploy = (target, buildTag, status) ->
# Example on finished Deploy Hook Using Rollbar
return unless target?.rollbar?
return unless status is DEPLOY_STATUS.finished
request.post(
'https://api.rollbar.com/api/1/deploy/',
form:
access_token: target.rollbar.access_token
environment: target.rollbar.environment
revision: buildTag
)
performUpdates = ({kube, ecr, s3}) ->
syncRemoteState {kube, ecr, s3,}, (err, currentState) ->
return reportError if err?
# Perform our deploy check and update
deployCheck {kube, ecr, onDeploy}, currentState, reportError
# NOTE: You can add other stuff here which uses the remote state
# ======= I Don't recommend changing the stuff below... ======= #
getDeploymentSpec = (s3, done) ->
params = {
Bucket: config.S3_DEPLOYMENT_BUCKET
Key: config.S3_DEPLOYMENT_KEY
}
s3.getObject params, (err, data) ->
return done err if err?
return done null, JSON.parse data.Body.toString()
syncRemoteState = ({ecr, kube, s3}, done) ->
getDeploymentSpec s3, (err, deploymentSpec) ->
return done err if err?
kubeNamespaces = _.map deploymentSpec.deployTargets, "toReplicationController.namespace"
async.parallel {
ecrRepos: (next) ->
debugSync "Syncing ECR state..."
ecr.getAllTags (err, data) ->
debugSync "Synced ECR state!"
next err, data
kubeStatus: (next) ->
debugSync "Syncing kube cluster state..."
kube.getReplicationControllers kubeNamespaces, (err, data) ->
debugSync "Synced kube cluster state!"
next err, data
}, (err, currentState) ->
return done err if err?
currentState.deploymentSpec = deploymentSpec
done null, currentState
main = (done) ->
debug "Authenticating with S3..."
s3 = new aws.S3 { region: config.AWS_S3_REGION }
debug "Authenticating with ECR..."
ecr = new ECR { region: config.AWS_ERC_REGION }
debug "Authenticating with Kube..."
kube = new Kube {
endpoint: config.KUBE_API_URI
version: config.KUBE_API_VERSION
strictSSL: config.KUBE_STRICT_SSL
caPath: config.KUBE_CA_CERT_PATH
auth: { token: config.KUBE_AUTH_TOKEN }
}, (err) ->
return done err if err?
debug "Starting clock..."
setInterval ->
debug "===== Tick: Performing updates ====="
performUpdates {ecr, kube, s3}
, config.PERIOD_TO_POLL_SECONDS * 1000
# Interval wont execute till the next interval, execute one off here...
performUpdates {ecr, kube, s3}
main (err) ->
reportError err if err?
process.exit if err? then -1 else 0