Skip to content
Snippets Groups Projects
Commit a0c1a12d authored by Valery Sizov's avatar Valery Sizov Committed by Kamil Trzcinski
Browse files

remove API calls from CE to CI

parent bdfe6b96
No related branches found
No related tags found
No related merge requests found
Showing
with 29 additions and 286 deletions
Loading
Loading
@@ -55,6 +55,7 @@ v 8.0.0 (unreleased)
- Webhook for issue now contains repository field (Jungkook Park)
- Add ability to add custom text to the help page (Jeroen van Baarsen)
- Add pg_schema to backup config
- Removed API calls from CE to CI
 
v 7.14.3
- No changes
Loading
Loading
Loading
Loading
@@ -55,7 +55,7 @@ module Ci
return redirect_to ci_root_path, alert: 'You have to have at least master role to enable CI for this project'
end
 
@project = Ci::CreateProjectService.new.execute(current_user, project_data, ci_project_url(":project_id"))
@project = Ci::CreateProjectService.new.execute(current_user, project_data)
 
if @project.persisted?
redirect_to ci_project_path(@project, show_guide: true), notice: 'Project was successfully created.'
Loading
Loading
@@ -86,16 +86,6 @@ module Ci
redirect_to ci_projects_url
end
 
def build
@commit = Ci::CreateCommitService.new.execute(@project, params.dup)
if @commit && @commit.valid?
head 201
else
head 400
end
end
# Project status badge
# Image with build status for sha or ref
def badge
Loading
Loading
Loading
Loading
@@ -92,21 +92,6 @@ module Ci
project
end
 
# TODO: remove
def from_gitlab(user, scope = :owned, options)
opts = user.authenticate_options
opts.merge! options
raise 'Implement me of fix'
#projects = Ci::Network.new.projects(opts.compact, scope)
if projects
projects.map { |pr| OpenStruct.new(pr) }
else
[]
end
end
def already_added?(project)
where(gitlab_id: project.id).any?
end
Loading
Loading
Loading
Loading
@@ -19,22 +19,12 @@
#
 
class GitlabCiService < CiService
API_PREFIX = "api/v1"
prop_accessor :project_url, :token, :enable_ssl_verification
validates :project_url,
presence: true,
format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" }, if: :activated?
validates :token,
presence: true,
format: { with: /\A([A-Za-z0-9]+)\z/ }, if: :activated?
prop_accessor :token
 
after_save :compose_service_hook, if: :activated?
 
def compose_service_hook
hook = service_hook || build_service_hook
hook.url = [project_url, "/build", "?token=#{token}"].join("")
hook.enable_ssl_verification = enable_ssl_verification
hook.save
end
 
Loading
Loading
@@ -55,7 +45,8 @@ class GitlabCiService < CiService
end
end
 
service_hook.execute(data)
ci_project = Ci::Project.find_by(gitlab_id: project.id)
Ci::CreateCommitService.new.execute(ci_project, data)
end
 
def get_ci_commit(sha, ref)
Loading
Loading
@@ -68,24 +59,22 @@ class GitlabCiService < CiService
:error
end
 
