| OLD | NEW |
| 1 // Copyright 2016 The LUCI Authors. All rights reserved. | 1 // Copyright 2016 The LUCI Authors. All rights reserved. |
| 2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
| 3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
| 4 | 4 |
| 5 package main | 5 package main |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "sort" | 8 "sort" |
| 9 | 9 |
| 10 "github.com/luci/luci-go/common/cli" | 10 "github.com/luci/luci-go/common/cli" |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 // If a manual version was specified, use it. | 102 // If a manual version was specified, use it. |
| 103 if cmd.manualVersion != "" { | 103 if cmd.manualVersion != "" { |
| 104 cmd.dp.params.forceVersion = makeStringCloudProjectVersion(cmd.m
anualVersion) | 104 cmd.dp.params.forceVersion = makeStringCloudProjectVersion(cmd.m
anualVersion) |
| 105 } | 105 } |
| 106 | 106 |
| 107 err := a.runWork(c, func(w *work) error { | 107 err := a.runWork(c, func(w *work) error { |
| 108 // Perform our planned checkout. | 108 // Perform our planned checkout. |
| 109 if cmd.checkout { | 109 if cmd.checkout { |
| 110 // Perform a full checkout. | 110 // Perform a full checkout. |
| 111 if err := checkout(w, &a.layout, false); err != nil { | 111 if err := checkout(w, &a.layout, false); err != nil { |
| 112 » » » » return errors.Annotate(err).Reason("failed to ch
eckout sources").Err() | 112 » » » » return errors.Annotate(err, "failed to checkout
sources").Err() |
| 113 } | 113 } |
| 114 } | 114 } |
| 115 | 115 |
| 116 // Load our frozen checkout. | 116 // Load our frozen checkout. |
| 117 if err := a.layout.loadFrozenLayout(w); err != nil { | 117 if err := a.layout.loadFrozenLayout(w); err != nil { |
| 118 » » » return errors.Annotate(err).Reason("failed to load froze
n checkout").Err() | 118 » » » return errors.Annotate(err, "failed to load frozen check
out").Err() |
| 119 } | 119 } |
| 120 return nil | 120 return nil |
| 121 }) | 121 }) |
| 122 if err != nil { | 122 if err != nil { |
| 123 logError(c, err, "Failed to perform checkout.") | 123 logError(c, err, "Failed to perform checkout.") |
| 124 return 1 | 124 return 1 |
| 125 } | 125 } |
| 126 | 126 |
| 127 // Figure out what we're going to deploy. | 127 // Figure out what we're going to deploy. |
| 128 for _, arg := range args { | 128 for _, arg := range args { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 143 if !matched { | 143 if !matched { |
| 144 log.Fields{ | 144 log.Fields{ |
| 145 "target": arg, | 145 "target": arg, |
| 146 }.Errorf(c, "Deploy target did not match any configured
deployments or components.") | 146 }.Errorf(c, "Deploy target did not match any configured
deployments or components.") |
| 147 return 1 | 147 return 1 |
| 148 } | 148 } |
| 149 } | 149 } |
| 150 | 150 |
| 151 err = a.runWork(c, func(w *work) error { | 151 err = a.runWork(c, func(w *work) error { |
| 152 if err := cmd.dp.initialize(w, &a.layout); err != nil { | 152 if err := cmd.dp.initialize(w, &a.layout); err != nil { |
| 153 » » » return errors.Annotate(err).Reason("failed to initialize
").Err() | 153 » » » return errors.Annotate(err, "failed to initialize").Err(
) |
| 154 } | 154 } |
| 155 | 155 |
| 156 return cmd.dp.deploy(w) | 156 return cmd.dp.deploy(w) |
| 157 }) | 157 }) |
| 158 if err != nil { | 158 if err != nil { |
| 159 logError(c, err, "Failed to perform deployment.") | 159 logError(c, err, "Failed to perform deployment.") |
| 160 return 1 | 160 return 1 |
| 161 } | 161 } |
| 162 return 0 | 162 return 0 |
| 163 } | 163 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 // order in which they are defined in the Application's protobuf
. | 224 // order in which they are defined in the Application's protobuf
. |
| 225 for _, compName := range dep.componentNames { | 225 for _, compName := range dep.componentNames { |
| 226 comp := dep.components[compName] | 226 comp := dep.components[compName] |
| 227 | 227 |
| 228 // Only pass the registrar if this component is being de
ployed. | 228 // Only pass the registrar if this component is being de
ployed. |
| 229 var pReg componentRegistrar | 229 var pReg componentRegistrar |
| 230 if _, ok := dp.comps[comp.String()]; ok { | 230 if _, ok := dp.comps[comp.String()]; ok { |
| 231 pReg = &dp.reg | 231 pReg = &dp.reg |
| 232 } | 232 } |
| 233 if err := comp.loadSourceComponent(pReg); err != nil { | 233 if err := comp.loadSourceComponent(pReg); err != nil { |
| 234 » » » » return errors.Annotate(err).Reason("failed to lo
ad component %(comp)q"). | 234 » » » » return errors.Annotate(err, "failed to load comp
onent %q", comp).Err() |
| 235 » » » » » D("comp", comp.String()).Err() | |
| 236 } | 235 } |
| 237 } | 236 } |
| 238 } | 237 } |
| 239 | 238 |
| 240 return nil | 239 return nil |
| 241 } | 240 } |
| 242 | 241 |
| 243 func (dp *deploymentPlan) deploy(w *work) error { | 242 func (dp *deploymentPlan) deploy(w *work) error { |
| 244 // Create our working root and staging/build subdirectories. | 243 // Create our working root and staging/build subdirectories. |
| 245 fs, err := dp.layout.workingFilesystem() | 244 fs, err := dp.layout.workingFilesystem() |
| 246 if err != nil { | 245 if err != nil { |
| 247 » » return errors.Annotate(err).Reason("failed to create working dir
ectory").Err() | 246 » » return errors.Annotate(err, "failed to create working directory"
).Err() |
| 248 } | 247 } |
| 249 | 248 |
| 250 stagingDir, err := fs.Base().EnsureDirectory("staging") | 249 stagingDir, err := fs.Base().EnsureDirectory("staging") |
| 251 if err != nil { | 250 if err != nil { |
| 252 » » return errors.Annotate(err).Reason("failed to create staging dir
ectory").Err() | 251 » » return errors.Annotate(err, "failed to create staging directory"
).Err() |
| 253 } | 252 } |
| 254 | 253 |
| 255 // Stage: Staging | 254 // Stage: Staging |
| 256 if err := dp.reg.stage(w, stagingDir, &dp.params); err != nil { | 255 if err := dp.reg.stage(w, stagingDir, &dp.params); err != nil { |
| 257 » » return errors.Annotate(err).Reason("failed to stage").Err() | 256 » » return errors.Annotate(err, "failed to stage").Err() |
| 258 } | 257 } |
| 259 if dp.params.stage <= deployStaging { | 258 if dp.params.stage <= deployStaging { |
| 260 return nil | 259 return nil |
| 261 } | 260 } |
| 262 | 261 |
| 263 // Stage: Local Build | 262 // Stage: Local Build |
| 264 if err := dp.reg.localBuild(w); err != nil { | 263 if err := dp.reg.localBuild(w); err != nil { |
| 265 » » return errors.Annotate(err).Reason("failed to perform local buil
d").Err() | 264 » » return errors.Annotate(err, "failed to perform local build").Err
() |
| 266 } | 265 } |
| 267 if dp.params.stage <= deployLocalBuild { | 266 if dp.params.stage <= deployLocalBuild { |
| 268 return nil | 267 return nil |
| 269 } | 268 } |
| 270 | 269 |
| 271 // Stage: Push | 270 // Stage: Push |
| 272 if err := dp.reg.push(w); err != nil { | 271 if err := dp.reg.push(w); err != nil { |
| 273 » » return errors.Annotate(err).Reason("failed to push components").
Err() | 272 » » return errors.Annotate(err, "failed to push components").Err() |
| 274 } | 273 } |
| 275 if dp.params.stage <= deployPush { | 274 if dp.params.stage <= deployPush { |
| 276 return nil | 275 return nil |
| 277 } | 276 } |
| 278 | 277 |
| 279 // Stage: Commit | 278 // Stage: Commit |
| 280 if err := dp.reg.commit(w); err != nil { | 279 if err := dp.reg.commit(w); err != nil { |
| 281 » » return errors.Annotate(err).Reason("failed to commit").Err() | 280 » » return errors.Annotate(err, "failed to commit").Err() |
| 282 } | 281 } |
| 283 return nil | 282 return nil |
| 284 } | 283 } |
| 285 | 284 |
| 286 // deploymentRegistry is the registry of all prepared deployments. | 285 // deploymentRegistry is the registry of all prepared deployments. |
| 287 // | 286 // |
| 288 // While deployment is specified and staged at a component level, actual | 287 // While deployment is specified and staged at a component level, actual |
| 289 // deployment is allowed to happen at a practical level (e.g., a single | 288 // deployment is allowed to happen at a practical level (e.g., a single |
| 290 // cloud project's AppEngine configuration, a single Google Container Engine | 289 // cloud project's AppEngine configuration, a single Google Container Engine |
| 291 // cluster, etc.). | 290 // cluster, etc.). |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 // All components can be independently staged in parallel. | 379 // All components can be independently staged in parallel. |
| 381 // | 380 // |
| 382 // We will still enumerate over them in sorted order for determinism. | 381 // We will still enumerate over them in sorted order for determinism. |
| 383 return w.RunMulti(func(workC chan<- func() error) { | 382 return w.RunMulti(func(workC chan<- func() error) { |
| 384 // AppEngine Projects | 383 // AppEngine Projects |
| 385 for _, name := range reg.gaeProjectNames { | 384 for _, name := range reg.gaeProjectNames { |
| 386 proj := reg.gaeProjects[name] | 385 proj := reg.gaeProjects[name] |
| 387 workC <- func() error { | 386 workC <- func() error { |
| 388 depDir, err := stageDir.EnsureDirectory(string(p
roj.project.dep.title), "appengine") | 387 depDir, err := stageDir.EnsureDirectory(string(p
roj.project.dep.title), "appengine") |
| 389 if err != nil { | 388 if err != nil { |
| 390 » » » » » return errors.Annotate(err).Reason("fail
ed to create deployment directory for %(deployment)q"). | 389 » » » » » return errors.Annotate(err, "failed to c
reate deployment directory for %q", proj.project.dep.title).Err() |
| 391 » » » » » » D("deployment", proj.project.dep
.title).Err() | |
| 392 } | 390 } |
| 393 return proj.stage(w, depDir, params) | 391 return proj.stage(w, depDir, params) |
| 394 } | 392 } |
| 395 } | 393 } |
| 396 | 394 |
| 397 // Container Engine Projects | 395 // Container Engine Projects |
| 398 for _, name := range reg.gkeProjectNames { | 396 for _, name := range reg.gkeProjectNames { |
| 399 proj := reg.gkeProjects[name] | 397 proj := reg.gkeProjects[name] |
| 400 workC <- func() error { | 398 workC <- func() error { |
| 401 depDir, err := stageDir.EnsureDirectory(string(p
roj.project.dep.title), "container_engine") | 399 depDir, err := stageDir.EnsureDirectory(string(p
roj.project.dep.title), "container_engine") |
| 402 if err != nil { | 400 if err != nil { |
| 403 » » » » » return errors.Annotate(err).Reason("fail
ed to create deployment directory for %(deployment)q"). | 401 » » » » » return errors.Annotate(err, "failed to c
reate deployment directory for %q", proj.project.dep.title).Err() |
| 404 » » » » » » D("deployment", proj.project.dep
.title).Err() | |
| 405 } | 402 } |
| 406 return proj.stage(w, depDir, params) | 403 return proj.stage(w, depDir, params) |
| 407 } | 404 } |
| 408 } | 405 } |
| 409 }) | 406 }) |
| 410 } | 407 } |
| 411 | 408 |
| 412 // build performs the build stage on staged components. | 409 // build performs the build stage on staged components. |
| 413 func (reg *deploymentRegistry) localBuild(w *work) error { | 410 func (reg *deploymentRegistry) localBuild(w *work) error { |
| 414 // Enumerate over them in sorted order for determinism. | 411 // Enumerate over them in sorted order for determinism. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 | 469 |
| 473 // Container Engine Projects | 470 // Container Engine Projects |
| 474 for _, name := range reg.gkeProjectNames { | 471 for _, name := range reg.gkeProjectNames { |
| 475 proj := reg.gkeProjects[name] | 472 proj := reg.gkeProjects[name] |
| 476 workC <- func() error { | 473 workC <- func() error { |
| 477 return proj.commit(w) | 474 return proj.commit(w) |
| 478 } | 475 } |
| 479 } | 476 } |
| 480 }) | 477 }) |
| 481 } | 478 } |
| OLD | NEW |