Class: Fastlane::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/fastlane/runner.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#current_laneObject

Symbol for the current lane



4
5
6
# File 'lib/fastlane/runner.rb', line 4

def current_lane
  @current_lane
end

#current_platformObject

Symbol for the current platform



7
8
9
# File 'lib/fastlane/runner.rb', line 7

def current_platform
  @current_platform
end

#lanesHash

Returns All the lanes available, first the platform, then the lane.

Returns:

  • (Hash)

    All the lanes available, first the platform, then the lane



10
11
12
# File 'lib/fastlane/runner.rb', line 10

def lanes
  @lanes
end

Instance Method Details

#add_lane(lane) ⇒ Object

Parameters:

  • lane (Lane)

    A lane object



174
175
176
177
178
179
180
# File 'lib/fastlane/runner.rb', line 174

def add_lane(lane)
  lanes[lane.platform] ||= {}

  raise "Lane '#{lane.name}' was defined multiple times!".red if lanes[lane.platform][lane.name]
  
  lanes[lane.platform][lane.name] = lane
end

#after_all_blocksObject



202
203
204
# File 'lib/fastlane/runner.rb', line 202

def after_all_blocks
  @after_all ||= {}
end

#available_lanes(filter_platform = nil) ⇒ Object

Returns an array of lanes (platform lane_name) to print them out to the user.

Parameters:

  • filter_platform:

    Filter, to only show the lanes of a given platform

Returns:

  • an array of lanes (platform lane_name) to print them out to the user



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/fastlane/runner.rb', line 70

def available_lanes(filter_platform = nil)
  all = []
  lanes.each do |platform, platform_lanes|
    next if (filter_platform and filter_platform.to_s != platform.to_s) # skip actions that don't match

    platform_lanes.each do |lane_name, lane|
      all << [platform, lane_name].reject(&:nil?).join(' ')
    end
  end
  all
end

#before_all_blocksObject



198
199
200
# File 'lib/fastlane/runner.rb', line 198

def before_all_blocks
  @before_all ||= {}
end

#collectorObject



161
162
163
# File 'lib/fastlane/runner.rb', line 161

def collector
  @collector ||= ActionCollector.new
end

#did_finishObject

Fastfile was finished executing



166
167
168
# File 'lib/fastlane/runner.rb', line 166

def did_finish
  collector.did_finish
end

#error_blocksObject



206
207
208
# File 'lib/fastlane/runner.rb', line 206

def error_blocks
  @error_blocks ||= {}
end

#execute(lane, platform = nil, parameters = nil) ⇒ Object

This will take care of executing one lane. That’s when the user triggers a lane from the CLI for example This method is not executed when switching a lane

Parameters:

  • lane_name

    The name of the lane to execute

  • platform (defaults to: nil)

    The name of the platform to execute

  • parameters (Hash) (defaults to: nil)

    The parameters passed from the command line to the lane



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/fastlane/runner.rb', line 21

def execute(lane, platform = nil, parameters = nil)
  raise "No lane given" unless lane

  self.current_lane = lane.to_sym
  self.current_platform = (platform ? platform.to_sym : nil)

  ENV["FASTLANE_LANE_NAME"] = current_lane.to_s
  ENV["FASTLANE_PLATFORM_NAME"] = (current_platform ? current_platform.to_s : nil)
  
  Actions.lane_context[Actions::SharedValues::PLATFORM_NAME] = current_platform
  Actions.lane_context[Actions::SharedValues::LANE_NAME] = full_lane_name

  Helper.log.info "Driving the lane '#{full_lane_name}' πŸš€".green

  return_val = nil

  path_to_use = Fastlane::FastlaneFolder.path || Dir.pwd
  Dir.chdir(path_to_use) do # the file is located in the fastlane folder

    unless (lanes[current_platform][current_lane] rescue nil)
      raise "Could not find lane '#{full_lane_name}'. Available lanes: #{available_lanes.join(', ')}".red
    end

    # Call the platform specific before_all block and then the general one
    before_all_blocks[current_platform].call(current_lane) if (before_all_blocks[current_platform] and current_platform)
    before_all_blocks[nil].call(current_lane) if before_all_blocks[nil]
    
    return_val = lanes[current_platform][current_lane].call(parameters || {}) # by default no parameters
    
    # `after_all` is only called if no exception was raised before
    # Call the platform specific before_all block and then the general one
    after_all_blocks[current_platform].call(current_lane) if (after_all_blocks[current_platform] and current_platform)
    after_all_blocks[nil].call(current_lane) if (after_all_blocks[nil])
  end

  return return_val
