@@ -91,12 +91,55 @@ def build_staging_task(config, staging_details)
9191 "app:#{ staging_details . package . app_guid } "
9292 ]
9393 ) ,
94- image_username : staging_details . package . docker_username ,
95- image_password : staging_details . package . docker_password ,
94+ image_username : image_username ( staging_details ) ,
95+ image_password : image_password ( staging_details ) ,
9696 volume_mounted_files : ServiceBindingFilesBuilder . build ( staging_details . package . app )
9797 } . compact )
9898 end
9999
100+ def image_username ( staging_details )
101+ return staging_details . package . docker_username if staging_details . package . docker_username . present?
102+ return unless staging_details . lifecycle . respond_to? ( :credentials ) && staging_details . lifecycle . credentials . present?
103+
104+ cred = get_credentials_for_stack ( staging_details )
105+ cred ? cred [ 'username' ] : nil
106+ end
107+
108+ def image_password ( staging_details )
109+ return staging_details . package . docker_password if staging_details . package . docker_password . present?
110+ return unless staging_details . lifecycle . respond_to? ( :credentials ) && staging_details . lifecycle . credentials . present?
111+
112+ cred = get_credentials_for_stack ( staging_details )
113+ cred ? cred [ 'password' ] : nil
114+ end
115+
116+ def get_credentials_for_stack ( staging_details )
117+ stack = staging_details . lifecycle . staging_stack
118+ return nil unless is_custom_stack? ( stack )
119+
120+ # Convert different URL formats to a standard format for parsing
121+ normalized_stack = normalize_stack_url ( stack )
122+ stack_uri = URI . parse ( normalized_stack )
123+ host = stack_uri . host
124+ staging_details . lifecycle . credentials [ host ]
125+ end
126+
127+ def normalize_stack_url ( stack_url )
128+ return stack_url if stack_url . start_with? ( 'docker://' )
129+ return stack_url . sub ( /^https?:\/ \/ / , 'docker://' ) if stack_url . match? ( %r{^https?://} )
130+ return "docker://#{ stack_url } " if stack_url . match? ( %r{^[a-zA-Z0-9.-]+\. [a-zA-Z]{2,}/.+} )
131+ stack_url
132+ end
133+
134+ def is_custom_stack? ( stack_name )
135+ return false unless stack_name . is_a? ( String )
136+ # Check for various container registry URL formats (be conservative)
137+ return true if stack_name . include? ( 'docker://' )
138+ return true if stack_name . match? ( %r{^https?://[^/]+/.+} ) # https://registry/image
139+ return true if stack_name . match? ( %r{^[a-zA-Z0-9.-]*\. [a-zA-Z]{2,}/[^/]+/[^/]+} ) # registry.com/namespace/image (at least 2 path components)
140+ false
141+ end
142+
100143 private
101144
102145 def metric_tags ( source )
0 commit comments