Commit 46119566 authored by Tomasz Maczukin's avatar Tomasz Maczukin

Add Gitlab::Ci::Build::Credentials module with build credentials abstraction

parent e3fb0740
...@@ -449,18 +449,11 @@ module Ci ...@@ -449,18 +449,11 @@ module Ci
end end
def credentials def credentials
[build_container_registry_credentials].compact Gitlab::Ci::Build::Credentials::Factory.new(self).create!
end end
private private
def build_container_registry_credentials
return unless Gitlab.config.registry.enabled
Gitlab::Ci::Build::Credentials.new('docker-registry', Gitlab.config.registry.host_port,
'gitlab-ci-token', token)
end
def update_artifacts_size def update_artifacts_size
self.artifacts_size = if artifacts_file.exists? self.artifacts_size = if artifacts_file.exists?
artifacts_file.size artifacts_file.size
......
module Gitlab
module Ci
module Build
class Credentials
attr_accessor :type, :url, :username, :password
def initialize(type, url, username, password)
@type = type
@url = url
@username = username
@password = password
end
end
end
end
end
module Gitlab
module Ci
module Build
module Credentials
class Base
def type
self.class.name.demodulize.underscore
end
end
end
end
end
end
module Gitlab
module Ci
module Build
module Credentials
class Factory
def initialize(build)
@build = build
end
def create!
credentials.select(&:valid?)
end
private
def credentials
providers.map { |provider| provider.new(@build) }
end
def providers
[Registry]
end
end
end
end
end
end
module Gitlab
module Ci
module Build
module Credentials
class Registry < Base
attr_reader :username, :password
def initialize(build)
@username = 'gitlab-ci-token'
@password = build.token
end
def url
Gitlab.config.registry.host_port
end
def valid?
Gitlab.config.registry.enabled
end
end
end
end
end
end
require 'spec_helper'
describe Gitlab::Ci::Build::Credentials::Factory do
let(:build) { create(:ci_build, name: 'spinach', stage: 'test', stage_idx: 0) }
subject { Gitlab::Ci::Build::Credentials::Factory.new(build).create! }
class TestProvider
def initialize(build); end
end
before do
allow_any_instance_of(Gitlab::Ci::Build::Credentials::Factory).to receive(:providers).and_return([TestProvider])
end
context 'when provider is valid' do
before do
allow_any_instance_of(TestProvider).to receive(:valid?).and_return(true)
end
it 'generates an array of credentials objects' do
is_expected.to be_kind_of(Array)
is_expected.not_to be_empty
expect(subject.first).to be_kind_of(TestProvider)
end
end
context 'when provider is not valid' do
before do
allow_any_instance_of(TestProvider).to receive(:valid?).and_return(false)
end
it 'generates an array without specific credential object' do
is_expected.to be_kind_of(Array)
is_expected.to be_empty
end
end
end
require 'spec_helper'
describe Gitlab::Ci::Build::Credentials::Registry do
let(:build) { create(:ci_build, name: 'spinach', stage: 'test', stage_idx: 0) }
let(:registry_url) { 'registry.example.com:5005' }
subject { Gitlab::Ci::Build::Credentials::Registry.new(build) }
before do
stub_container_registry_config(host_port: registry_url)
end
it 'contains valid DockerRegistry credentials' do
expect(subject).to be_kind_of(Gitlab::Ci::Build::Credentials::Registry)
expect(subject.username).to eq 'gitlab-ci-token'
expect(subject.password).to eq build.token
expect(subject.url).to eq registry_url
expect(subject.type).to eq 'registry'
end
describe '.valid?' do
subject { Gitlab::Ci::Build::Credentials::Registry.new(build).valid? }
context 'when registry is enabled' do
before do
stub_container_registry_config(enabled: true)
end
it { is_expected.to be_truthy }
end
context 'when registry is disabled' do
before do
stub_container_registry_config(enabled: false)
end
it { is_expected.to be_falsey }
end
end
end
...@@ -60,7 +60,7 @@ describe Ci::API::API do ...@@ -60,7 +60,7 @@ describe Ci::API::API do
context 'registry credentials' do context 'registry credentials' do
let(:registry_credentials) do let(:registry_credentials) do
{ 'type' => 'docker-registry', { 'type' => 'registry',
'url' => 'registry.example.com:5005', 'url' => 'registry.example.com:5005',
'username' => 'gitlab-ci-token', 'username' => 'gitlab-ci-token',
'password' => build.token } 'password' => build.token }
......
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