From 5a98f16d37db7077192770594ec68d74c1c0f6b5 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 7 Apr 2016 17:20:02 +0200 Subject: Make docker registry to work --- app/controllers/projects/images_controller.rb | 9 ++------- app/models/ci/build.rb | 1 + app/models/project.rb | 4 ++++ app/models/registry.rb | 8 +++++++- app/views/projects/images/index.html.haml | 17 ++++++++++++++--- app/views/projects/images/show.html.haml | 2 -- config/registry.yml | 2 ++ config/routes.rb | 2 +- .../20160407120251_add_images_enabled_for_project.rb | 5 +++++ lib/registry_client.rb | 8 +++++++- 10 files changed, 43 insertions(+), 15 deletions(-) delete mode 100644 app/views/projects/images/show.html.haml create mode 100644 db/migrate/20160407120251_add_images_enabled_for_project.rb diff --git a/app/controllers/projects/images_controller.rb b/app/controllers/projects/images_controller.rb index 1cbd216981b..5b10746aa0d 100644 --- a/app/controllers/projects/images_controller.rb +++ b/app/controllers/projects/images_controller.rb @@ -8,14 +8,9 @@ class Projects::ImagesController < Projects::ApplicationController @tags = registry.tags end - def show - respond_to do |format| - format.html - end - end - def destroy - registry.destroy_tag(params[:id].to_s) + # registry.destroy_tag(tag['fsLayers'].first['blobSum']) + registry.destroy_tag(registry.tag_digest(params[:id])) redirect_to namespace_project_images_path(project.namespace, project) end diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index d497cf67cbc..8a8b1c175b2 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -403,6 +403,7 @@ module Ci variables << { key: :CI_BUILD_NAME, value: name, public: true } variables << { key: :CI_BUILD_STAGE, value: stage, public: true } variables << { key: :CI_BUILD_TRIGGERED, value: 'true', public: true } if trigger_request + variables << { key: :CI_DOCKER_REGISTRY, value: project.registry_repository_url, public: true } if project.registry_repository_url variables end end diff --git a/app/models/project.rb b/app/models/project.rb index ae636ac2cf4..5b22da7d6fa 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -374,6 +374,10 @@ class Project < ActiveRecord::Base @registry ||= Registry.new(path_with_namespace, self) end + def registry_repository_url + "#{Gitlab.config.registry.host_with_port}/#{path_with_namespace}" if images_enabled? && Gitlab.config.registry.enabled + end + def commit(id = 'HEAD') repository.commit(id) end diff --git a/app/models/registry.rb b/app/models/registry.rb index 554060250ac..b4ef60a016f 100644 --- a/app/models/registry.rb +++ b/app/models/registry.rb @@ -18,12 +18,18 @@ class Registry @tag[reference] ||= client.tag(path_with_namespace, reference) end + def tag_digest(reference) + return @tag_digest[reference] if defined?(@tag_digest[reference]) + @tag_digest ||= {} + @tag_digest[reference] ||= client.tag_digest(path_with_namespace, reference) + end + def destroy_tag(reference) client.delete_tag(path_with_namespace, reference) end def blob_size(blob) - return @blob_size[reference] if defined?(@blob_size[blob]) + return @blob_size[blob] if defined?(@blob_size[blob]) @blob_size ||= {} @blob_size[blob] ||= client.blob_size(path_with_namespace, blob) end diff --git a/app/views/projects/images/index.html.haml b/app/views/projects/images/index.html.haml index 997d9822409..338f3e5662c 100644 --- a/app/views/projects/images/index.html.haml +++ b/app/views/projects/images/index.html.haml @@ -19,19 +19,30 @@ %th Name %th Layers %th Size + %th Created + %th Docker %th - - @tags.each do |tag| + - @tags.sort.each do |tag| - details = @registry.tag(tag) + - layer = details['history'].first + - if layer && layer['v1Compatibility'] + - layer_data = JSON.parse(layer['v1Compatibility']) %tr %td = link_to namespace_project_image_path(@project.namespace, @project, tag) do - = tag + #{details['name']}:#{details['tag']} %td = details['fsLayers'].length %td = number_to_human_size(details['fsLayers'].inject(0) { |sum, d| sum + @registry.blob_size(d['blobSum']) }.bytes) + %td + - if layer_data + = time_ago_in_words(DateTime.rfc3339(layer_data['created'])) + %td + - if layer_data + = layer_data['docker_version'] %td.content .controls.hidden-xs.pull-right - = link_to namespace_project_image_path(@project.namespace, @project, tag), class: 'btn btn-remove has-tooltip', title: "Remove", method: :delete do + = link_to namespace_project_image_path(@project.namespace, @project, tag), class: 'btn btn-remove has-tooltip', title: "Remove", data: { confirm: "Are you sure?" }, method: :delete do = icon("trash cred") diff --git a/app/views/projects/images/show.html.haml b/app/views/projects/images/show.html.haml deleted file mode 100644 index e24e5479d2d..00000000000 --- a/app/views/projects/images/show.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -- page_title "#{@tag['name']}", "Image" -= render "header_title" diff --git a/config/registry.yml b/config/registry.yml index bf62b6e4170..9e630bcfdff 100644 --- a/config/registry.yml +++ b/config/registry.yml @@ -7,6 +7,8 @@ storage: blobdescriptor: inmemory filesystem: rootdirectory: shared/registry + delete: + enabled: true http: addr: :5000 secret: "shared-registry-secret" diff --git a/config/routes.rb b/config/routes.rb index 7bc5c0f28e2..03d5f9758a7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -687,7 +687,7 @@ Rails.application.routes.draw do end end - resources :images, only: [:index, :show, :destroy], constraints: { id: Gitlab::Regex.image_reference_regex } + resources :images, only: [:index, :destroy], constraints: { id: Gitlab::Regex.image_reference_regex } resources :milestones, constraints: { id: /\d+/ } do member do diff --git a/db/migrate/20160407120251_add_images_enabled_for_project.rb b/db/migrate/20160407120251_add_images_enabled_for_project.rb new file mode 100644 index 00000000000..6a221a7fb03 --- /dev/null +++ b/db/migrate/20160407120251_add_images_enabled_for_project.rb @@ -0,0 +1,5 @@ +class AddImagesEnabledForProject < ActiveRecord::Migration + def change + add_column :projects, :images_enabled, :boolean + end +end diff --git a/lib/registry_client.rb b/lib/registry_client.rb index 9f39ca9b5fb..87518a7b39c 100644 --- a/lib/registry_client.rb +++ b/lib/registry_client.rb @@ -17,8 +17,14 @@ class RegistryClient JSON.parse(response) end + def tag_digest(name, reference) + response = HTTParty.head("#{uri}/v2/#{name}/manifests/#{reference}") + response.headers['docker-content-digest'].split(':') + end + def delete_tag(name, reference) - HTTParty.delete("#{uri}/v2/#{name}/manifests/#{reference}") + response = HTTParty.delete("#{uri}/v2/#{name}/manifests/#{reference}") + response.parsed_response end def blob_size(name, digest) -- cgit v1.2.1