summaryrefslogtreecommitdiff
path: root/app/models/commit.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/commit.rb')
-rw-r--r--app/models/commit.rb84
1 files changed, 48 insertions, 36 deletions
diff --git a/app/models/commit.rb b/app/models/commit.rb
index e173ed4..eea3653 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -93,30 +93,50 @@ class Commit < ActiveRecord::Base
recipients.uniq
end
- def create_builds
- return if skip_ci?
+ def job_type
+ return unless config_processor
+ job_types = builds_without_retry.select(&:active?).map(&:job_type)
+ config_processor.types.find { |job_type| job_types.include? job_type }
+ end
- begin
- builds_for_ref = config_processor.builds_for_ref(ref, tag)
- rescue GitlabCiYamlProcessor::ValidationError => e
- save_yaml_error(e.message) and return
- rescue Exception => e
- logger.error e.message + "\n" + e.backtrace.join("\n")
- save_yaml_error("Undefined yaml error") and return
- end
+ def create_builds_for_type(job_type)
+ return if skip_ci?
+ return unless config_processor
- builds_for_ref.each do |build_attrs|
+ builds_attrs = config_processor.builds_for_type_and_ref(job_type, ref, tag)
+ builds_attrs.map do |build_attrs|
builds.create!({
project: project,
name: build_attrs[:name],
commands: build_attrs[:script],
tag_list: build_attrs[:tags],
options: build_attrs[:options],
- allow_failure: build_attrs[:allow_failure]
+ allow_failure: build_attrs[:allow_failure],
+ job_type: build_attrs[:type]
})
end
end
+ def create_next_builds
+ return if skip_ci?
+ return unless config_processor
+
+ build_types = builds.group_by(&:job_type)
+
+ config_processor.types.any? do |job_type|
+ !build_types.include?(job_type) && create_builds_for_type(job_type).present?
+ end
+ end
+
+ def create_builds
+ return if skip_ci?
+ return unless config_processor
+
+ config_processor.types.any? do |job_type|
+ create_builds_for_type(job_type).present?
+ end
+ end
+
def builds_without_retry
@builds_without_retry ||=
begin
@@ -127,33 +147,17 @@ class Commit < ActiveRecord::Base
end
end
- def retried_builds
- @retried_builds ||= (builds - builds_without_retry)
- end
+ def builds_without_retry_sorted
+ return builds_without_retry unless config_processor
- def create_deploy_builds
- return if skip_ci?
-
- begin
- deploy_builds_for_ref = config_processor.deploy_builds_for_ref(ref, tag)
- rescue GitlabCiYamlProcessor::ValidationError => e
- save_yaml_error(e.message) and return
- rescue Exception => e
- logger.error e.message + "\n" + e.backtrace.join("\n")
- save_yaml_error("Undefined yaml error") and return
+ job_types = config_processor.types
+ builds_without_retry.sort_by do |build|
+ [job_types.index(build.job_type) || -1, build.name || ""]
end
+ end
- deploy_builds_for_ref.each do |build_attrs|
- builds.create!({
- project: project,
- name: build_attrs[:name],
- commands: build_attrs[:script],
- tag_list: build_attrs[:tags],
- options: build_attrs[:options],
- allow_failure: build_attrs[:allow_failure],
- deploy: true
- })
- end
+ def retried_builds
+ @retried_builds ||= (builds.order(id: :desc) - builds_without_retry)
end
def status
@@ -225,6 +229,13 @@ class Commit < ActiveRecord::Base
def config_processor
@config_processor ||= GitlabCiYamlProcessor.new(push_data[:ci_yaml_file] || project.generated_yaml_config)
+ rescue GitlabCiYamlProcessor::ValidationError => e
+ save_yaml_error(e.message)
+ nil
+ rescue Exception => e
+ logger.error e.message + "\n" + e.backtrace.join("\n")
+ save_yaml_error("Undefined yaml error")
+ nil
end
def skip_ci?
@@ -235,6 +246,7 @@ class Commit < ActiveRecord::Base
private
def save_yaml_error(error)
+ return unless self.yaml_errors?
self.yaml_errors = error
save
end