Commit 996ae12c authored by Douwe Maan's avatar Douwe Maan

Add option to "Trigger builds for mirror updates"

parent 97700125
...@@ -4,6 +4,7 @@ v 8.4.0 (unreleased) ...@@ -4,6 +4,7 @@ v 8.4.0 (unreleased)
- Fix "Approvals are not reset after a new push is made if the request is coming from a fork" - Fix "Approvals are not reset after a new push is made if the request is coming from a fork"
- Fix "User is not automatically removed from suggested approvers list if user is deleted" - Fix "User is not automatically removed from suggested approvers list if user is deleted"
- Add option to enforce a semi-linear history by only allowing merge requests to be merged that have been rebased. - Add option to enforce a semi-linear history by only allowing merge requests to be merged that have been rebased.
- Add option to trigger builds when branches or tags are updated from a mirrored upstream repository.
v 8.3.2 v 8.3.2
- No EE-specific changes - No EE-specific changes
......
...@@ -38,6 +38,6 @@ class Projects::MirrorsController < Projects::ApplicationController ...@@ -38,6 +38,6 @@ class Projects::MirrorsController < Projects::ApplicationController
private private
def mirror_params def mirror_params
params.require(:project).permit(:mirror, :import_url, :mirror_user_id) params.require(:project).permit(:mirror, :import_url, :mirror_user_id, :mirror_trigger_builds)
end end
end end
...@@ -260,6 +260,7 @@ class ProjectsController < ApplicationController ...@@ -260,6 +260,7 @@ class ProjectsController < ApplicationController
:merge_requests_template, :merge_requests_template,
:mirror, :mirror,
:mirror_user_id, :mirror_user_id,
:mirror_trigger_builds,
:reset_approvals_on_push :reset_approvals_on_push
) )
end end
......
...@@ -141,6 +141,9 @@ module ApplicationHelper ...@@ -141,6 +141,9 @@ module ApplicationHelper
# Skip if user removed branch right after that # Skip if user removed branch right after that
return false unless project.repository.branch_names.include?(event.branch_name) return false unless project.repository.branch_names.include?(event.branch_name)
# Skip if this was a mirror update
return false if project.mirror? && project.up_to_date_with_upstream?(event.branch_name)
true true
end end
......
...@@ -643,6 +643,17 @@ class Repository ...@@ -643,6 +643,17 @@ class Repository
end end
end end
def up_to_date_with_upstream?(branch_name)
branch_commit = commit(branch_name)
upstream_commit = commit("refs/remotes/#{MIRROR_REMOTE}/#{branch_name}")
if upstream_commit
is_ancestor?(branch_commit.id, upstream_commit.id)
else
false
end
end
def merge_base(first_commit_id, second_commit_id) def merge_base(first_commit_id, second_commit_id)
rugged.merge_base(first_commit_id, second_commit_id) rugged.merge_base(first_commit_id, second_commit_id)
end end
......
class CreateCommitBuildsService class CreateCommitBuildsService
def execute(project, user, params) def execute(project, user, params, mirror_update: false)
return false unless project.builds_enabled? return false unless project.builds_enabled?
return false if !project.mirror_trigger_builds? && mirror_update
sha = params[:checkout_sha] || params[:after] sha = params[:checkout_sha] || params[:after]
origin_ref = params[:ref] origin_ref = params[:ref]
......
...@@ -58,10 +58,13 @@ class GitPushService ...@@ -58,10 +58,13 @@ class GitPushService
@push_data = build_push_data(oldrev, newrev, ref) @push_data = build_push_data(oldrev, newrev, ref)
branch_name = Gitlab::Git.ref_name(ref)
mirror_update = project.mirror? && project.up_to_date_with_upstream?(branch_name)
EventCreateService.new.push(project, user, @push_data) EventCreateService.new.push(project, user, @push_data)
project.execute_hooks(@push_data.dup, :push_hooks) project.execute_hooks(@push_data.dup, :push_hooks)
project.execute_services(@push_data.dup, :push_hooks) project.execute_services(@push_data.dup, :push_hooks)
CreateCommitBuildsService.new.execute(project, @user, @push_data) CreateCommitBuildsService.new.execute(project, @user, @push_data, mirror_update: mirror_update)
ProjectCacheWorker.perform_async(project.id) ProjectCacheWorker.perform_async(project.id)
end end
......
class GitTagPushService class GitTagPushService
attr_accessor :project, :user, :push_data attr_accessor :project, :user, :push_data
def execute(project, user, oldrev, newrev, ref) def execute(project, user, oldrev, newrev, ref, mirror_update: false)
project.repository.expire_cache project.repository.expire_cache
@project, @user = project, user @project, @user = project, user
...@@ -10,7 +10,7 @@ class GitTagPushService ...@@ -10,7 +10,7 @@ class GitTagPushService
EventCreateService.new.push(project, user, @push_data) EventCreateService.new.push(project, user, @push_data)
project.execute_hooks(@push_data.dup, :tag_push_hooks) project.execute_hooks(@push_data.dup, :tag_push_hooks)
project.execute_services(@push_data.dup, :tag_push_hooks) project.execute_services(@push_data.dup, :tag_push_hooks)
CreateCommitBuildsService.new.execute(project, @user, @push_data) CreateCommitBuildsService.new.execute(project, @user, @push_data, mirror_update: mirror_update)
ProjectCacheWorker.perform_async(project.id) ProjectCacheWorker.perform_async(project.id)
true true
......
...@@ -43,7 +43,7 @@ module Projects ...@@ -43,7 +43,7 @@ module Projects
else else
begin begin
repository.ff_merge(current_user, upstream_branch.target, name) repository.ff_merge(current_user, upstream_branch.target, name)
rescue Repository::PreReceiveError, Repository::CommitError => e rescue GitHooksService::PreReceiveError, Repository::CommitError => e
raise UpdateError, e.message raise UpdateError, e.message
end end
end end
...@@ -66,7 +66,7 @@ module Projects ...@@ -66,7 +66,7 @@ module Projects
next if old_tag_target == tag.target next if old_tag_target == tag.target
GitTagPushService.new.execute(project, current_user, old_tag_target, tag.target, "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}") GitTagPushService.new.execute(project, current_user, old_tag_target, tag.target, "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}", mirror_update: true)
end end
fetch_result fetch_result
......
...@@ -162,6 +162,8 @@ ...@@ -162,6 +162,8 @@
phpunit --coverage-text --colors=never (PHP) - phpunit --coverage-text --colors=never (PHP) -
%code ^\s*Lines:\s*\d+.\d+\% %code ^\s*Lines:\s*\d+.\d+\%
- if @project.mirror?
= render 'shared/mirror_trigger_builds_setting', f: f
%fieldset.features %fieldset.features
%legend %legend
......
...@@ -66,5 +66,8 @@ ...@@ -66,5 +66,8 @@
like new branches being created or new commits being pushed to existing branches. like new branches being created or new commits being pushed to existing branches.
They need to have at least master access to this project. They need to have at least master access to this project.
- if @project.builds_enabled?
= render 'shared/mirror_trigger_builds_setting', f: f
.form-actions .form-actions
= f.submit "Save Changes", class: "btn btn-create" = f.submit "Save Changes", class: "btn btn-create"
.form-group
.col-sm-offset-2.col-sm-10
.checkbox
= f.label :mirror_trigger_builds do
= f.check_box :mirror_trigger_builds
%strong
Trigger builds for mirror updates
.help-block
Trigger builds when branches or tags are updated from the upstream repository.
Depending on the activity of the upstream repository, this may greatly increase the load on your CI runners.
Only enable this if you know they can handle the load.
class AddMirrorTriggerBuildsToProjects < ActiveRecord::Migration
def change
add_column :projects, :mirror_trigger_builds, :boolean, default: false, null: false
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160113111034) do ActiveRecord::Schema.define(version: 20160119170055) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
...@@ -763,6 +763,7 @@ ActiveRecord::Schema.define(version: 20160113111034) do ...@@ -763,6 +763,7 @@ ActiveRecord::Schema.define(version: 20160113111034) do
t.string "build_coverage_regex" t.string "build_coverage_regex"
t.boolean "build_allow_git_fetch", default: true, null: false t.boolean "build_allow_git_fetch", default: true, null: false
t.integer "build_timeout", default: 3600, null: false t.integer "build_timeout", default: 3600, null: false
t.boolean "mirror_trigger_builds", default: false, null: false
end end
add_index "projects", ["builds_enabled", "shared_runners_enabled"], name: "index_projects_on_builds_enabled_and_shared_runners_enabled", using: :btree add_index "projects", ["builds_enabled", "shared_runners_enabled"], name: "index_projects_on_builds_enabled_and_shared_runners_enabled", using: :btree
......
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