in custom-targets/infrastructure-manager/im-deployer/deploy.go [85:130]
func (d *deployer) deploy(ctx context.Context) (*clouddeploy.DeployResult, error) {
renderedDeploymentPath := path.Join(srcPath, renderedDeploymentFileName)
fmt.Printf("Downloading rendered Deployment to %s\n", renderedDeploymentPath)
dURI, err := d.req.DownloadInput(ctx, d.gcsClient, renderedDeploymentFileName, renderedDeploymentPath)
if err != nil {
return nil, fmt.Errorf("unable to download rendered deployment with object suffix %s: %v", renderedDeploymentFileName, err)
}
fmt.Printf("Downloaded rendered Deployment from %s\n", dURI)
rd, err := renderedDeployment(renderedDeploymentPath)
if err != nil {
return nil, fmt.Errorf("error parsing rendered deployment: %v", err)
}
deployment, err := d.applyDeployment(ctx, rd)
if err != nil {
return nil, err
}
revName := deployment.LatestRevision
fmt.Printf("Created latest Revision %s\n", revName)
// Ensure the Deployment reached a terminal state after creating/updating it. If for some reason it's still in
// progress then we poll it until it reaches a terminal state. The polling logic checks whether the latest revision
// changes in case the Deployment is updated outside the context of this deployer.
if isInProgressDeployment(deployment.State) {
fmt.Printf("Polling Deployment %s until a terminal state is reached, current state: %s\n", deployment.Name, deployment.State.String())
var err error
deployment, err = pollDeploymentUntilTerminal(ctx, d.imClient, deployment.Name, revName)
if err != nil {
return nil, err
}
fmt.Printf("Finished polling Deployment %s until terminal state, current state: %s\n", deployment.Name, deployment.State.String())
}
fmt.Printf("Retrieving Revision %s\n", revName)
rev, err := getRevision(ctx, d.imClient, revName)
if err != nil {
return nil, fmt.Errorf("error getting revision %s: %v", revName, err)
}
fmt.Printf("Revision %s executed in Cloud Build %s\n", revName, rev.Build)
if isSucceededDeployment(deployment.State) {
fmt.Printf("Deployment Succeeded with latest Revision %s\n", revName)
return processDeploymentSucceeded(ctx, deployment, rev)
}
fmt.Printf("Deployment Failed with latest Revision %s\n", revName)
return nil, processDeploymentFailed(ctx, deployment, rev)
}