Class: Gitlab::Experiment::Rollout::Feature
- Inherits:
-
Percent
- Object
- Percent
- Gitlab::Experiment::Rollout::Feature
- Defined in:
- lib/gitlab/experiment/rollout/feature.rb
Instance Method Summary collapse
-
#enabled? ⇒ Boolean
For this rollout strategy to consider an experiment as enabled, we must:.
-
#execute_assignment ⇒ Object
For assignment we first check to see if our feature flag is enabled for “self”.
-
#flipper_id ⇒ Object
This is what’s provided to the ‘Feature.enabled?` call that will be used to determine experiment inclusion.
Instance Method Details
#enabled? ⇒ Boolean
For this rollout strategy to consider an experiment as enabled, we must:
-
have a feature flag yaml file that declares it.
-
be in an environment that permits it.
-
not have rolled out the feature flag at all (no percent of actors, no inclusions, etc.)
14 15 16 17 18 19 20 |
# File 'lib/gitlab/experiment/rollout/feature.rb', line 14 def enabled? return false unless feature_flag_defined? return false unless Gitlab.com? return false unless ::Feature.enabled?(:gitlab_experiment, type: :ops) feature_flag_instance.state != :off end |
#execute_assignment ⇒ Object
For assignment we first check to see if our feature flag is enabled for “self”. This is done by calling ‘#flipper_id` (used behind the scenes by `Feature`). By default this is our `experiment.id` (or more specifically, the context key, which is an anonymous SHA generated using the details of an experiment.
If the ‘Feature.enabled?` check is false, we return nil implicitly, which will assign the control. Otherwise we call super, which will assign a variant evenly, or based on our provided distribution rules.
31 32 33 |
# File 'lib/gitlab/experiment/rollout/feature.rb', line 31 def execute_assignment super if ::Feature.enabled?(feature_flag_name, self, type: :experiment) end |
#flipper_id ⇒ Object
This is what’s provided to the ‘Feature.enabled?` call that will be used to determine experiment inclusion. An experiment may provide an override for this method to make the experiment work on user, group, or projects.
For example, when running an experiment on a project, you could make the experiment assignable by project (using chatops) by implementing a ‘flipper_id` method in the experiment:
def flipper_id
context.project.flipper_id
end
Or even cleaner, simply delegate it:
delegate :flipper_id, to: -> { context.project }
51 52 53 54 55 |
# File 'lib/gitlab/experiment/rollout/feature.rb', line 51 def flipper_id return experiment.flipper_id if experiment.respond_to?(:flipper_id) "Experiment;#{id}" end |