def fork_registration(new_project, private_token)
params = {
def fork_registration(new_project, current_user)
params = OpenStruct.new({
id: new_project.id,
name_with_namespace: new_project.name_with_namespace,
path_with_namespace: new_project.path_with_namespace,
web_url: new_project.web_url,
default_branch: new_project.default_branch,
ssh_url_to_repo: new_project.ssh_url_to_repo
}
HTTParty.post(
fork_registration_path,
body: {
project_id: project.id,
project_token: token,
private_token: private_token,
data: params },
verify: false
})
ci_project = Ci::Project.find_by!(gitlab_id: project.id)
Ci::CreateProjectService.new.execute(
current_user,
params,
ci_project
)
end
 
Loading
Loading
@@ -112,11 +101,7 @@ class GitlabCiService < CiService
end
 
def fields
[
{ type: 'text', name: 'token', placeholder: 'GitLab CI project specific token' },
{ type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3' },
{ type: 'checkbox', name: 'enable_ssl_verification', title: "Enable SSL verification" }
]
[]
end
 
private
Loading
Loading
@@ -125,10 +110,6 @@ class GitlabCiService < CiService
repository.blob_at(sha, '.gitlab-ci.yml')
end
 
def fork_registration_path
project_url.sub(/projects\/\d*/, "#{API_PREFIX}/forks")
end
def repository
project.repository
end
Loading
Loading
Loading
Loading
@@ -2,20 +2,15 @@ module Ci
class CreateProjectService
include Gitlab::Application.routes.url_helpers
 
def execute(current_user, params, project_route, forked_project = nil)
def execute(current_user, params, forked_project = nil)
@project = Ci::Project.parse(params)
 
Ci::Project.transaction do
@project.save!
 
data = {
token: @project.token,
project_url: project_route.gsub(":project_id", @project.id.to_s),
}
gl_project = ::Project.find(@project.gitlab_id)
gl_project.build_missing_services
gl_project.gitlab_ci_service.update_attributes(data.merge(active: true))
gl_project.gitlab_ci_service.update_attributes(active: true, token: @project.token)
end
 
if forked_project
Loading
Loading
Loading
Loading
@@ -18,7 +18,7 @@ module Projects
 
if new_project.persisted?
if @project.gitlab_ci?
ForkRegistrationWorker.perform_async(@project.id, new_project.id, @current_user.private_token)
@project.gitlab_ci_service.fork_registration(new_project, @current_user)
end
end
 
Loading
Loading
class ForkRegistrationWorker
include Sidekiq::Worker
sidekiq_options queue: :default
def perform(from_project_id, to_project_id, private_token)
from_project = Project.find(from_project_id)
to_project = Project.find(to_project_id)
from_project.gitlab_ci_service.fork_registration(to_project, private_token)
end
end
Loading
Loading
@@ -18,7 +18,6 @@ Gitlab::Application.routes.draw do
member do
get :status, to: 'projects#badge'
get :integration
post :build
post :toggle_shared_runners
get :dumped_yaml
end
Loading
Loading
Loading
Loading
@@ -6,7 +6,6 @@
- [Runners](runners.md)
- [Commits](commits.md)
- [Builds](builds.md)
- [Forks](forks.md)
 
 
## Authentication
Loading
Loading
# Forks API
This API is intended to aid in the setup and configuration of
forked projects on Gitlab CI.
__Authentication is done by GitLab user token & GitLab project token__
## Forks
### Create fork for project
```
POST /ci/forks
```
Parameters:
project_id (required) - The ID of a project
project_token (requires) - Project token
private_token(required) - User private token
data (required) - GitLab project data (name_with_namespace, web_url, default_branch, ssh_url_to_repo)
Loading
Loading
@@ -26,13 +26,11 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
 
step 'I fill gitlab-ci settings' do
check 'Active'
fill_in 'Project url', with: 'http://ci.gitlab.org/projects/3'
fill_in 'Token', with: 'verySecret'
click_button 'Save'
end
 
step 'I should see service settings saved' do
expect(find_field('Project url').value).to eq 'http://ci.gitlab.org/projects/3'
expect(find_field('Active').value).to eq '1'
end
 
step 'I click hipchat service link' do
Loading
Loading
Loading
Loading
@@ -36,7 +36,6 @@ module Ci
mount Commits
mount Runners
mount Projects
mount Forks
mount Triggers
end
end
Loading
Loading
module Ci
module API
class Forks < Grape::API
resource :forks do
# Create a fork
#
# Parameters:
# project_id (required) - The ID of a project
# project_token (requires) - Project token
# private_token(required) - User private token
# data (required) - GitLab project data (name_with_namespace, web_url, default_branch, ssh_url_to_repo)
#
#
# Example Request:
# POST /forks
post do
required_attributes! [:project_id, :data, :project_token, :private_token]
project = Ci::Project.find_by!(gitlab_id: params[:project_id])
authenticate_project_token!(project)
fork = Ci::CreateProjectService.new.execute(
current_user,
params[:data],
Ci::RoutesHelper.ci_project_url(":project_id"),
project
)
if fork
present fork, with: Entities::Project
else
not_found!
end
end
end
end
end
end
Loading
Loading
@@ -5,49 +5,6 @@ describe Ci::ProjectsController do
@project = FactoryGirl.create :ci_project
end
 
describe "POST #build" do
it 'should respond 200 if params is ok' do
post :build, {
id: @project.id,
ref: 'master',
before: '2aa371379db71ac89ae20843fcff3b3477cf1a1d',
after: '1c8a9df454ef68c22c2a33cca8232bb50849e5c5',
token: @project.token,
ci_yaml_file: gitlab_ci_yaml,
commits: [ { message: "Message" } ]
}
expect(response).to be_success
expect(response.code).to eq('201')
end
it 'should respond 400 if push about removed branch' do
post :build, {
id: @project.id,
ref: 'master',
before: '2aa371379db71ac89ae20843fcff3b3477cf1a1d',
after: '0000000000000000000000000000000000000000',
token: @project.token,
ci_yaml_file: gitlab_ci_yaml
}
expect(response).not_to be_success
expect(response.code).to eq('400')
end
it 'should respond 400 if some params missed' do
post :build, id: @project.id, token: @project.token, ci_yaml_file: gitlab_ci_yaml
expect(response).not_to be_success
expect(response.code).to eq('400')
end
it 'should respond 403 if token is wrong' do
post :build, id: @project.id, token: 'invalid-token'
expect(response).not_to be_success
expect(response.code).to eq('403')
end
end
describe "POST /projects" do
let(:project_dump) { OpenStruct.new({ id: @project.gitlab_id }) }
 
Loading
Loading
Loading
Loading
@@ -180,7 +180,6 @@ describe Grack::Auth do
gitlab_ci_service = project.build_gitlab_ci_service
gitlab_ci_service.active = true
gitlab_ci_service.token = token
gitlab_ci_service.project_url = "http://google.com"
gitlab_ci_service.save
 
env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials("gitlab-ci-token", token)
Loading
Loading
Loading
Loading
@@ -26,33 +26,6 @@ describe GitlabCiService do
it { is_expected.to have_one(:service_hook) }
end
 
describe 'validations' do
context 'active' do
before { allow(subject).to receive(:activated?).and_return(true) }
it { is_expected.to validate_presence_of(:token) }
it { is_expected.to validate_presence_of(:project_url) }
it { is_expected.to allow_value('ewf9843kdnfdfs89234n').for(:token) }
it { is_expected.to allow_value('http://ci.example.com/project/1').for(:project_url) }
it { is_expected.not_to allow_value('token with spaces').for(:token) }
it { is_expected.not_to allow_value('token/with%spaces').for(:token) }
it { is_expected.not_to allow_value('this is not url').for(:project_url) }
it { is_expected.not_to allow_value('http//noturl').for(:project_url) }
it { is_expected.not_to allow_value('ftp://ci.example.com/projects/3').for(:project_url) }
end
context 'inactive' do
before { allow(subject).to receive(:activated?).and_return(false) }
it { is_expected.not_to validate_presence_of(:token) }
it { is_expected.not_to validate_presence_of(:project_url) }
it { is_expected.to allow_value('ewf9843kdnfdfs89234n').for(:token) }
it { is_expected.to allow_value('http://ci.example.com/project/1').for(:project_url) }
it { is_expected.to allow_value('token with spaces').for(:token) }
it { is_expected.to allow_value('ftp://ci.example.com/projects/3').for(:project_url) }
end
end
describe 'commits methods' do
before do
@ci_project = create(:ci_project)
Loading
Loading
@@ -77,8 +50,6 @@ describe GitlabCiService do
 
it "calls ci_yaml_file" do
service_hook = double
expect(service_hook).to receive(:execute)
expect(@service).to receive(:service_hook).and_return(service_hook)
expect(@service).to receive(:ci_yaml_file).with(push_sample_data[:checkout_sha])
 
@service.execute(push_sample_data)
Loading
Loading
@@ -88,7 +59,7 @@ describe GitlabCiService do
 
describe "Fork registration" do
before do
@old_project = create(:empty_project)
@old_project = create(:ci_project).gl_project
@project = create(:empty_project)
@user = create(:user)
 
Loading
Loading
@@ -101,9 +72,9 @@ describe GitlabCiService do
)
end
 
it "performs http reuquest to ci" do
stub_request(:post, "http://ci.gitlab.org/api/v1/forks")
@service.fork_registration(@project, @user.private_token)
it "creates fork on CI" do
expect_any_instance_of(Ci::CreateProjectService).to receive(:execute)
@service.fork_registration(@project, @user)
end
end
end
Loading
Loading
@@ -89,7 +89,7 @@ describe API::API, api: true do
 
it 'returns projects in the correct order when ci_enabled_first parameter is passed' do
[project, project2, project3].each{ |project| project.build_missing_services }
project2.gitlab_ci_service.update(active: true, token: "token", project_url: "http://ci.example.com/projects/1")
project2.gitlab_ci_service.update(active: true, token: "token")
get api('/projects', user), { ci_enabled_first: 'true' }
expect(response.status).to eq(200)
expect(json_response).to be_an Array
Loading
Loading
Loading
Loading
@@ -17,9 +17,9 @@ describe API::API, api: true do
 
it "should return if required fields missing" do
attrs = service_attrs
required_attributes = service_attrs_list.select do |attr|
service_klass.validators_on(attr).any? do |v|
service_klass.validators_on(attr).any? do |v|
v.class == ActiveRecord::Validations::PresenceValidator
end
end
Loading
Loading
require 'spec_helper'
describe Ci::API::API do
include ApiHelpers
let(:project) { FactoryGirl.create(:ci_project) }
let(:private_token) { create(:user).private_token }
let(:options) do
{
private_token: private_token,
url: GitlabCi.config.gitlab_ci.url
}
end
before do
stub_gitlab_calls
end
describe "POST /forks" do
let(:project_info) do
{
project_id: project.gitlab_id,
project_token: project.token,
data: {
id: create(:empty_project).id,
name_with_namespace: "Gitlab.org / Underscore",
path_with_namespace: "gitlab-org/underscore",
default_branch: "master",
ssh_url_to_repo: "git@example.com:gitlab-org/underscore"
}
}
end
context "with valid info" do
before do
options.merge!(project_info)
end
it "should create a project with valid data" do
post ci_api("/forks"), options
expect(response.status).to eq(201)
expect(json_response['name']).to eq("Gitlab.org / Underscore")
end
end
context "with invalid project info" do
before do
options.merge!({})
end
it "should error with invalid data" do
post ci_api("/forks"), options
expect(response.status).to eq(400)
end
end
end
end
Loading
Loading
@@ -7,7 +7,7 @@ describe Ci::CreateProjectService do
 
describe :execute do
context 'valid params' do
subject { service.execute(current_user, project, 'http://localhost/projects/:project_id') }
subject { service.execute(current_user, project) }
 
it { is_expected.to be_kind_of(Ci::Project) }
it { is_expected.to be_persisted }
Loading
Loading
@@ -24,7 +24,7 @@ describe Ci::CreateProjectService do
FactoryGirl.create(:ci_project, shared_runners_enabled: true, public: true, allow_git_fetch: true)
end
 
subject { service.execute(current_user, project, 'http://localhost/projects/:project_id', ci_origin_project) }
subject { service.execute(current_user, project, ci_origin_project) }
 
it "uses project as a template for settings and jobs" do
expect(subject.shared_runners_enabled).to be_truthy
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment