Commit cd03aebe authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab-ce master

parents 53e825cd 2bf5a1ac
...@@ -31,7 +31,7 @@ class Issue < ApplicationRecord ...@@ -31,7 +31,7 @@ class Issue < ApplicationRecord
has_internal_id :iid, scope: :project, init: ->(s) { s&.project&.issues&.maximum(:iid) } has_internal_id :iid, scope: :project, init: ->(s) { s&.project&.issues&.maximum(:iid) }
has_many :events, as: :target, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :events, as: :target, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
has_many :merge_requests_closing_issues, has_many :merge_requests_closing_issues,
class_name: 'MergeRequestsClosingIssues', class_name: 'MergeRequestsClosingIssues',
......
...@@ -56,7 +56,7 @@ class MergeRequest < ApplicationRecord ...@@ -56,7 +56,7 @@ class MergeRequest < ApplicationRecord
belongs_to :head_pipeline, foreign_key: "head_pipeline_id", class_name: "Ci::Pipeline" belongs_to :head_pipeline, foreign_key: "head_pipeline_id", class_name: "Ci::Pipeline"
has_many :events, as: :target, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :events, as: :target, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
has_many :merge_requests_closing_issues, has_many :merge_requests_closing_issues,
class_name: 'MergeRequestsClosingIssues', class_name: 'MergeRequestsClosingIssues',
......
...@@ -39,7 +39,7 @@ class Milestone < ApplicationRecord ...@@ -39,7 +39,7 @@ class Milestone < ApplicationRecord
has_many :issues has_many :issues
has_many :labels, -> { distinct.reorder('labels.title') }, through: :issues has_many :labels, -> { distinct.reorder('labels.title') }, through: :issues
has_many :merge_requests has_many :merge_requests
has_many :events, as: :target, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :events, as: :target, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
scope :of_projects, ->(ids) { where(project_id: ids) } scope :of_projects, ->(ids) { where(project_id: ids) }
scope :of_groups, ->(ids) { where(group_id: ids) } scope :of_groups, ->(ids) { where(group_id: ids) }
......
...@@ -78,7 +78,7 @@ class Note < ApplicationRecord ...@@ -78,7 +78,7 @@ class Note < ApplicationRecord
# suggestions.delete_all calls # suggestions.delete_all calls
has_many :suggestions, -> { order(:relative_order) }, has_many :suggestions, -> { order(:relative_order) },
inverse_of: :note, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent inverse_of: :note, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
has_many :events, as: :target, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :events, as: :target, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
has_one :system_note_metadata has_one :system_note_metadata
has_one :note_diff_file, inverse_of: :diff_note, foreign_key: :diff_note_id has_one :note_diff_file, inverse_of: :diff_note, foreign_key: :diff_note_id
......
...@@ -131,7 +131,7 @@ class User < ApplicationRecord ...@@ -131,7 +131,7 @@ class User < ApplicationRecord
has_many :notes, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent has_many :notes, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :issues, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent has_many :issues, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :merge_requests, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent has_many :merge_requests, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :events, dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent has_many :events, dependent: :delete_all, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :releases, dependent: :nullify, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent has_many :releases, dependent: :nullify, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
has_many :subscriptions, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :subscriptions, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :oauth_applications, class_name: 'Doorkeeper::Application', as: :owner, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :oauth_applications, class_name: 'Doorkeeper::Application', as: :owner, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
......
---
title: Passing job rules downstream and E2E specs for job:rules configuration
merge_request: 32609
author:
type: fixed
...@@ -102,7 +102,7 @@ The repository will push soon. To force a push, click the appropriate button. ...@@ -102,7 +102,7 @@ The repository will push soon. To force a push, click the appropriate button.
> - [Added Git LFS support](https://gitlab.com/gitlab-org/gitlab-ee/issues/10871) in [GitLab Starter](https://about.gitlab.com/pricing/) 11.11. > - [Added Git LFS support](https://gitlab.com/gitlab-org/gitlab-ee/issues/10871) in [GitLab Starter](https://about.gitlab.com/pricing/) 11.11.
NOTE: **Note:** This feature [is available for free](https://gitlab.com/gitlab-org/gitlab-ee/issues/10361) to NOTE: **Note:** This feature [is available for free](https://gitlab.com/gitlab-org/gitlab-ee/issues/10361) to
GitLab.com users until September 22nd, 2019. GitLab.com users until March 22nd, 2020.
You can set up a repository to automatically have its branches, tags, and commits updated from an You can set up a repository to automatically have its branches, tags, and commits updated from an
upstream repository. upstream repository.
......
...@@ -6,7 +6,14 @@ module Gitlab ...@@ -6,7 +6,14 @@ module Gitlab
class Rules class Rules
include ::Gitlab::Utils::StrongMemoize include ::Gitlab::Utils::StrongMemoize
Result = Struct.new(:when, :start_in) Result = Struct.new(:when, :start_in) do
def build_attributes
{
when: self.when,
options: { start_in: start_in }.compact
}.compact
end
end
def initialize(rule_hashes, default_when = 'on_success') def initialize(rule_hashes, default_when = 'on_success')
@rule_list = Rule.fabricate_list(rule_hashes) @rule_list = Rule.fabricate_list(rule_hashes)
......
...@@ -13,9 +13,7 @@ module Gitlab ...@@ -13,9 +13,7 @@ module Gitlab
UnknownClauseError = Class.new(StandardError) UnknownClauseError = Class.new(StandardError)
def self.fabricate(type, value) def self.fabricate(type, value)
type = type.to_s.camelize "#{self}::#{type.to_s.camelize}".safe_constantize&.new(value)
self.const_get(type).new(value) if self.const_defined?(type)
end end
def initialize(spec) def initialize(spec)
......
...@@ -122,7 +122,7 @@ module Gitlab ...@@ -122,7 +122,7 @@ module Gitlab
helpers :before_script, :script, :stage, :type, :after_script, helpers :before_script, :script, :stage, :type, :after_script,
:cache, :image, :services, :only, :except, :variables, :cache, :image, :services, :only, :except, :variables,
:artifacts, :environment, :coverage, :retry, :artifacts, :environment, :coverage, :retry, :rules,
:parallel, :needs, :interruptible :parallel, :needs, :interruptible
attributes :script, :tags, :allow_failure, :when, :dependencies, attributes :script, :tags, :allow_failure, :when, :dependencies,
...@@ -145,6 +145,13 @@ module Gitlab ...@@ -145,6 +145,13 @@ module Gitlab
end end
@entries.delete(:type) @entries.delete(:type)
# This is something of a hack, see issue for details:
# https://gitlab.com/gitlab-org/gitlab-ce/issues/67150
if !only_defined? && has_rules?
@entries.delete(:only)
@entries.delete(:except)
end
end end
inherit!(deps) inherit!(deps)
...@@ -203,6 +210,7 @@ module Gitlab ...@@ -203,6 +210,7 @@ module Gitlab
cache: cache_value, cache: cache_value,
only: only_value, only: only_value,
except: except_value, except: except_value,
rules: has_rules? ? rules_value : nil,
variables: variables_defined? ? variables_value : {}, variables: variables_defined? ? variables_value : {},
environment: environment_defined? ? environment_value : nil, environment: environment_defined? ? environment_value : nil,
environment_name: environment_defined? ? environment_value[:name] : nil, environment_name: environment_defined? ? environment_value[:name] : nil,
......
...@@ -26,6 +26,10 @@ module Gitlab ...@@ -26,6 +26,10 @@ module Gitlab
end end
end end
end end
def value
@config
end
end end
end end
end end
......
...@@ -145,7 +145,7 @@ module Gitlab ...@@ -145,7 +145,7 @@ module Gitlab
def rules_attributes def rules_attributes
strong_memoize(:rules_attributes) do strong_memoize(:rules_attributes) do
@using_rules ? @rules.evaluate(@pipeline, self).to_h.compact : {} @using_rules ? @rules.evaluate(@pipeline, self).build_attributes : {}
end end
end end
end end
......
...@@ -42,6 +42,7 @@ module Gitlab ...@@ -42,6 +42,7 @@ module Gitlab
yaml_variables: yaml_variables(name), yaml_variables: yaml_variables(name),
needs_attributes: job[:needs]&.map { |need| { name: need } }, needs_attributes: job[:needs]&.map { |need| { name: need } },
interruptible: job[:interruptible], interruptible: job[:interruptible],
rules: job[:rules],
options: { options: {
image: job[:image], image: job[:image],
services: job[:services], services: job[:services],
......
...@@ -46,7 +46,7 @@ describe Gitlab::Ci::Pipeline::Seed::Build do ...@@ -46,7 +46,7 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
context 'is matched' do context 'is matched' do
let(:attributes) { { name: 'rspec', ref: 'master', rules: [{ if: '$VAR == null', when: 'delayed', start_in: '3 hours' }] } } let(:attributes) { { name: 'rspec', ref: 'master', rules: [{ if: '$VAR == null', when: 'delayed', start_in: '3 hours' }] } }
it { is_expected.to include(when: 'delayed', start_in: '3 hours') } it { is_expected.to include(when: 'delayed', options: { start_in: '3 hours' }) }
end end
context 'is not matched' do context 'is not matched' do
...@@ -541,7 +541,7 @@ describe Gitlab::Ci::Pipeline::Seed::Build do ...@@ -541,7 +541,7 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
it { is_expected.to be_included } it { is_expected.to be_included }
it 'correctly populates when:' do it 'correctly populates when:' do
expect(seed_build.attributes).to include(when: 'delayed', start_in: '1 day') expect(seed_build.attributes).to include(when: 'delayed', options: { start_in: '1 day' })
end end
end end
end end
......
...@@ -16,7 +16,10 @@ module Gitlab ...@@ -16,7 +16,10 @@ module Gitlab
let(:config) do let(:config) do
YAML.dump( YAML.dump(
before_script: ['pwd'], before_script: ['pwd'],
rspec: { script: 'rspec' } rspec: {
script: 'rspec',
interruptible: true
}
) )
end end
...@@ -29,6 +32,7 @@ module Gitlab ...@@ -29,6 +32,7 @@ module Gitlab
before_script: ["pwd"], before_script: ["pwd"],
script: ["rspec"] script: ["rspec"]
}, },
interruptible: true,
allow_failure: false, allow_failure: false,
when: "on_success", when: "on_success",
yaml_variables: [] yaml_variables: []
...@@ -36,6 +40,36 @@ module Gitlab ...@@ -36,6 +40,36 @@ module Gitlab
end end
end end
context 'with job rules' do
let(:config) do
YAML.dump(
rspec: {
script: 'rspec',
rules: [
{ if: '$CI_COMMIT_REF_NAME == "master"' },
{ changes: %w[README.md] }
]
}
)
end
it 'returns valid build attributes' do
expect(subject).to eq({
stage: 'test',
stage_idx: 1,
name: 'rspec',
options: { script: ['rspec'] },
rules: [
{ if: '$CI_COMMIT_REF_NAME == "master"' },
{ changes: %w[README.md] }
],
allow_failure: false,
when: 'on_success',
yaml_variables: []
})
end
end
describe 'coverage entry' do describe 'coverage entry' do
describe 'code coverage regexp' do describe 'code coverage regexp' do
let(:config) do let(:config) do
...@@ -1252,7 +1286,7 @@ module Gitlab ...@@ -1252,7 +1286,7 @@ module Gitlab
end end
end end
describe 'rules' do context 'with when/rules conflict' do
subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)) } subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)) }
let(:config) do let(:config) do
......
...@@ -32,7 +32,7 @@ describe User do ...@@ -32,7 +32,7 @@ describe User do
it { is_expected.to have_many(:groups) } it { is_expected.to have_many(:groups) }
it { is_expected.to have_many(:keys).dependent(:destroy) } it { is_expected.to have_many(:keys).dependent(:destroy) }
it { is_expected.to have_many(:deploy_keys).dependent(:nullify) } it { is_expected.to have_many(:deploy_keys).dependent(:nullify) }
it { is_expected.to have_many(:events).dependent(:destroy) } it { is_expected.to have_many(:events).dependent(:delete_all) }
it { is_expected.to have_many(:issues).dependent(:destroy) } it { is_expected.to have_many(:issues).dependent(:destroy) }
it { is_expected.to have_many(:notes).dependent(:destroy) } it { is_expected.to have_many(:notes).dependent(:destroy) }
it { is_expected.to have_many(:merge_requests).dependent(:destroy) } it { is_expected.to have_many(:merge_requests).dependent(:destroy) }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment