Procházet zdrojové kódy

fix porter apply removing launcher (#3032)

Feroze Mohideen před 3 roky
rodič
revize
2cef97e8b0

+ 1 - 1
api/server/handlers/stacks/create_porter_app.go

@@ -119,7 +119,7 @@ func (c *CreatePorterAppHandler) ServeHTTP(w http.ResponseWriter, r *http.Reques
 		injectLauncher,
 	)
 	if err != nil {
-		c.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("error parsing porter yaml into chart and values: %w", err)))
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("error parsing porter.yaml into chart and values: %w", err)))
 		return
 	}
 

+ 13 - 1
api/server/handlers/stacks/parse.go

@@ -137,9 +137,21 @@ func buildStackValues(parsed *PorterStackYAML, imageInfo types.ImageInfo, existi
 		values[helmName] = helm_values
 	}
 
-	// add back in the existing values that were not overwritten
+	// add back in the existing services that were not overwritten
 	for k, v := range existingValues {
 		if values[k] == nil {
+			// make sure we prepend launcher to services that aren't specified in porter.yaml as well
+			if existingServiceValues, ok := v.(map[string]interface{}); ok {
+				if existingServiceValues["container"] != nil {
+					containerMap := existingServiceValues["container"].(map[string]interface{})
+					if containerMap["command"] != nil {
+						command := containerMap["command"].(string)
+						if injectLauncher && !strings.HasPrefix(command, "launcher") && !strings.HasPrefix(command, "/cnb/lifecycle/launcher") {
+							containerMap["command"] = fmt.Sprintf("/cnb/lifecycle/launcher %s", command)
+						}
+					}
+				}
+			}
 			values[k] = v
 		}
 	}

+ 4 - 1
cli/cmd/apply.go

@@ -160,7 +160,9 @@ func apply(_ *types.GetAuthenticatedUserResponse, client *api.Client, _ []string
 			return fmt.Errorf("environment variable PORTER_STACK_NAME must be set")
 		}
 
-		resGroup, err = stack.CreateV1BuildResources(client, fileBytes, stackName, cliConf.Project, cliConf.Cluster)
+		// we need to know the builder so that we can inject launcher to the start command later if heroku builder is used
+		var builder string
+		resGroup, builder, err = stack.CreateV1BuildResources(client, fileBytes, stackName, cliConf.Project, cliConf.Cluster)
 		if err != nil {
 			return fmt.Errorf("error parsing porter.yaml for build resources: %w", err)
 		}
