Commit d8adce0c authored by Robert Speicher's avatar Robert Speicher

Merge branch 'mirror-builds' into 'master'

Add option to "Trigger builds for mirror updates"

Fixes https://gitlab.com/gitlab-org/gitlab-ee/issues/190 and
https://gitlab.com/gitlab-org/gitlab-ce/issues/3647

See https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/125
parents 5cd8288f 996ae12c
......@@ -4,7 +4,8 @@ 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 "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
- Ability to use Elasticsearch as a search engine
- Add option to trigger builds when branches or tags are updated from a mirrored upstream repository
- Ability to use Elasticsearch as a search engine
v 8.3.2
- No EE-specific changes
......
......@@ -38,6 +38,6 @@ class Projects::MirrorsController < Projects::ApplicationController
private
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
......@@ -260,6 +260,7 @@ class ProjectsController < ApplicationController
:merge_requests_template,
:mirror,
:mirror_user_id,
:mirror_trigger_builds,
:reset_approvals_on_push
)
end
......
......@@ -141,6 +141,9 @@ module ApplicationHelper
# Skip if user removed branch right after that
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
end
......
......@@ -651,6 +651,17 @@ class Repository
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)
rugged.merge_base(first_commit_id, second_commit_id)
end
......
class CreateCommitBuildsService
def execute(project, user, params)
def execute(project, user, params, mirror_update: false)
return false unless project.builds_enabled?
return false if !project.mirror_trigger_builds? && mirror_update
sha = params[:checkout_sha] || params[:after]
origin_ref = params[:ref]
......
......@@ -58,16 +58,19 @@ class GitPushService
@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)
project.execute_hooks(@push_data.dup, :push_hooks)
project.execute_services(@push_data.dup, :push_hooks)
if Gitlab.config.elasticsearch.enabled
if Gitlab.config.elasticsearch.enabled
project.repository.index_commits
project.repository.index_blobs
end
CreateCommitBuildsService.new.execute(project, @user, @push_data)
CreateCommitBuildsService.new.execute(project, @user, @push_data, mirror_update: mirror_update)
ProjectCacheWorker.perform_async(project.id)
end
......
class GitTagPushService
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, @user = project, user
......@@ -10,7 +10,7 @@ class GitTagPushService
EventCreateService.new.push(project, user, @push_data)
project.execute_hooks(@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)
true
......
......@@ -43,7 +43,7 @@ module Projects
else
begin
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
end
end
......@@ -66,7 +66,7 @@ module Projects
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
fetch_result
......
......@@ -162,6 +162,8 @@
phpunit --coverage-text --colors=never (PHP) -
%code ^\s*Lines:\s*\d+.\d+\%
- if @project.mirror?
= render 'shared/mirror_trigger_builds_setting', f: f
%fieldset.features
%legend
......
......@@ -66,5 +66,8 @@
like new branches being created or new commits being pushed to existing branches.
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
= 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 @@
#
# 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
enable_extension "plpgsql"
......@@ -763,6 +763,7 @@ ActiveRecord::Schema.define(version: 20160113111034) do
t.string "build_coverage_regex"
t.boolean "build_allow_git_fetch", default: true, null: false
t.integer "build_timeout", default: 3600, null: false
t.boolean "mirror_trigger_builds", default: false, null: false
end
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