Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[actions] add filter date to download_dsyms #17228

Merged
merged 4 commits into from Sep 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions fastlane/lib/fastlane/actions/clean_build_artifacts.rb
Expand Up @@ -23,6 +23,7 @@ def self.run(options)

Actions.lane_context[Actions::SharedValues::SIGH_PROFILE_PATHS] = nil
Actions.lane_context[Actions::SharedValues::DSYM_PATHS] = nil
Actions.lane_context[Actions::SharedValues::DSYM_LATEST_UPLOADED_DATE] = nil

UI.success('Cleaned up build artifacts 🐙')
end
Expand Down
36 changes: 30 additions & 6 deletions fastlane/lib/fastlane/actions/download_dsyms.rb
Expand Up @@ -2,13 +2,15 @@ module Fastlane
module Actions
module SharedValues
DSYM_PATHS = :DSYM_PATHS
DSYM_LATEST_UPLOADED_DATE = :DSYM_LATEST_UPLOADED_DATE
end
class DownloadDsymsAction < Action
# rubocop:disable Metrics/PerceivedComplexity
def self.run(params)
require 'openssl'
require 'spaceship'
require 'net/http'
require 'date'

# Team selection passed though FASTLANE_ITC_TEAM_ID and FASTLANE_ITC_TEAM_NAME environment variables
# Prompts select team if multiple teams and none specified
Expand All @@ -30,6 +32,7 @@ def self.run(params)
wait_for_dsym_processing = params[:wait_for_dsym_processing]
wait_timeout = params[:wait_timeout]
min_version = Gem::Version.new(params[:min_version]) if params[:min_version]
after_uploaded_date = DateTime.parse(params[:after_uploaded_date]) unless params[:after_uploaded_date].nil?

platform = Spaceship::ConnectAPI::Platform.map(itc_platform)

Expand Down Expand Up @@ -81,6 +84,7 @@ def self.run(params)
builds.each do |build|
asc_app_version = build.app_version
asc_build_number = build.version
uploaded_date = DateTime.parse(build.uploaded_date)

message = []
message << "Found train (version): #{asc_app_version}"
Expand All @@ -97,6 +101,11 @@ def self.run(params)
next
end

if after_uploaded_date && after_uploaded_date >= uploaded_date
UI.verbose("Upload date #{after_uploaded_date} not reached: #{uploaded_date}")
next
end

message = []
message << "Found build version: #{asc_build_number}"
message << ", comparing to supplied build_number: #{build_number}" if build_number
Expand All @@ -108,11 +117,11 @@ def self.run(params)
end