@@ -172,6 +174,7 @@ func apply(_ *types.GetAuthenticatedUserResponse, client *api.Client, _ []string
 			ClusterID:            cliConf.Cluster,
 			BuildImageDriverName: stack.GetBuildImageDriverName(),
 			PorterYAML:           fileBytes,
+			Builder:              builder,
 		}
 		worker.RegisterHook("deploy-stack", deployStackHook)
 	} else {

+ 20 - 19
cli/cmd/stack/apply.go

@@ -21,7 +21,7 @@ type StackConf struct {
 	projectID, clusterID uint
 }
 
-func CreateV1BuildResources(client *api.Client, raw []byte, stackName string, projectID uint, clusterID uint) (*switchboardTypes.ResourceGroup, error) {
+func CreateV1BuildResources(client *api.Client, raw []byte, stackName string, projectID uint, clusterID uint) (*switchboardTypes.ResourceGroup, string, error) {
 	v1File := &switchboardTypes.ResourceGroup{
 		Version: "v1",
 		Resources: []*switchboardTypes.Resource{
@@ -31,28 +31,29 @@ func CreateV1BuildResources(client *api.Client, raw []byte, stackName string, pr
 			},
 		},
 	}
+	var builder string
 
 	stackConf, err := createStackConf(client, raw, stackName, projectID, clusterID)
 	if err != nil {
-		return nil, err
+		return nil, "", err
 	}
 
 	var bi, pi *switchboardTypes.Resource
 
 	if stackConf.parsed.Build != nil {
-		bi, pi, err = createV1BuildResourcesFromPorterYaml(stackConf)
+		bi, pi, builder, err = createV1BuildResourcesFromPorterYaml(stackConf)
 		if err != nil {
 			color.New(color.FgRed).Printf("Could not build using values specified in porter.yaml (%s), attempting to load stack build settings instead \n", err.Error())
-			bi, pi, err = createV1BuildResourcesFromDB(client, stackConf)
+			bi, pi, builder, err = createV1BuildResourcesFromDB(client, stackConf)
 			if err != nil {
-				return nil, err
+				return nil, "", err
 			}
 		}
 	} else {
 		color.New(color.FgYellow).Printf("No build values specified in porter.yaml, attempting to load stack build settings instead \n")
-		bi, pi, err = createV1BuildResourcesFromDB(client, stackConf)
+		bi, pi, builder, err = createV1BuildResourcesFromDB(client, stackConf)
 		if err != nil {
-			return nil, err
+			return nil, "", err
 		}
 	}
 
@@ -68,7 +69,7 @@ func CreateV1BuildResources(client *api.Client, raw []byte, stackName string, pr
 		stackConf.parsed.Env,
 	)
 	if err != nil {
-		return nil, err
+		return nil, "", err
 	}
 
 	if release != nil {
@@ -78,7 +79,7 @@ func CreateV1BuildResources(client *api.Client, raw []byte, stackName string, pr
 		color.New(color.FgYellow).Printf("No release command found in porter.yaml or helm. \n")
 	}
 
-	return v1File, nil
+	return v1File, builder, nil
 }
 
 func createStackConf(client *api.Client, raw []byte, stackName string, projectID uint, clusterID uint) (*StackConf, error) {
@@ -117,43 +118,43 @@ func createStackConf(client *api.Client, raw []byte, stackName string, projectID
 	}, nil
 }
 
-func createV1BuildResourcesFromPorterYaml(stackConf *StackConf) (*switchboardTypes.Resource, *switchboardTypes.Resource, error) {
+func createV1BuildResourcesFromPorterYaml(stackConf *StackConf) (*switchboardTypes.Resource, *switchboardTypes.Resource, string, error) {
 	bi, err := stackConf.parsed.Build.getV1BuildImage(stackConf.parsed.Env, stackConf.namespace)
 	if err != nil {
-		return nil, nil, err
+		return nil, nil, "", err
 	}
 
 	pi, err := stackConf.parsed.Build.getV1PushImage(stackConf.namespace)
 	if err != nil {
-		return nil, nil, err
+		return nil, nil, "", err
 	}
 
-	return bi, pi, nil
+	return bi, pi, stackConf.parsed.Build.GetBuilder(), nil
 }
 
-func createV1BuildResourcesFromDB(client *api.Client, stackConf *StackConf) (*switchboardTypes.Resource, *switchboardTypes.Resource, error) {
+func createV1BuildResourcesFromDB(client *api.Client, stackConf *StackConf) (*switchboardTypes.Resource, *switchboardTypes.Resource, string, error) {
 	res, err := client.GetPorterApp(context.Background(), stackConf.projectID, stackConf.clusterID, stackConf.stackName)
 	if err != nil {
-		return nil, nil, fmt.Errorf("unable to read build info from DB: %w", err)
+		return nil, nil, "", fmt.Errorf("unable to read build info from DB: %w", err)
 	}
 
 	if res == nil {
-		return nil, nil, fmt.Errorf("stack %s not found", stackConf.stackName)
+		return nil, nil, "", fmt.Errorf("stack %s not found", stackConf.stackName)
 	}
 
 	build := convertToBuild(res)
 
 	bi, err := build.getV1BuildImage(stackConf.parsed.Env, stackConf.namespace)
 	if err != nil {
-		return nil, nil, err
+		return nil, nil, "", err
 	}
 
 	pi, err := build.getV1PushImage(stackConf.namespace)
 	if err != nil {
-		return nil, nil, err
+		return nil, nil, "", err
 	}
 
-	return bi, pi, nil
+	return bi, pi, build.GetBuilder(), nil
 }
 
 func convertToBuild(porterApp *types.PorterApp) Build {

+ 2 - 0
cli/cmd/stack/hooks.go

@@ -18,6 +18,7 @@ type DeployStackHook struct {
 	ProjectID, ClusterID uint
 	BuildImageDriverName string
 	PorterYAML           []byte
+	Builder              string
 }
 
 func (t *DeployStackHook) PreApply() error {
@@ -87,6 +88,7 @@ func (t *DeployStackHook) applyStack(client *api.Client, shouldCreate bool, driv
 			PorterYAMLBase64: base64.StdEncoding.EncodeToString(t.PorterYAML),
 			ImageInfo:        imageInfo,
 			OverrideRelease:  false, // deploying from the cli will never delete release resources, only append or override
+			Builder:          t.Builder,
 		},
 	)
 	if err != nil {