@@ -136,10 +136,24 @@ func (p *AppPushOperation) pushRollingApp(ctx context.Context, space *resource.S
136136 }
137137
138138 var pkg * resource.Package
139- if manifest .Docker != nil {
140- pkg , err = p .uploadDockerPackage (ctx , originalApp , manifest .Docker )
139+ // Check if lifecycle is explicitly set in manifest
140+ if manifest .Lifecycle != "" {
141+ switch manifest .Lifecycle {
142+ case Docker :
143+ pkg , err = p .uploadDockerPackage (ctx , originalApp , manifest .Docker )
144+ case Buildpack , CNB :
145+ pkg , err = p .uploadBitsPackage (ctx , originalApp , zipFile )
146+ default :
147+ // Default to buildpack for unknown lifecycle types
148+ pkg , err = p .uploadBitsPackage (ctx , originalApp , zipFile )
149+ }
141150 } else {
142- pkg , err = p .uploadBitsPackage (ctx , originalApp , zipFile )
151+ // Fall back to old logic when lifecycle is not set
152+ if manifest .Docker != nil {
153+ pkg , err = p .uploadDockerPackage (ctx , originalApp , manifest .Docker )
154+ } else {
155+ pkg , err = p .uploadBitsPackage (ctx , originalApp , zipFile )
156+ }
143157 }
144158 if err != nil {
145159 return nil , err
@@ -268,10 +282,24 @@ func (p *AppPushOperation) pushApp(ctx context.Context, space *resource.Space, m
268282 }
269283
270284 var pkg * resource.Package
271- if app .Lifecycle .Type == resource .LifecycleDocker .String () {
272- pkg , err = p .uploadDockerPackage (ctx , app , manifest .Docker )
285+ // Check if lifecycle is explicitly set in manifest
286+ if manifest .Lifecycle != "" {
287+ switch manifest .Lifecycle {
288+ case Docker :
289+ pkg , err = p .uploadDockerPackage (ctx , app , manifest .Docker )
290+ case Buildpack , CNB :
291+ pkg , err = p .uploadBitsPackage (ctx , app , zipFile )
292+ default :
293+ // Default to buildpack for unknown lifecycle types
294+ pkg , err = p .uploadBitsPackage (ctx , app , zipFile )
295+ }
273296 } else {
274- pkg , err = p .uploadBitsPackage (ctx , app , zipFile )
297+ // Fall back to old logic when lifecycle is not set
298+ if app .Lifecycle .Type == resource .LifecycleDocker .String () {
299+ pkg , err = p .uploadDockerPackage (ctx , app , manifest .Docker )
300+ } else {
301+ pkg , err = p .uploadBitsPackage (ctx , app , zipFile )
302+ }
275303 }
276304 if err != nil {
277305 return nil , err
@@ -350,18 +378,50 @@ func (p *AppPushOperation) uploadBitsPackage(ctx context.Context, app *resource.
350378
351379func (p * AppPushOperation ) buildDroplet (ctx context.Context , pkg * resource.Package , manifest * AppManifest ) (* resource.Droplet , error ) {
352380 newBuild := resource .NewBuildCreate (pkg .GUID )
353- if pkg .Type == resource .LifecycleDocker .String () {
354- newBuild .Lifecycle = & resource.Lifecycle {
355- Type : pkg .Type ,
356- Data : & resource.DockerLifecycle {}, // Empty docker lifecycle data
381+
382+ // Check if lifecycle is explicitly set in manifest first
383+ if manifest .Lifecycle != "" {
384+ switch manifest .Lifecycle {
385+ case Docker :
386+ newBuild .Lifecycle = & resource.Lifecycle {
387+ Type : string (Docker ),
388+ Data : & resource.DockerLifecycle {}, // Empty docker lifecycle data
389+ }
390+ case CNB :
391+ newBuild .Lifecycle = & resource.Lifecycle {
392+ Type : string (CNB ),
393+ Data : & resource.CNBLifecycle {
394+ Buildpacks : manifest .Buildpacks ,
395+ Stack : manifest .Stack ,
396+ },
397+ }
398+ case Buildpack :
399+ fallthrough
400+ default :
401+ // Default to buildpack lifecycle for unknown types or explicit buildpack
402+ newBuild .Lifecycle = & resource.Lifecycle {
403+ Type : resource .LifecycleBuildpack .String (),
404+ Data : & resource.BuildpackLifecycle {
405+ Buildpacks : manifest .Buildpacks ,
406+ Stack : manifest .Stack ,
407+ },
408+ }
357409 }
358410 } else {
359- newBuild .Lifecycle = & resource.Lifecycle {
360- Type : resource .LifecycleBuildpack .String (),
361- Data : & resource.BuildpackLifecycle {
362- Buildpacks : manifest .Buildpacks ,
363- Stack : manifest .Stack ,
364- },
411+ // Fall back to old logic based on package type when lifecycle is not set
412+ if pkg .Type == resource .LifecycleDocker .String () {
413+ newBuild .Lifecycle = & resource.Lifecycle {
414+ Type : pkg .Type ,
415+ Data : & resource.DockerLifecycle {}, // Empty docker lifecycle data
416+ }
417+ } else {
418+ newBuild .Lifecycle = & resource.Lifecycle {
419+ Type : resource .LifecycleBuildpack .String (),
420+ Data : & resource.BuildpackLifecycle {
421+ Buildpacks : manifest .Buildpacks ,
422+ Stack : manifest .Stack ,
423+ },
424+ }
365425 }
366426 }
367427 build , err := p .client .Builds .Create (ctx , newBuild )
0 commit comments