|
202 | 202 | ##################################################################################### |
203 | 203 | # build_and_upload_wordpress_prototype_build |
204 | 204 | # ----------------------------------------------------------------------------------- |
205 | | - # Build a WordPress Prototype Build and make it available for download |
| 205 | + # Build a WordPress Prototype Build and upload it to Firebase App Distribution |
206 | 206 | # ----------------------------------------------------------------------------------- |
207 | 207 | # Usage: |
208 | 208 | # bundle exec fastlane build_and_upload_wordpress_prototype_build |
209 | 209 | ##################################################################################### |
210 | | - desc 'Build a WordPress Prototype Build and make it available for download' |
| 210 | + desc 'Build a WordPress Prototype Build and upload it to Firebase App Distribution' |
211 | 211 | lane :build_and_upload_wordpress_prototype_build do |
212 | | - UI.user_error!("'BUILDKITE_ARTIFACTS_S3_BUCKET' must be defined as an environment variable.") unless ENV['BUILDKITE_ARTIFACTS_S3_BUCKET'] |
| 212 | + UI.user_error!("'FIREBASE_APP_DISTRIBUTION_ACCOUNT_KEY' must be defined as an environment variable.") unless ENV['FIREBASE_APP_DISTRIBUTION_ACCOUNT_KEY'] |
213 | 213 |
|
214 | 214 | version_name = generate_prototype_build_number |
215 | 215 | gradle( |
|
219 | 219 | properties: { prototypeBuildVersionName: version_name } |
220 | 220 | ) |
221 | 221 |
|
222 | | - upload_prototype_build(product: 'WordPress', version_name: version_name) |
| 222 | + upload_prototype_build(app: :wordpress, version_name: version_name) |
223 | 223 | upload_gutenberg_sourcemaps(app: 'Wordpress', release_version: version_name) |
224 | 224 | end |
225 | 225 |
|
226 | 226 | ##################################################################################### |
227 | 227 | # build_and_upload_jetpack_prototype_build |
228 | 228 | # ----------------------------------------------------------------------------------- |
229 | | - # Build a Jetpack Prototype Build and make it available for download |
| 229 | + # Build a Jetpack Prototype Build and upload it to Firebase App Distribution |
230 | 230 | # ----------------------------------------------------------------------------------- |
231 | 231 | # Usage: |
232 | 232 | # bundle exec fastlane build_and_upload_jetpack_prototype_build |
233 | 233 | ##################################################################################### |
234 | | - desc 'Build a Jetpack Prototype Build and make it available for download' |
| 234 | + desc 'Build a Jetpack Prototype Build and upload it to Firebase App Distribution' |
235 | 235 | lane :build_and_upload_jetpack_prototype_build do |
236 | | - UI.user_error!("'BUILDKITE_ARTIFACTS_S3_BUCKET' must be defined as an environment variable.") unless ENV['BUILDKITE_ARTIFACTS_S3_BUCKET'] |
| 236 | + UI.user_error!("'FIREBASE_APP_DISTRIBUTION_ACCOUNT_KEY' must be defined as an environment variable.") unless ENV['FIREBASE_APP_DISTRIBUTION_ACCOUNT_KEY'] |
237 | 237 |
|
238 | 238 | version_name = generate_prototype_build_number |
239 | 239 | gradle( |
|
243 | 243 | properties: { prototypeBuildVersionName: version_name } |
244 | 244 | ) |
245 | 245 |
|
246 | | - upload_prototype_build(product: 'Jetpack', version_name: version_name) |
| 246 | + upload_prototype_build(app: :jetpack, version_name: version_name) |
247 | 247 | upload_gutenberg_sourcemaps(app: 'Jetpack', release_version: version_name) |
248 | 248 | end |
249 | 249 |
|
|
310 | 310 | "#{build_dir}#{name}" |
311 | 311 | end |
312 | 312 |
|
313 | | - # Uploads the apk built by the `gradle` (i.e. `SharedValues::GRADLE_APK_OUTPUT_PATH`) to S3 then comment on the PR to provide the download link |
| 313 | + # Uploads the APK built by `gradle` to Firebase App Distribution and comments on the PR |
314 | 314 | # |
315 | | - # @param [String] product the display name of the app to upload to S3. 'WordPress' or 'Jetpack' |
| 315 | + # @param [Symbol] app the app identifier (:wordpress or :jetpack) |
| 316 | + # @param [String] version_name the version name for the build |
316 | 317 | # |
317 | | - def upload_prototype_build(product:, version_name:) |
318 | | - filename = "#{product.downcase}-prototype-build-#{version_name}.apk" |
319 | | - |
320 | | - upload_path = upload_to_s3( |
321 | | - bucket: 'a8c-apps-public-artifacts', |
322 | | - key: filename, |
323 | | - file: lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], |
324 | | - if_exists: :skip |
| 318 | + def upload_prototype_build(app:, version_name:) |
| 319 | + app_specific_values = APP_SPECIFIC_VALUES[app] |
| 320 | + app_display_name = app_specific_values[:display_name] |
| 321 | + firebase_settings = app_specific_values[:firebase] |
| 322 | + |
| 323 | + release_notes = <<~NOTES |
| 324 | + App: #{app_display_name} Android |
| 325 | + Branch: `#{ENV.fetch('BUILDKITE_BRANCH', 'N/A')}` |
| 326 | + Commit: #{ENV.fetch('BUILDKITE_COMMIT', 'N/A')[0, 7]} |
| 327 | + Build Type: #{PROTOTYPE_BUILD_TYPE} |
| 328 | + Version: #{version_name} |
| 329 | + NOTES |
| 330 | + |
| 331 | + firebase_app_distribution( |
| 332 | + app: firebase_settings[:app_id], |
| 333 | + service_credentials_json_data: ENV.fetch('FIREBASE_APP_DISTRIBUTION_ACCOUNT_KEY', nil), |
| 334 | + release_notes: release_notes, |
| 335 | + groups: firebase_settings[:testers_group] |
325 | 336 | ) |
326 | 337 |
|
327 | | - return if ENV['BUILDKITE_PULL_REQUEST'].nil? |
| 338 | + return unless is_ci |
328 | 339 |
|
329 | | - install_url = "#{PROTOTYPE_BUILD_DOMAIN}/#{upload_path}" |
330 | | - comment_body = prototype_build_details_comment( |
331 | | - app_display_name: product, |
332 | | - app_icon: ":#{product.downcase}:", # Use Buildkite emoji based on product name |
333 | | - download_url: install_url, |
334 | | - metadata: { Flavor: PROTOTYPE_BUILD_FLAVOR, 'Build Type': PROTOTYPE_BUILD_TYPE, Version: version_name }, |
335 | | - footnote: '<em>Note: Google Login is not supported on these builds.</em>', |
336 | | - fold: true |
| 340 | + comment_on_pr_with_prototype_build_install_link( |
| 341 | + project: GITHUB_REPO, |
| 342 | + app_display_name: "#{app_display_name} Android", |
| 343 | + app_icon: ":#{app}:", |
| 344 | + metadata: { |
| 345 | + Flavor: PROTOTYPE_BUILD_FLAVOR, |
| 346 | + 'Build Type': PROTOTYPE_BUILD_TYPE, |
| 347 | + Version: version_name |
| 348 | + } |
337 | 349 | ) |
338 | 350 |
|
| 351 | + annotate_ci_build_with_prototype_build_install_link(app_display_name: app_display_name) |
| 352 | + end |
| 353 | + |
| 354 | + # Adds an install link for prototype build via PR comment |
| 355 | + # |
| 356 | + # @param [String] project the GitHub repository (e.g., 'wordpress-mobile/WordPress-Android') |
| 357 | + # @param [String] app_display_name the display name of the app (e.g., 'WordPress Android') |
| 358 | + # @param [String] app_icon the Buildkite emoji for the app (e.g., ':wordpress:') |
| 359 | + # @param [Hash] metadata additional metadata to display in the comment |
| 360 | + # |
| 361 | + def comment_on_pr_with_prototype_build_install_link(project:, app_display_name:, app_icon: nil, metadata: {}) |
| 362 | + pr_number = ENV.fetch('BUILDKITE_PULL_REQUEST', nil) |
| 363 | + return unless pr_number && pr_number != 'false' |
| 364 | + |
339 | 365 | comment_on_pr( |
340 | | - project: GITHUB_REPO, |
341 | | - pr_number: Integer(ENV.fetch('BUILDKITE_PULL_REQUEST', nil)), |
342 | | - reuse_identifier: "#{product.downcase}-prototype-build-link", |
343 | | - body: comment_body |
| 366 | + project: project, |
| 367 | + pr_number: Integer(pr_number), |
| 368 | + reuse_identifier: "#{app_display_name.downcase.gsub(' ', '-')}-prototype-build-link", |
| 369 | + body: prototype_build_details_comment( |
| 370 | + app_display_name: app_display_name, |
| 371 | + app_icon: app_icon, |
| 372 | + metadata: metadata, |
| 373 | + footnote: '<em>Note: Google Login is not supported on these builds.</em>' |
| 374 | + ) |
344 | 375 | ) |
| 376 | + end |
345 | 377 |
|
| 378 | + # If running in Buildkite, annotates the current build with prototype build info |
| 379 | + # |
| 380 | + # @param [String] app_display_name the display name of the app |
| 381 | + # |
| 382 | + def annotate_ci_build_with_prototype_build_install_link(app_display_name:) |
346 | 383 | return unless ENV['BUILDKITE'] |
347 | 384 |
|
348 | | - message = "#{product} Prototype Build: [#{filename}](#{install_url})" |
349 | | - buildkite_annotate(style: 'info', context: "prototype-build-#{product}", message: message) |
350 | | - buildkite_metadata(set: { versionName: version_name, 'build:flavor': PROTOTYPE_BUILD_FLAVOR, 'build:type': PROTOTYPE_BUILD_TYPE }) |
| 385 | + install_link = 'Firebase App Distribution' |
| 386 | + install_url = lane_context[SharedValues::FIREBASE_APP_DISTRO_RELEASE]&.dig(:testingUri) |
| 387 | + install_link = "[#{install_link}](#{install_url})" unless install_url.nil? |
| 388 | + |
| 389 | + buildkite_annotate( |
| 390 | + style: 'success', |
| 391 | + context: "prototype-build-#{app_display_name.downcase.gsub(' ', '-')}", |
| 392 | + message: "#{app_display_name} Prototype Build uploaded to #{install_link}" |
| 393 | + ) |
351 | 394 | end |
352 | 395 |
|
353 | 396 | # This function is Buildkite-specific |
|
0 commit comments