UI.verbose("Build_version: #{asc_build_number} matches #{build_number}, grabbing dsym_url") if build_number
get_details_and_download_dsym(app: app, train: asc_app_version, build_number: asc_build_number, platform: itc_platform, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
get_details_and_download_dsym(app: app, train: asc_app_version, build_number: asc_build_number, uploaded_date: uploaded_date, platform: itc_platform, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
end
end

def self.get_details_and_download_dsym(app: nil, train: nil, build_number: nil, platform: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
def self.get_details_and_download_dsym(app: nil, train: nil, build_number: nil, uploaded_date: nil, platform: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
start = Time.now
download_url = nil

Expand Down Expand Up @@ -144,7 +153,7 @@ def self.get_details_and_download_dsym(app: nil, train: nil, build_number: nil,
end

if download_url
self.download(download_url, app.bundle_id, train, build_number, output_directory)
self.download(download_url, app.bundle_id, train, build_number, uploaded_date, output_directory)
return if build_number
else
UI.message("No dSYM URL for #{build_number} (#{train})")
Expand All @@ -165,13 +174,20 @@ def self.get_latest_build!(app_id: nil, version: nil, platform: nil)
return latest_build
end

def self.download(download_url, bundle_id, train_number, build_version, output_directory)
def self.download(download_url, bundle_id, train_number, build_version, uploaded_date, output_directory)
result = self.download_file(download_url)
path = write_dsym(result, bundle_id, train_number, build_version, output_directory)
UI.success("🔑 Successfully downloaded dSYM file for #{train_number} - #{build_version} to '#{path}'")

Actions.lane_context[SharedValues::DSYM_PATHS] ||= []
Actions.lane_context[SharedValues::DSYM_PATHS] << File.expand_path(path)

unless uploaded_date.nil?
Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] ||= uploaded_date
current_latest = Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE]
Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE] = [current_latest, uploaded_date].max
UI.verbose("Most recent build uploaded_date #{Actions.lane_context[SharedValues::DSYM_LATEST_UPLOADED_DATE]}")
end
end

def self.write_dsym(data, bundle_id, train_number, build_number, output_directory)
Expand Down Expand Up @@ -286,6 +302,12 @@ def self.available_options
env_name: "DOWNLOAD_DSYMS_MIN_VERSION",
description: "The minimum app version for dSYMs you wish to download",
optional: true),
FastlaneCore::ConfigItem.new(key: :after_uploaded_date,
short_option: "-d",
env_name: "DOWNLOAD_DSYMS_AFTER_UPLOADED_DATE",
description: "The uploaded date after which you wish to download dSYMs",
optional: true,
is_string: true),
FastlaneCore::ConfigItem.new(key: :output_directory,
short_option: "-s",
env_name: "DOWNLOAD_DSYMS_OUTPUT_DIRECTORY",
Expand All @@ -310,7 +332,8 @@ def self.available_options

def self.output
[
['DSYM_PATHS', 'An array to all the zipped dSYM files']
['DSYM_PATHS', 'An array to all the zipped dSYM files'],
['DSYM_LATEST_UPLOADED_DATE', 'Date of the most recent uploaded time of successfully downloaded dSYM files']
]
end

Expand All @@ -332,7 +355,8 @@ def self.example_code
'download_dsyms(version: "1.0.0", build_number: "345")',
'download_dsyms(version: "1.0.1", build_number: 42)',
'download_dsyms(version: "live")',
'download_dsyms(min_version: "1.2.3")'
'download_dsyms(min_version: "1.2.3")',
'download_dsyms(after_uploaded_date: "2020-09-11T19:00:00+01:00")'
]
end

Expand Down
75 changes: 60 additions & 15 deletions fastlane/spec/actions_specs/download_dsyms_spec.rb
Expand Up @@ -73,12 +73,18 @@
it 'downloads all dsyms of all builds in all trains' do
expect(build_resp).to receive(:to_models).and_return([build1, build2, build3, build4, build5, build6])

[[build1, '1.0.0', '1'], [build2, '1.0.0', '2'], [build3, '1.7.0', '4'], [build4, '2.0.0', '1'], [build5, '2.0.0', '2'], [build6, '2.0.0', '5']].each do |build, version, build_number|
[[build1, '1.0.0', '1', '2020-09-12T10:00:00+01:00'],
[build2, '1.0.0', '2', '2020-09-12T11:00:00+01:00'],
[build3, '1.7.0', '4', '2020-09-12T12:00:00+01:00'],
[build4, '2.0.0', '1', '2020-09-12T13:00:00+01:00'],
[build5, '2.0.0', '2', '2020-09-12T14:00:00+01:00'],
[build6, '2.0.0', '5', '2020-09-12T15:00:00+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)
expect(tunes_client).to receive(:build_details).with(app_id: app.id, train: version, build_number: build_number, platform: :ios).and_return(build_detail_resp)
expect(Spaceship::Tunes::BuildDetails).to receive(:factory).with(build_detail_resp).and_return(build_detail)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, nil)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, DateTime.parse(uploaded_date), nil)
end

expect(Fastlane::Actions::DownloadDsymsAction).not_to(receive(:download))
Expand All @@ -93,12 +99,13 @@
it 'downloads all dsyms of all builds in train 1.07.0' do
expect(build_resp).to receive(:to_models).and_return([build1])

[[build1, '1.7.0', '3']].each do |build, version, build_number|
[[build1, '1.7.0', '3', '2020-09-12T14:10:30+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)
expect(tunes_client).to receive(:build_details).with(app_id: app.id, train: version, build_number: build_number, platform: :ios).and_return(build_detail_resp)
expect(Spaceship::Tunes::BuildDetails).to receive(:factory).with(build_detail_resp).and_return(build_detail)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, nil)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, DateTime.parse(uploaded_date), nil)
end

Fastlane::FastFile.new.parse("lane :test do
Expand All @@ -111,12 +118,13 @@
it 'downloads the correct dsyms' do
expect(build_resp).to receive(:to_models).and_return([build1])

[[build1, '2.0.0', '2']].each do |build, version, build_number|
[[build1, '2.0.0', '2', '2020-09-12T14:10:30+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)
expect(tunes_client).to receive(:build_details).with(app_id: app.id, train: version, build_number: build_number, platform: :ios).and_return(build_detail_resp)
expect(Spaceship::Tunes::BuildDetails).to receive(:factory).with(build_detail_resp).and_return(build_detail)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, nil)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, DateTime.parse(uploaded_date), nil)
end

Fastlane::FastFile.new.parse("lane :test do
Expand All @@ -134,18 +142,20 @@

expect(build_resp).to receive(:to_models).and_return([build1, build2])

[[build1, '2.0.0', '2']].each do |build, version, build_number|
[[build1, '2.0.0', '2', '2020-09-12T10:00:00+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)
end

[[build2, '2.0.0', '3']].each do |build, version, build_number|
[[build2, '2.0.0', '3', '2020-09-12T11:00:00+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version).twice
expect(build).to receive(:version).and_return(build_number).twice
expect(build).to receive(:uploaded_date).and_return(uploaded_date)

expect(tunes_client).to receive(:build_details).with(app_id: app.id, train: version, build_number: build_number, platform: :ios).and_return(build_detail_resp)
expect(Spaceship::Tunes::BuildDetails).to receive(:factory).with(build_detail_resp).and_return(build_detail)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, nil)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, DateTime.parse(uploaded_date), nil)
end

Fastlane::FastFile.new.parse("lane :test do
Expand All @@ -164,18 +174,20 @@

expect(build_resp).to receive(:to_models).and_return([build1, build2])

[[build1, '1.0.0', '33']].each do |build, version, build_number|
[[build1, '1.0.0', '33', '2020-09-12T14:10:30+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)
end

[[build2, '1.0.0', '42']].each do |build, version, build_number|
[[build2, '1.0.0', '42', '2020-09-12T14:10:30+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)

expect(tunes_client).to receive(:build_details).with(app_id: app.id, train: version, build_number: build_number, platform: :ios).and_return(build_detail_resp)
expect(Spaceship::Tunes::BuildDetails).to receive(:factory).with(build_detail_resp).and_return(build_detail)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, nil)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, DateTime.parse(uploaded_date), nil)
end

Fastlane::FastFile.new.parse("lane :test do
Expand All @@ -188,25 +200,58 @@
it 'downloads only dsyms of trains newer than or equal min_version' do
expect(build_resp).to receive(:to_models).and_return([build1, build2])

[[build1, '1.0.0', '33']].each do |build, version, build_number|
[[build1, '1.0.0', '33', '2020-09-12T14:10:30+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)
end

[[build2, '2.0.0', '42']].each do |build, version, build_number|
[[build2, '2.0.0', '42', '2020-09-12T14:10:30+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)

expect(tunes_client).to receive(:build_details).with(app_id: app.id, train: version, build_number: build_number, platform: :ios).and_return(build_detail_resp)
expect(Spaceship::Tunes::BuildDetails).to receive(:factory).with(build_detail_resp).and_return(build_detail)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, nil)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, DateTime.parse(uploaded_date), nil)
end

Fastlane::FastFile.new.parse("lane :test do
download_dsyms(username: 'user@fastlane.tools', app_identifier: 'tools.fastlane.myapp', min_version: '2.0.0')
end").runner.execute(:test)
end
end

context 'with after_uploaded_date' do
it 'downloads dsyms with more recent uploaded_date' do
expect(build_resp).to receive(:to_models).and_return([build1, build2, build3, build4, build5, build6])

[[build1, '1.0.0', '1', '2020-09-12T10:00:00+01:00'],
[build2, '1.0.0', '2', '2020-09-12T11:00:00+01:00'],
[build3, '1.7.0', '4', '2020-09-12T12:00:00+01:00'],
[build4, '2.0.0', '1', '2020-09-12T13:00:00+01:00']].each do |build, verison, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)
end

[[build5, '2.0.0', '2', '2020-09-12T14:00:00+01:00'],
[build6, '2.0.0', '5', '2020-09-12T15:00:00+01:00']].each do |build, version, build_number, uploaded_date|
expect(build).to receive(:app_version).and_return(version)
expect(build).to receive(:version).and_return(build_number)
expect(build).to receive(:uploaded_date).and_return(uploaded_date)
expect(tunes_client).to receive(:build_details).with(app_id: app.id, train: version, build_number: build_number, platform: :ios).and_return(build_detail_resp)
expect(Spaceship::Tunes::BuildDetails).to receive(:factory).with(build_detail_resp).and_return(build_detail)
expect(Fastlane::Actions::DownloadDsymsAction).to receive(:download).with(download_url, app.bundle_id, version, build_number, DateTime.parse(uploaded_date), nil)
end

expect(Fastlane::Actions::DownloadDsymsAction).not_to(receive(:download))

Fastlane::FastFile.new.parse("lane :test do
download_dsyms(username: 'user@fastlane.tools', app_identifier: 'tools.fastlane.myapp', after_uploaded_date: '2020-09-12T13:00:00+01:00')
end").runner.execute(:test)
end
end
end
end
end