rescue => ex
  Dir.chdir(path_to_use) do
    # Provide error block exception without colour code
    error_ex = ex.exception(ex.message.gsub(/\033\[\d+m/, ''))

    error_blocks[current_platform].call(current_lane, error_ex) if (error_blocks[current_platform] and current_platform)
    error_blocks[nil].call(current_lane, error_ex) if error_blocks[nil]
  end
  raise ex
end

#execute_action(method_sym, class_ref, arguments) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/fastlane/runner.rb', line 113

def execute_action(method_sym, class_ref, arguments)
  collector.did_launch_action(method_sym)

  step_name = class_ref.step_text rescue nil
  step_name = method_sym.to_s unless step_name

  verify_supported_os(method_sym, class_ref)

  Helper.log_alert("Step: " + step_name)

  begin
    Dir.chdir('..') do # go up from the fastlane folder, to the project folder
      Actions.execute_action(method_sym) do
        # arguments is an array by default, containing an hash with the actual parameters
        # Since we usually just need the passed hash, we'll just use the first object if there is only one
        if arguments.count == 0 
          arguments = ConfigurationHelper.parse(class_ref, {}) # no parameters => empty hash
        elsif arguments.count == 1 and arguments.first.kind_of?Hash
          arguments = ConfigurationHelper.parse(class_ref, arguments.first) # Correct configuration passed
        elsif not class_ref.available_options
          # This action does not use the new action format
          # Just passing the arguments to this method
        else
          raise "You have to pass the options for '#{method_sym}' in a different way. Please check out the current documentation on GitHub!".red
        end

        class_ref.run(arguments)
      end
    end
  rescue => ex
    collector.did_raise_error(method_sym)
    raise ex
  end
end

#full_lane_nameObject



12
13
14
# File 'lib/fastlane/runner.rb', line 12

def full_lane_name
  [current_platform, current_lane].reject(&:nil?).join(' ')
end

#set_after_all(platform, block) ⇒ Object



186
187
188
# File 'lib/fastlane/runner.rb', line 186

def set_after_all(platform, block)
  after_all_blocks[platform] = block
end

#set_before_all(platform, block) ⇒ Object



182
183
184
# File 'lib/fastlane/runner.rb', line 182

def set_before_all(platform, block)
  before_all_blocks[platform] = block
end

#set_error(platform, block) ⇒ Object



190
191
192
# File 'lib/fastlane/runner.rb', line 190

def set_error(platform, block)
  error_blocks[platform] = block
end

#try_switch_to_lane(new_lane, parameters) ⇒ Object

All the methods that are usually called on execution



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/fastlane/runner.rb', line 86

def try_switch_to_lane(new_lane, parameters)
  block = lanes.fetch(current_platform, {}).fetch(new_lane, nil)
  block ||= lanes.fetch(nil, {}).fetch(new_lane, nil) # fallback to general lane for multiple platforms
  if block
    original_full = full_lane_name
    original_lane = current_lane

    raise "Parameters for a lane must always be a hash".red unless (parameters.first || {}).kind_of?Hash

    pretty = [new_lane]
    pretty = [current_platform, new_lane] if current_platform
    Helper.log.info "Cruising over to lane '#{pretty.join(' ')}' πŸš–".green

    # Actually switch lane now
    current_lane = new_lane
    collector.did_launch_action(:lane_switch)
    result = block.call(parameters.first || {}) # to always pass a hash
    current_lane = original_lane

    Helper.log.info "Cruising back to lane '#{original_full}' 🚘".green
    return result
  else
    # No action and no lane, raising an exception now
    raise "Could not find action or lane '#{new_lane}'. Check out the README for more details: https://github.com/KrauseFx/fastlane".red
  end
end

#verify_supported_os(name, class_ref) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/fastlane/runner.rb', line 148

def verify_supported_os(name, class_ref)
  if class_ref.respond_to?(:is_supported?)
    if Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]
      # This value is filled in based on the executed platform block. Might be nil when lane is in root of Fastfile
      platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]

      unless class_ref.is_supported?(platform)
        raise "Action '#{name}' doesn't support required operating system '#{platform}'.".red 
      end
    end
  end
end