Commit f06daa26 authored by Kamil Trzciński's avatar Kamil Trzciński

Merge branch 'rename-builds-controller' into 'master'

Rename BuildsController to JobsController

Closes #30699

See merge request !11407
parents 87e761da 61227393
...@@ -118,7 +118,7 @@ import ShortcutsBlob from './shortcuts_blob'; ...@@ -118,7 +118,7 @@ import ShortcutsBlob from './shortcuts_blob';
shortcut_handler = new ShortcutsNavigation(); shortcut_handler = new ShortcutsNavigation();
new UsersSelect(); new UsersSelect();
break; break;
case 'projects:builds:show': case 'projects:jobs:show':
new Build(); new Build();
break; break;
case 'projects:merge_requests:index': case 'projects:merge_requests:index':
......
class Admin::BuildsController < Admin::ApplicationController class Admin::JobsController < Admin::ApplicationController
def index def index
@scope = params[:scope] @scope = params[:scope]
@all_builds = Ci::Build @all_builds = Ci::Build
...@@ -20,6 +20,6 @@ class Admin::BuildsController < Admin::ApplicationController ...@@ -20,6 +20,6 @@ class Admin::BuildsController < Admin::ApplicationController
def cancel_all def cancel_all
Ci::Build.running_or_pending.each(&:cancel) Ci::Build.running_or_pending.each(&:cancel)
redirect_to admin_builds_path redirect_to admin_jobs_path
end end
end end
...@@ -46,7 +46,7 @@ class Projects::ArtifactsController < Projects::ApplicationController ...@@ -46,7 +46,7 @@ class Projects::ArtifactsController < Projects::ApplicationController
def keep def keep
build.keep_artifacts! build.keep_artifacts!
redirect_to namespace_project_build_path(project.namespace, project, build) redirect_to namespace_project_job_path(project.namespace, project, build)
end end
def latest_succeeded def latest_succeeded
...@@ -79,7 +79,7 @@ class Projects::ArtifactsController < Projects::ApplicationController ...@@ -79,7 +79,7 @@ class Projects::ArtifactsController < Projects::ApplicationController
end end
def build_from_id def build_from_id
project.builds.find_by(id: params[:build_id]) if params[:build_id] project.builds.find_by(id: params[:job_id]) if params[:job_id]
end end
def build_from_ref def build_from_ref
......
class Projects::BuildArtifactsController < Projects::ApplicationController
include ExtractsPath
include RendersBlob
before_action :authorize_read_build!
before_action :extract_ref_name_and_path
before_action :validate_artifacts!
def download
redirect_to download_namespace_project_job_artifacts_path(project.namespace, project, job)
end
def browse
redirect_to browse_namespace_project_job_artifacts_path(project.namespace, project, job, path: params[:path])
end
def file
redirect_to file_namespace_project_job_artifacts_path(project.namespace, project, job, path: params[:path])
end
def raw
redirect_to raw_namespace_project_job_artifacts_path(project.namespace, project, job, path: params[:path])
end
def latest_succeeded
redirect_to latest_succeeded_namespace_project_artifacts_path(project.namespace, project, job, ref_name_and_path: params[:ref_name_and_path], job: params[:job])
end
private
def validate_artifacts!
render_404 unless job && job.artifacts?
end
def extract_ref_name_and_path
return unless params[:ref_name_and_path]
@ref_name, @path = extract_ref(params[:ref_name_and_path])
end
def job
@job ||= job_from_id || job_from_ref
end
def job_from_id
project.builds.find_by(id: params[:build_id]) if params[:build_id]
end
def job_from_ref
return unless @ref_name
jobs = project.latest_successful_builds_for(@ref_name)
jobs.find_by(name: params[:job])
end
end
class Projects::BuildsController < Projects::ApplicationController class Projects::BuildsController < Projects::ApplicationController
before_action :build, except: [:index, :cancel_all] before_action :authorize_read_build!
before_action :authorize_read_build!,
only: [:index, :show, :status, :raw, :trace]
before_action :authorize_update_build!,
except: [:index, :show, :status, :raw, :trace, :cancel_all]
layout 'project'
def index def index
@scope = params[:scope] redirect_to namespace_project_jobs_path(project.namespace, project)
@all_builds = project.builds.relevant
@builds = @all_builds.order('created_at DESC')
@builds =
case @scope
when 'pending'
@builds.pending.reverse_order
when 'running'
@builds.running.reverse_order
when 'finished'
@builds.finished
else
@builds
end
@builds = @builds.includes([
{ pipeline: :project },
:project,
:tags
])
@builds = @builds.page(params[:page]).per(30)
end
def cancel_all
return access_denied! unless can?(current_user, :update_build, project)
@project.builds.running_or_pending.each do |build|
build.cancel if can?(current_user, :update_build, build)
end
redirect_to namespace_project_builds_path(project.namespace, project)
end end
def show def show
@builds = @project.pipelines.find_by_sha(@build.sha).builds.order('id DESC') redirect_to namespace_project_job_path(project.namespace, project, job)
@builds = @builds.where("id not in (?)", @build.id)
@pipeline = @build.pipeline
end
def trace
build.trace.read do |stream|
respond_to do |format|
format.json do
result = {
id: @build.id, status: @build.status, complete: @build.complete?
}
if stream.valid?
stream.limit
state = params[:state].presence
trace = stream.html_with_state(state)
result.merge!(trace.to_h)
end
render json: result
end
end
end
end
def retry
return respond_422 unless @build.retryable?
build = Ci::Build.retry(@build, current_user)
redirect_to build_path(build)
end
def play
return respond_422 unless @build.playable?
build = @build.play(current_user)
redirect_to build_path(build)
end
def cancel
return respond_422 unless @build.cancelable?
@build.cancel
redirect_to build_path(@build)
end
def status
render json: BuildSerializer
.new(project: @project, current_user: @current_user)
.represent_status(@build)
end
def erase
if @build.erase(erased_by: current_user)
redirect_to namespace_project_build_path(project.namespace, project, @build),
notice: "Build has been successfully erased!"
else
respond_422
end
end end
def raw def raw
build.trace.read do |stream| redirect_to raw_namespace_project_job_path(project.namespace, project, job)
if stream.file?
send_file stream.path, type: 'text/plain; charset=utf-8', disposition: 'inline'
else
render_404
end
end
end end
private private
def authorize_update_build! def job
return access_denied! unless can?(current_user, :update_build, build) @job ||= project.builds.find(params[:id])
end
def build
@build ||= project.builds.find(params[:id])
.present(current_user: current_user)
end
def build_path(build)
namespace_project_build_path(build.project.namespace, build.project, build)
end end
end end
class Projects::JobsController < Projects::ApplicationController
before_action :build, except: [:index, :cancel_all]
before_action :authorize_read_build!,
only: [:index, :show, :status, :raw, :trace]
before_action :authorize_update_build!,
except: [:index, :show, :status, :raw, :trace, :cancel_all]
layout 'project'
def index
@scope = params[:scope]
@all_builds = project.builds.relevant
@builds = @all_builds.order('created_at DESC')
@builds =
case @scope
when 'pending'
@builds.pending.reverse_order
when 'running'
@builds.running.reverse_order
when 'finished'
@builds.finished
else
@builds
end
@builds = @builds.includes([
{ pipeline: :project },
:project,
:tags
])
@builds = @builds.page(params[:page]).per(30)
end
def cancel_all
return access_denied! unless can?(current_user, :update_build, project)
@project.builds.running_or_pending.each do |build|
build.cancel if can?(current_user, :update_build, build)
end
redirect_to namespace_project_jobs_path(project.namespace, project)
end
def show
@builds = @project.pipelines.find_by_sha(@build.sha).builds.order('id DESC')
@builds = @builds.where("id not in (?)", @build.id)
@pipeline = @build.pipeline
end
def trace
build.trace.read do |stream|
respond_to do |format|
format.json do
result = {
id: @build.id, status: @build.status, complete: @build.complete?
}
if stream.valid?
stream.limit
state = params[:state].presence
trace = stream.html_with_state(state)
result.merge!(trace.to_h)
end
render json: result
end
end
end
end
def retry
return respond_422 unless @build.retryable?
build = Ci::Build.retry(@build, current_user)
redirect_to build_path(build)
end
def play
return respond_422 unless @build.playable?
build = @build.play(current_user)
redirect_to build_path(build)
end
def cancel
return respond_422 unless @build.cancelable?
@build.cancel
redirect_to build_path(@build)
end
def status
render json: BuildSerializer
.new(project: @project, current_user: @current_user)
.represent_status(@build)
end
def erase
if @build.erase(erased_by: current_user)
redirect_to namespace_project_job_path(project.namespace, project, @build),
notice: "Build has been successfully erased!"
else
respond_422
end
end
def raw
build.trace.read do |stream|
if stream.file?
send_file stream.path, type: 'text/plain; charset=utf-8', disposition: 'inline'
else
render_404
end
end
end
private
def authorize_update_build!
return access_denied! unless can?(current_user, :update_build, build)
end
def build
@build ||= project.builds.find(params[:id])
.present(current_user: current_user)
end
def build_path(build)
namespace_project_job_path(build.project.namespace, build.project, build)
end
end
...@@ -120,7 +120,7 @@ module BlobHelper ...@@ -120,7 +120,7 @@ module BlobHelper
def blob_raw_url def blob_raw_url
if @build && @entry if @build && @entry
raw_namespace_project_build_artifacts_path(@project.namespace, @project, @build, path: @entry.path) raw_namespace_project_job_artifacts_path(@project.namespace, @project, @build, path: @entry.path)
elsif @snippet elsif @snippet
if @snippet.project_id if @snippet.project_id
raw_namespace_project_snippet_path(@project.namespace, @project, @snippet) raw_namespace_project_snippet_path(@project.namespace, @project, @snippet)
......
...@@ -2,7 +2,7 @@ module BuildsHelper ...@@ -2,7 +2,7 @@ module BuildsHelper
def build_summary(build, skip: false) def build_summary(build, skip: false)
if build.has_trace? if build.has_trace?
if skip if skip
link_to "View job trace", pipeline_build_url(build.pipeline, build) link_to "View job trace", pipeline_job_url(build.pipeline, build)
else else
build.trace.html(last_lines: 10).html_safe build.trace.html(last_lines: 10).html_safe
end end
...@@ -20,8 +20,8 @@ module BuildsHelper ...@@ -20,8 +20,8 @@ module BuildsHelper
def javascript_build_options def javascript_build_options
{ {
page_url: namespace_project_build_url(@project.namespace, @project, @build), page_url: namespace_project_job_url(@project.namespace, @project, @build),
build_url: namespace_project_build_url(@project.namespace, @project, @build, :json), build_url: namespace_project_job_url(@project.namespace, @project, @build, :json),
build_status: @build.status, build_status: @build.status,
build_stage: @build.stage, build_stage: @build.stage,
log_state: '' log_state: ''
...@@ -31,7 +31,7 @@ module BuildsHelper ...@@ -31,7 +31,7 @@ module BuildsHelper
def build_failed_issue_options def build_failed_issue_options
{ {
title: "Build Failed ##{@build.id}", title: "Build Failed ##{@build.id}",
description: namespace_project_build_url(@project.namespace, @project, @build) description: namespace_project_job_url(@project.namespace, @project, @build)
} }
end end
end end
...@@ -50,8 +50,8 @@ module GitlabRoutingHelper ...@@ -50,8 +50,8 @@ module GitlabRoutingHelper
namespace_project_cycle_analytics_path(project.namespace, project, *args) namespace_project_cycle_analytics_path(project.namespace, project, *args)
end end
def project_builds_path(project, *args) def project_jobs_path(project, *args)
namespace_project_builds_path(project.namespace, project, *args) namespace_project_jobs_path(project.namespace, project, *args)
end end
def project_ref_path(project, ref_name, *args) def project_ref_path(project, ref_name, *args)
...@@ -110,8 +110,8 @@ module GitlabRoutingHelper ...@@ -110,8 +110,8 @@ module GitlabRoutingHelper
namespace_project_pipeline_url(pipeline.project.namespace, pipeline.project, pipeline.id, *args) namespace_project_pipeline_url(pipeline.project.namespace, pipeline.project, pipeline.id, *args)
end end
def pipeline_build_url(pipeline, build, *args) def pipeline_job_url(pipeline, build, *args)
namespace_project_build_url(pipeline.project.namespace, pipeline.project, build.id, *args) namespace_project_job_url(pipeline.project.namespace, pipeline.project, build.id, *args)
end end
def commits_url(entity, *args) def commits_url(entity, *args)
...@@ -215,13 +215,13 @@ module GitlabRoutingHelper ...@@ -215,13 +215,13 @@ module GitlabRoutingHelper
case action case action
when 'download' when 'download'
download_namespace_project_build_artifacts_path(*args) download_namespace_project_job_artifacts_path(*args)
when 'browse' when 'browse'
browse_namespace_project_build_artifacts_path(*args) browse_namespace_project_job_artifacts_path(*args)
when 'file' when 'file'
file_namespace_project_build_artifacts_path(*args) file_namespace_project_job_artifacts_path(*args)
when 'raw' when 'raw'
raw_namespace_project_build_artifacts_path(*args) raw_namespace_project_job_artifacts_path(*args)
end end
end end
......
...@@ -51,6 +51,12 @@ module Ci ...@@ -51,6 +51,12 @@ module Ci
after_destroy :update_project_statistics after_destroy :update_project_statistics
class << self class << self
# This is needed for url_for to work,
# as the controller is JobsController
def model_name
ActiveModel::Name.new(self, nil, 'job')
end
def first_pending def first_pending
pending.unstarted.order('created_at ASC').first pending.unstarted.order('created_at ASC').first
end end
......
...@@ -25,7 +25,7 @@ class AnalyticsBuildEntity < Grape::Entity ...@@ -25,7 +25,7 @@ class AnalyticsBuildEntity < Grape::Entity
end end
expose :url do |build| expose :url do |build|
url_to(:namespace_project_build, build) url_to(:namespace_project_job, build)
end end
expose :commit_url do |build| expose :commit_url do |build|
......
...@@ -6,7 +6,7 @@ class BuildActionEntity < Grape::Entity ...@@ -6,7 +6,7 @@ class BuildActionEntity < Grape::Entity
end end
expose :path do |build| expose :path do |build|
play_namespace_project_build_path( play_namespace_project_job_path(
build.project.namespace, build.project.namespace,
build.project, build.project,
build) build)
......
...@@ -6,7 +6,7 @@ class BuildArtifactEntity < Grape::Entity ...@@ -6,7 +6,7 @@ class BuildArtifactEntity < Grape::Entity
end end
expose :path do |build| expose :path do |build|
download_namespace_project_build_artifacts_path( download_namespace_project_job_artifacts_path(
build.project.namespace, build.project.namespace,
build.project, build.project,
build) build)
......
...@@ -5,15 +5,15 @@ class BuildEntity < Grape::Entity ...@@ -5,15 +5,15 @@ class BuildEntity < Grape::Entity
expose :name expose :name
expose :build_path do |build| expose :build_path do |build|
path_to(:namespace_project_build, build) path_to(:namespace_project_job, build)
end end
expose :retry_path do |build| expose :retry_path do |build|
path_to(:retry_namespace_project_build, build) path_to(:retry_namespace_project_job, build)
end end
expose :play_path, if: -> (*) { playable? } do |build| expose :play_path, if: -> (*) { playable? } do |build|
path_to(:play_namespace_project_build, build) path_to(:play_namespace_project_job, build)
end end
expose :playable?, as: :playable expose :playable?, as: :playable
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
%span %span
Groups Groups
= nav_link path: 'builds#index' do = nav_link path: 'builds#index' do
= link_to admin_builds_path, title: 'Jobs' do = link_to admin_jobs_path, title: 'Jobs' do
%span %span
Jobs Jobs
= nav_link path: ['runners#index', 'runners#show'] do = nav_link path: ['runners#index', 'runners#show'] do
......
...@@ -4,15 +4,15 @@ ...@@ -4,15 +4,15 @@
%div{ class: container_class } %div{ class: container_class }
.top-area .top-area
- build_path_proc = ->(scope) { admin_builds_path(scope: scope) } - build_path_proc = ->(scope) { admin_jobs_path(scope: scope) }
= render "shared/builds/tabs", build_path_proc: build_path_proc, all_builds: @all_builds, scope: @scope = render "shared/builds/tabs", build_path_proc: build_path_proc, all_builds: @all_builds, scope: @scope
.nav-controls .nav-controls
- if @all_builds.running_or_pending.any? - if @all_builds.running_or_pending.any?
= link_to 'Cancel all', cancel_all_admin_builds_path, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post = link_to 'Cancel all', cancel_all_admin_jobs_path, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post
.row-content-block.second-block .row-content-block.second-block
#{(@scope || 'all').capitalize} jobs #{(@scope || 'all').capitalize} jobs
%ul.content-list.builds-content-list.admin-builds-table %ul.content-list.builds-content-list.admin-builds-table
= render "projects/builds/table", builds: @builds, admin: true = render "projects/jobs/table", builds: @builds, admin: true
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
%tr.build %tr.build
%td.id %td.id
- if project - if project
= link_to namespace_project_build_path(project.namespace, project, build) do = link_to namespace_project_job_path(project.namespace, project, build) do
%strong ##{build.id} %strong ##{build.id}
- else - else
%strong ##{build.id} %strong ##{build.id}
......
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
-# Shortcut to Pipelines > Jobs -# Shortcut to Pipelines > Jobs
- if project_nav_tab? :builds - if project_nav_tab? :builds
%li.hidden %li.hidden
= link_to project_builds_path(@project), title: 'Jobs', class: 'shortcuts-builds' do = link_to project_jobs_path(@project), title: 'Jobs', class: 'shortcuts-builds' do
Jobs Jobs
-# Shortcut to commits page -# Shortcut to commits page
......
%a{ href: pipeline_build_url(pipeline, build), style: "color:#3777b0;text-decoration:none;" } %a{ href: pipeline_job_url(pipeline, build), style: "color:#3777b0;text-decoration:none;" }
= build.name = build.name
Job #<%= build.id %> ( <%= pipeline_build_url(pipeline, build) %> ) Job #<%= build.id %> ( <%= pipeline_job_url(pipeline, build) %> )
- path_to_directory = browse_namespace_project_build_artifacts_path(@project.namespace, @project, @build, path: directory.path) - path_to_directory = browse_namespace_project_job_artifacts_path(@project.namespace, @project, @build, path: directory.path)
%tr.tree-item{ 'data-link' => path_to_directory } %tr.tree-item{ 'data-link' => path_to_directory }
%td.tree-item-file-name %td.tree-item-file-name
......
- path_to_file = file_namespace_project_build_artifacts_path(@project.namespace, @project, @build, path: file.path) - path_to_file = file_namespace_project_job_artifacts_path(@project.namespace, @project, @build, path: file.path)
%tr.tree-item{ 'data-link' => path_to_file } %tr.tree-item{ 'data-link' => path_to_file }
- blob = file.blob - blob = file.blob
......
- page_title @path.presence, 'Artifacts', "#{@build.name} (##{@build.id})", 'Jobs' - page_title @path.presence, 'Artifacts', "#{@build.name} (##{@build.id})", 'Jobs'
= render "projects/pipelines/head" = render "projects/pipelines/head"
= render "projects/builds/header", show_controls: false = render "projects/jobs/header", show_controls: false
.tree-holder .tree-holder
.nav-block .nav-block
.tree-controls .tree-controls
= link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, @build), = link_to download_namespace_project_job_artifacts_path(@project.namespace, @project, @build),
rel: 'nofollow', download: '', class: 'btn btn-default download' do rel: 'nofollow', download: '', class: 'btn btn-default download' do
= icon('download') = icon('download')
Download artifacts archive Download artifacts archive
%ul.breadcrumb.repo-breadcrumb %ul.breadcrumb.repo-breadcrumb
%li %li
= link_to 'Artifacts', browse_namespace_project_build_artifacts_path(@project.namespace, @project, @build) = link_to 'Artifacts', browse_namespace_project_job_artifacts_path(@project.namespace, @project, @build)
- path_breadcrumbs do |title, path| - path_breadcrumbs do |title, path|
%li %li
= link_to truncate(title, length: 40), browse_namespace_project_build_artifacts_path(@project.namespace, @project, @build, path) = link_to truncate(title, length: 40), browse_namespace_project_job_artifacts_path(@project.namespace, @project, @build, path)
.tree-content-holder .tree-content-holder
%table.table.tree-table %table.table.tree-table
......
- page_title @path, 'Artifacts', "#{@build.name} (##{@build.id})", 'Jobs' - page_title @path, 'Artifacts', "#{@build.name} (##{@build.id})", 'Jobs'
= render "projects/pipelines/head" = render "projects/pipelines/head"
= render "projects/builds/header", show_controls: false = render "projects/jobs/header", show_controls: false
#tree-holder.tree-holder #tree-holder.tree-holder
.nav-block .nav-block
%ul.breadcrumb.repo-breadcrumb %ul.breadcrumb.repo-breadcrumb
%li %li
= link_to 'Artifacts', browse_namespace_project_build_artifacts_path(@project.namespace, @project, @build) = link_to 'Artifacts', browse_namespace_project_job_artifacts_path(@project.namespace, @project, @build)
- path_breadcrumbs do |title, path| - path_breadcrumbs do |title, path|
- title = truncate(title, length: 40) - title = truncate(title, length: 40)
%li %li
- if path == @path - if path == @path
= link_to file_namespace_project_build_artifacts_path(@project.namespace, @project, @build, path) do = link_to file_namespace_project_job_artifacts_path(@project.namespace, @project, @build, path) do
%strong= title %strong= title
- else - else
= link_to title, browse_namespace_project_build_artifacts_path(@project.namespace, @project, @build, path) = link_to title, browse_namespace_project_job_artifacts_path(@project.namespace, @project, @build, path)
%article.file-holder %article.file-holder
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
%td.branch-commit %td.branch-commit
- if can?(current_user, :read_build, job) - if can?(current_user, :read_build, job)
= link_to namespace_project_build_url(job.project.namespace, job.project, job) do = link_to namespace_project_job_url(job.project.namespace, job.project, job) do
%span.build-link ##{job.id} %span.build-link ##{job.id}
- else - else
%span.build-link ##{job.id} %span.build-link ##{job.id}
...@@ -95,16 +95,16 @@ ...@@ -95,16 +95,16 @@
%td %td
.pull-right .pull-right
- if can?(current_user, :read_build, job) && job.artifacts? - if can?(current_user, :read_build, job) && job.artifacts?
= link_to download_namespace_project_build_artifacts_path(job.project.namespace, job.project, job), rel: 'nofollow', download: '', title: 'Download artifacts', class: 'btn btn-build' do = link_to download_namespace_project_job_artifacts_path(job.project.namespace, job.project, job), rel: 'nofollow', download: '', title: 'Download artifacts', class: 'btn btn-build' do
= icon('download') = icon('download')
- if can?(current_user, :update_build, job) - if can?(current_user, :update_build, job)
- if job.active? - if job.active?
= link_to cancel_namespace_project_build_path(job.project.namespace, job.project, job, return_to: request.original_url), method: :post, title: 'Cancel', class: 'btn btn-build' do = link_to cancel_namespace_project_job_path(job.project.namespace, job.project, job, return_to: request.original_url), method: :post, title: 'Cancel', class: 'btn btn-build' do
= icon('remove', class: 'cred') = icon('remove', class: 'cred')
- elsif allow_retry - elsif allow_retry
- if job.playable? && !admin && can?(current_user, :update_build, job) - if job.playable? && !admin && can?(current_user, :update_build, job)
= link_to play_namespace_project_build_path(job.project.namespace, job.project, job, return_to: request.original_url), method: :post, title: 'Play', class: 'btn btn-build' do = link_to play_namespace_project_job_path(job.project.namespace, job.project, job, return_to: request.original_url), method: :post, title: 'Play', class: 'btn btn-build' do
= custom_icon('icon_play') = custom_icon('icon_play')
- elsif job.retryable? - elsif job.retryable?
= link_to retry_namespace_project_build_path(job.project.namespace, job.project, job, return_to: request.original_url), method: :post, title: 'Retry', class: 'btn btn-build' do = link_to retry_namespace_project_job_path(job.project.namespace, job.project, job, return_to: request.original_url), method: :post, title: 'Retry', class: 'btn btn-build' do
= icon('repeat') = icon('repeat')
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
= render 'ci/status/badge', status: @build.detailed_status(current_user), link: false, title: @build.status_title = render 'ci/status/badge', status: @build.detailed_status(current_user), link: false, title: @build.status_title
%strong %strong
Job Job
= link_to "##{@build.id}", namespace_project_build_path(@project.namespace, @project, @build), class: 'js-build-id' = link_to "##{@build.id}", namespace_project_job_path(@project.namespace, @project, @build), class: 'js-build-id'
in pipeline in pipeline
%strong %strong
= link_to "##{pipeline.id}", pipeline_path(pipeline) = link_to "##{pipeline.id}", pipeline_path(pipeline)
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
%strong %strong
= link_to @build.ref, project_ref_path(@project, @build.ref), class: 'ref-name' = link_to @build.ref, project_ref_path(@project, @build.ref), class: 'ref-name'
= render "projects/builds/user" if @build.user = render "projects/jobs/user" if @build.user
= time_ago_with_tooltip(@build.created_at) = time_ago_with_tooltip(@build.created_at)
...@@ -26,6 +26,6 @@ ...@@ -26,6 +26,6 @@
- if can?(current_user, :create_issue, @project) && @build.failed? - if can?(current_user, :create_issue, @project) && @build.failed?
= link_to "New issue", new_namespace_project_issue_path(@project.namespace, @project, issue: build_failed_issue_options), class: 'btn btn-new btn-inverted' = link_to "New issue", new_namespace_project_issue_path(@project.namespace, @project, issue: build_failed_issue_options), class: 'btn btn-new btn-inverted'
- if can?(current_user, :update_build, @build) && @build.retryable? - if can?(current_user, :update_build, @build) && @build.retryable?
= link_to "Retry job", retry_namespace_project_build_path(@project.namespace, @project, @build), class: 'btn btn-inverted-secondary', method: :post = link_to "Retry job", retry_namespace_project_job_path(@project.namespace, @project, @build), class: 'btn btn-inverted-secondary', method: :post
%button.btn.btn-default.pull-right.visible-xs-block.visible-sm-block.build-gutter-toggle.js-sidebar-build-toggle{ role: "button", type: "button" } %button.btn.btn-default.pull-right.visible-xs-block.visible-sm-block.build-gutter-toggle.js-sidebar-build-toggle{ role: "button", type: "button" }
= icon('angle-double-left') = icon('angle-double-left')
...@@ -30,21 +30,21 @@ ...@@ -30,21 +30,21 @@
- if @build.artifacts? - if @build.artifacts?
.btn-group.btn-group-justified{ role: :group } .btn-group.btn-group-justified{ role: :group }
- if @build.has_expiring_artifacts? && can?(current_user, :update_build, @build) - if @build.has_expiring_artifacts? && can?(current_user, :update_build, @build)
= link_to keep_namespace_project_build_artifacts_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-default', method: :post do = link_to keep_namespace_project_job_artifacts_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-default', method: :post do
Keep Keep
= link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, @build), rel: 'nofollow', download: '', class: 'btn btn-sm btn-default' do = link_to download_namespace_project_job_artifacts_path(@project.namespace, @project, @build), rel: 'nofollow', download: '', class: 'btn btn-sm btn-default' do
Download Download
- if @build.artifacts_metadata? - if @build.artifacts_metadata?
= link_to browse_namespace_project_build_artifacts_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-default' do = link_to browse_namespace_project_job_artifacts_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-default' do
Browse Browse
.block{ class: ("block-first" if !@build.coverage && !(can?(current_user, :read_build, @project) && (@build.artifacts? || @build.artifacts_expired?))) } .block{ class: ("block-first" if !@build.coverage && !(can?(current_user, :read_build, @project) && (@build.artifacts? || @build.artifacts_expired?))) }
.title .title
Job details Job details
- if can?(current_user, :update_build, @build) && @build.retryable? - if can?(current_user, :update_build, @build) && @build.retryable?
= link_to "Retry job", retry_namespace_project_build_path(@project.namespace, @project, @build), class: 'pull-right retry-link', method: :post = link_to "Retry job", retry_namespace_project_job_path(@project.namespace, @project, @build), class: 'pull-right retry-link', method: :post
- if @build.merge_request - if @build.merge_request
%p.build-detail-row %p.build-detail-row
%span.build-light-text Merge Request: %span.build-light-text Merge Request:
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
\##{@build.runner.id} \##{@build.runner.id}
.btn-group.btn-group-justified{ role: :group } .btn-group.btn-group-justified{ role: :group }
- if @build.active? - if @build.active?
= link_to "Cancel", cancel_namespace_project_build_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-default', method: :post = link_to "Cancel", cancel_namespace_project_job_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-default', method: :post
- if @build.trigger_request - if @build.trigger_request
.build-widget .build-widget
...@@ -119,7 +119,7 @@ ...@@ -119,7 +119,7 @@
- HasStatus::ORDERED_STATUSES.each do |build_status| - HasStatus::ORDERED_STATUSES.each do |build_status|
- builds.select{|build| build.status == build_status}.each do |build| - builds.select{|build| build.status == build_status}.each do |build|
.build-job{ class: sidebar_build_class(build, @build), data: { stage: build.stage } } .build-job{ class: sidebar_build_class(build, @build), data: { stage: build.stage } }
= link_to namespace_project_build_path(@project.namespace, @project, build) do = link_to namespace_project_job_path(@project.namespace, @project, build) do
= icon('arrow-right') = icon('arrow-right')
%span{ class: "ci-status-icon-#{build.status}" } %span{ class: "ci-status-icon-#{build.status}" }
= ci_icon_for_status(build.status) = ci_icon_for_status(build.status)
......
...@@ -4,13 +4,13 @@ ...@@ -4,13 +4,13 @@
%div{ class: container_class } %div{ class: container_class }
.top-area .top-area
- build_path_proc = ->(scope) { project_builds_path(@project, scope: scope) } - build_path_proc = ->(scope) { project_jobs_path(@project, scope: scope) }
= render "shared/builds/tabs", build_path_proc: build_path_proc, all_builds: @all_builds, scope: @scope = render "shared/builds/tabs", build_path_proc: build_path_proc, all_builds: @all_builds, scope: @scope
.nav-controls .nav-controls
- if can?(current_user, :update_build, @project) - if can?(current_user, :update_build, @project)
- if @all_builds.running_or_pending.any? - if @all_builds.running_or_pending.any?
= link_to 'Cancel running', cancel_all_namespace_project_builds_path(@project.namespace, @project), = link_to 'Cancel running', cancel_all_namespace_project_jobs_path(@project.namespace, @project),
data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post
- unless @repository.gitlab_ci_yml - unless @repository.gitlab_ci_yml
......
...@@ -62,17 +62,17 @@ ...@@ -62,17 +62,17 @@
Showing last Showing last
%span.js-truncated-info-size.truncated-info-size>< %span.js-truncated-info-size.truncated-info-size><
KiB of log - KiB of log -
%a.js-raw-link.raw-link{ href: raw_namespace_project_build_path(@project.namespace, @project, @build) }>< Complete Raw %a.js-raw-link.raw-link{ href: raw_namespace_project_job_path(@project.namespace, @project, @build) }>< Complete Raw
.controllers .controllers
- if @build.has_trace? - if @build.has_trace?
= link_to raw_namespace_project_build_path(@project.namespace, @project, @build), = link_to raw_namespace_project_job_path(@project.namespace, @project, @build),
title: 'Open raw trace', title: 'Open raw trace',
data: { placement: 'top', container: 'body' }, data: { placement: 'top', container: 'body' },
class: 'js-raw-link-controller has-tooltip' do class: 'js-raw-link-controller has-tooltip' do
= icon('download') = icon('download')
- if can?(current_user, :update_build, @project) && @build.erasable? - if can?(current_user, :update_build, @project) && @build.erasable?
= link_to erase_namespace_project_build_path(@project.namespace, @project, @build), = link_to erase_namespace_project_job_path(@project.namespace, @project, @build),
method: :post, method: :post,
data: { confirm: 'Are you sure you want to erase this build?', placement: 'top', container: 'body' }, data: { confirm: 'Are you sure you want to erase this build?', placement: 'top', container: 'body' },
title: 'Erase Build', title: 'Erase Build',
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
- if project_nav_tab? :builds - if project_nav_tab? :builds
= nav_link(controller: [:builds, :artifacts]) do = nav_link(controller: [:builds, :artifacts]) do
= link_to project_builds_path(@project), title: 'Jobs', class: 'shortcuts-builds' do = link_to project_jobs_path(@project), title: 'Jobs', class: 'shortcuts-builds' do
%span %span
Jobs Jobs
......
...@@ -51,5 +51,5 @@ ...@@ -51,5 +51,5 @@
%span.stage %span.stage
= build.stage.titleize = build.stage.titleize
%span.build-name %span.build-name
= link_to build.name, pipeline_build_url(pipeline, build) = link_to build.name, pipeline_job_url(pipeline, build)
%pre.build-log= build_summary(build, skip: index >= 10) %pre.build-log= build_summary(build, skip: index >= 10)
---
title: Change /builds in the URL to /-/jobs. Backward URLs were also added
merge_request: 11407
author:
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# - [project.namespace, project, build] # - [project.namespace, project, build]
# #
# instead of: # instead of:
# - namespace_project_build_path(project.namespace, project, build) # - namespace_project_job_path(project.namespace, project, build)
# #
# Without that, Ci:: namespace is used for resolving routes: # Without that, Ci:: namespace is used for resolving routes:
# - namespace_project_ci_build_path(project.namespace, project, build) # - namespace_project_ci_build_path(project.namespace, project, build)
......
...@@ -118,7 +118,7 @@ namespace :admin do ...@@ -118,7 +118,7 @@ namespace :admin do
resources :cohorts, only: :index resources :cohorts, only: :index
resources :builds, only: :index do resources :jobs, only: :index do
collection do collection do
post :cancel_all post :cancel_all
end end
......
require 'constraints/project_url_constrainer' require 'constraints/project_url_constrainer'
require 'gitlab/routes/legacy_builds'
resources :projects, only: [:index, :new, :create] resources :projects, only: [:index, :new, :create]
...@@ -180,38 +181,42 @@ constraints(ProjectUrlConstrainer.new) do ...@@ -180,38 +181,42 @@ constraints(ProjectUrlConstrainer.new) do
end end
end end
resources :builds, only: [:index, :show], constraints: { id: /\d+/ } do scope '-' do
collection do resources :jobs, only: [:index, :show], constraints: { id: /\d+/ } do
post :cancel_all collection do
post :cancel_all
resources :artifacts, only: [] do
collection do resources :artifacts, only: [] do
get :latest_succeeded, collection do
path: '*ref_name_and_path', get :latest_succeeded,
format: false path: '*ref_name_and_path',
format: false
end
end end
end end
end
member do member do
get :status get :status
post :cancel post :cancel
post :retry post :retry
post :play post :play
post :erase post :erase
get :trace, defaults: { format: 'json' } get :trace, defaults: { format: 'json' }
get :raw get :raw
end end
resource :artifacts, only: [] do resource :artifacts, only: [] do
get :download get :download
get :browse, path: 'browse(/*path)', format: false get :browse, path: 'browse(/*path)', format: false
get :file, path: 'file/*path', format: false get :file, path: 'file/*path', format: false
get :raw, path: 'raw/*path', format: false get :raw, path: 'raw/*path', format: false
post :keep post :keep
end
end end
end end
Gitlab::Routes::LegacyBuilds.new(self).draw
resources :hooks, only: [:index, :create, :edit, :update, :destroy], constraints: { id: /\d+/ } do resources :hooks, only: [:index, :create, :edit, :update, :destroy], constraints: { id: /\d+/ } do
member do member do
get :test get :test
......
...@@ -27,11 +27,11 @@ module SharedBuilds ...@@ -27,11 +27,11 @@ module SharedBuilds
end end
step 'I visit recent build details page' do step 'I visit recent build details page' do
visit namespace_project_build_path(@project.namespace, @project, @build) visit namespace_project_job_path(@project.namespace, @project, @build)
end end
step 'I visit project builds page' do step 'I visit project builds page' do
visit namespace_project_builds_path(@project.namespace, @project) visit namespace_project_jobs_path(@project.namespace, @project)
end end
step 'recent build has artifacts available' do step 'recent build has artifacts available' do
...@@ -56,7 +56,7 @@ module SharedBuilds ...@@ -56,7 +56,7 @@ module SharedBuilds
end end
step 'I access artifacts download page' do step 'I access artifacts download page' do
visit download_namespace_project_build_artifacts_path(@project.namespace, @project, @build) visit download_namespace_project_job_artifacts_path(@project.namespace, @project, @build)
end end
step 'I see details of a build' do step 'I see details of a build' do
......
...@@ -12,7 +12,7 @@ module Gitlab ...@@ -12,7 +12,7 @@ module Gitlab
end end
def action_path def action_path
cancel_namespace_project_build_path(subject.project.namespace, cancel_namespace_project_job_path(subject.project.namespace,
subject.project, subject.project,
subject) subject)
end end
......
...@@ -8,7 +8,7 @@ module Gitlab ...@@ -8,7 +8,7 @@ module Gitlab
end end
def details_path def details_path
namespace_project_build_path(subject.project.namespace, namespace_project_job_path(subject.project.namespace,
subject.project, subject.project,
subject) subject)
end end
......
...@@ -20,7 +20,7 @@ module Gitlab ...@@ -20,7 +20,7 @@ module Gitlab
end end
def action_path def action_path
play_namespace_project_build_path(subject.project.namespace, play_namespace_project_job_path(subject.project.namespace,
subject.project, subject.project,
subject) subject)
end end
......
...@@ -16,7 +16,7 @@ module Gitlab ...@@ -16,7 +16,7 @@ module Gitlab
end end
def action_path def action_path
retry_namespace_project_build_path(subject.project.namespace, retry_namespace_project_job_path(subject.project.namespace,
subject.project, subject.project,
subject) subject)
end end
......
...@@ -20,7 +20,7 @@ module Gitlab ...@@ -20,7 +20,7 @@ module Gitlab
end end
def action_path def action_path
play_namespace_project_build_path(subject.project.namespace, play_namespace_project_job_path(subject.project.namespace,
subject.project, subject.project,
subject) subject)
end end
......
...@@ -11,7 +11,7 @@ module Gitlab ...@@ -11,7 +11,7 @@ module Gitlab
USED_IN_ROUTES = %w[noteable issue notes issues realtime_changes USED_IN_ROUTES = %w[noteable issue notes issues realtime_changes
commit pipelines merge_requests new].freeze commit pipelines merge_requests new].freeze
RESERVED_WORDS = Gitlab::PathRegex::ILLEGAL_PROJECT_PATH_WORDS - USED_IN_ROUTES RESERVED_WORDS = Gitlab::PathRegex::ILLEGAL_PROJECT_PATH_WORDS - USED_IN_ROUTES
RESERVED_WORDS_REGEX = Regexp.union(*RESERVED_WORDS) RESERVED_WORDS_REGEX = Regexp.union(*RESERVED_WORDS.map(&Regexp.method(:escape)))
ROUTES = [ ROUTES = [
Gitlab::EtagCaching::Router::Route.new( Gitlab::EtagCaching::Router::Route.new(
%r(^(?!.*(#{RESERVED_WORDS_REGEX})).*/noteable/issue/\d+/notes\z), %r(^(?!.*(#{RESERVED_WORDS_REGEX})).*/noteable/issue/\d+/notes\z),
......
...@@ -80,6 +80,7 @@ module Gitlab ...@@ -80,6 +80,7 @@ module Gitlab
# By rejecting `badges` the router can _count_ on the fact that `badges` will # By rejecting `badges` the router can _count_ on the fact that `badges` will
# be preceded by the `namespace/project`. # be preceded by the `namespace/project`.
PROJECT_WILDCARD_ROUTES = %w[ PROJECT_WILDCARD_ROUTES = %w[
-
badges badges
blame blame
blob blob
......
module Gitlab
module Routes
class LegacyBuilds
def initialize(map)
@map = map
end
def draw
@map.instance_eval do
resources :builds, only: [:index, :show], constraints: { id: /\d+/ } do
collection do
resources :artifacts, only: [], controller: 'build_artifacts' do
collection do
get :latest_succeeded,
path: '*ref_name_and_path',
format: false
end
end
end
member do
get :raw
end
resource :artifacts, only: [], controller: 'build_artifacts' do
get :download
get :browse, path: 'browse(/*path)', format: false
get :file, path: 'file/*path', format: false
get :raw, path: 'raw/*path', format: false
end
end
end
end
end
end
end
...@@ -12,7 +12,7 @@ describe Projects::ArtifactsController do ...@@ -12,7 +12,7 @@ describe Projects::ArtifactsController do
status: 'success') status: 'success')
end end
let(:build) { create(:ci_build, :success, :artifacts, pipeline: pipeline) } let(:job) { create(:ci_build, :success, :artifacts, pipeline: pipeline) }
before do before do
project.team << [user, :developer] project.team << [user, :developer]
...@@ -22,16 +22,16 @@ describe Projects::ArtifactsController do ...@@ -22,16 +22,16 @@ describe Projects::ArtifactsController do
describe 'GET download' do describe 'GET download' do
it 'sends the artifacts file' do it 'sends the artifacts file' do
expect(controller).to receive(:send_file).with(build.artifacts_file.path, disposition: 'attachment').and_call_original expect(controller).to receive(:send_file).with(job.artifacts_file.path, disposition: 'attachment').and_call_original
get :download, namespace_id: project.namespace, project_id: project, build_id: build get :download, namespace_id: project.namespace, project_id: project, job_id: job
end end
end end
describe 'GET browse' do describe 'GET browse' do
context 'when the directory exists' do context 'when the directory exists' do
it 'renders the browse view' do it 'renders the browse view' do
get :browse, namespace_id: project.namespace, project_id: project, build_id: build, path: 'other_artifacts_0.1.2' get :browse, namespace_id: project.namespace, project_id: project, job_id: job, path: 'other_artifacts_0.1.2'
expect(response).to render_template('projects/artifacts/browse') expect(response).to render_template('projects/artifacts/browse')
end end
...@@ -39,7 +39,7 @@ describe Projects::ArtifactsController do ...@@ -39,7 +39,7 @@ describe Projects::ArtifactsController do
context 'when the directory does not exist' do context 'when the directory does not exist' do
it 'responds Not Found' do it 'responds Not Found' do
get :browse, namespace_id: project.namespace, project_id: project, build_id: build, path: 'unknown' get :browse, namespace_id: project.namespace, project_id: project, job_id: job, path: 'unknown'
expect(response).to be_not_found expect(response).to be_not_found
end end
...@@ -49,7 +49,7 @@ describe Projects::ArtifactsController do ...@@ -49,7 +49,7 @@ describe Projects::ArtifactsController do
describe 'GET file' do describe 'GET file' do
context 'when the file exists' do context 'when the file exists' do
it 'renders the file view' do it 'renders the file view' do
get :file, namespace_id: project.namespace, project_id: project, build_id: build, path: 'ci_artifacts.txt' get :file, namespace_id: project.namespace, project_id: project, job_id: job, path: 'ci_artifacts.txt'
expect(response).to render_template('projects/artifacts/file') expect(response).to render_template('projects/artifacts/file')
end end
...@@ -57,7 +57,7 @@ describe Projects::ArtifactsController do ...@@ -57,7 +57,7 @@ describe Projects::ArtifactsController do
context 'when the file does not exist' do context 'when the file does not exist' do
it 'responds Not Found' do it 'responds Not Found' do
get :file, namespace_id: project.namespace, project_id: project, build_id: build, path: 'unknown' get :file, namespace_id: project.namespace, project_id: project, job_id: job, path: 'unknown'
expect(response).to be_not_found expect(response).to be_not_found
end end
...@@ -67,7 +67,7 @@ describe Projects::ArtifactsController do ...@@ -67,7 +67,7 @@ describe Projects::ArtifactsController do
describe 'GET raw' do describe 'GET raw' do
context 'when the file exists' do context 'when the file exists' do
it 'serves the file using workhorse' do it 'serves the file using workhorse' do
get :raw, namespace_id: project.namespace, project_id: project, build_id: build, path: 'ci_artifacts.txt' get :raw, namespace_id: project.namespace, project_id: project, job_id: job, path: 'ci_artifacts.txt'
send_data = response.headers[Gitlab::Workhorse::SEND_DATA_HEADER] send_data = response.headers[Gitlab::Workhorse::SEND_DATA_HEADER]
...@@ -84,7 +84,7 @@ describe Projects::ArtifactsController do ...@@ -84,7 +84,7 @@ describe Projects::ArtifactsController do
context 'when the file does not exist' do context 'when the file does not exist' do
it 'responds Not Found' do it 'responds Not Found' do
get :raw, namespace_id: project.namespace, project_id: project, build_id: build, path: 'unknown' get :raw, namespace_id: project.namespace, project_id: project, job_id: job, path: 'unknown'
expect(response).to be_not_found expect(response).to be_not_found
end end
...@@ -92,29 +92,29 @@ describe Projects::ArtifactsController do ...@@ -92,29 +92,29 @@ describe Projects::ArtifactsController do
end end
describe 'GET latest_succeeded' do describe 'GET latest_succeeded' do
def params_from_ref(ref = pipeline.ref, job = build.name, path = 'browse') def params_from_ref(ref = pipeline.ref, job_name = job.name, path = 'browse')
{ {
namespace_id: project.namespace, namespace_id: project.namespace,
project_id: project, project_id: project,
ref_name_and_path: File.join(ref, path), ref_name_and_path: File.join(ref, path),
job: job job: job_name
} }
end end
context 'cannot find the build' do context 'cannot find the job' do
shared_examples 'not found' do shared_examples 'not found' do
it { expect(response).to have_http_status(:not_found) } it { expect(response).to have_http_status(:not_found) }
end end
context 'has no such ref' do context 'has no such ref' do
before do before do
get :latest_succeeded, params_from_ref('TAIL', build.name) get :latest_succeeded, params_from_ref('TAIL', job.name)
end end
it_behaves_like 'not found' it_behaves_like 'not found'
end end
context 'has no such build' do context 'has no such job' do
before do before do
get :latest_succeeded, params_from_ref(pipeline.ref, 'NOBUILD') get :latest_succeeded, params_from_ref(pipeline.ref, 'NOBUILD')
end end
...@@ -124,20 +124,20 @@ describe Projects::ArtifactsController do ...@@ -124,20 +124,20 @@ describe Projects::ArtifactsController do
context 'has no path' do context 'has no path' do
before do before do
get :latest_succeeded, params_from_ref(pipeline.sha, build.name, '') get :latest_succeeded, params_from_ref(pipeline.sha, job.name, '')
end end
it_behaves_like 'not found' it_behaves_like 'not found'
end end
end end
context 'found the build and redirect' do context 'found the job and redirect' do
shared_examples 'redirect to the build' do shared_examples 'redirect to the job' do
it 'redirects' do it 'redirects' do
path = browse_namespace_project_build_artifacts_path( path = browse_namespace_project_job_artifacts_path(
project.namespace, project.namespace,
project, project,
build) job)
expect(response).to redirect_to(path) expect(response).to redirect_to(path)
end end
...@@ -151,7 +151,7 @@ describe Projects::ArtifactsController do ...@@ -151,7 +151,7 @@ describe Projects::ArtifactsController do
get :latest_succeeded, params_from_ref('master') get :latest_succeeded, params_from_ref('master')
end end
it_behaves_like 'redirect to the build' it_behaves_like 'redirect to the job'
end end
context 'with branch name containing slash' do context 'with branch name containing slash' do
...@@ -162,7 +162,7 @@ describe Projects::ArtifactsController do ...@@ -162,7 +162,7 @@ describe Projects::ArtifactsController do
get :latest_succeeded, params_from_ref('improve/awesome') get :latest_succeeded, params_from_ref('improve/awesome')
end end
it_behaves_like 'redirect to the build' it_behaves_like 'redirect to the job'
end end
context 'with branch name and path containing slashes' do context 'with branch name and path containing slashes' do
...@@ -170,14 +170,14 @@ describe Projects::ArtifactsController do ...@@ -170,14 +170,14 @@ describe Projects::ArtifactsController do
pipeline.update(ref: 'improve/awesome', pipeline.update(ref: 'improve/awesome',
sha: project.commit('improve/awesome').sha) sha: project.commit('improve/awesome').sha)
get :latest_succeeded, params_from_ref('improve/awesome', build.name, 'file/README.md') get :latest_succeeded, params_from_ref('improve/awesome', job.name, 'file/README.md')
end end
it 'redirects' do it 'redirects' do
path = file_namespace_project_build_artifacts_path( path = file_namespace_project_job_artifacts_path(
project.namespace, project.namespace,
project, project,
build, job,
'README.md') 'README.md')
expect(response).to redirect_to(path) expect(response).to redirect_to(path)
......
...@@ -177,7 +177,7 @@ describe Projects::EnvironmentsController do ...@@ -177,7 +177,7 @@ describe Projects::EnvironmentsController do
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(json_response).to eq( expect(json_response).to eq(
{ 'redirect_url' => { 'redirect_url' =>
"http://test.host/#{project.path_with_namespace}/builds/#{action.id}" }) namespace_project_job_url(project.namespace, project, action) })
end end
end end
...@@ -191,7 +191,7 @@ describe Projects::EnvironmentsController do ...@@ -191,7 +191,7 @@ describe Projects::EnvironmentsController do
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(json_response).to eq( expect(json_response).to eq(
{ 'redirect_url' => { 'redirect_url' =>
"http://test.host/#{project.path_with_namespace}/environments/#{environment.id}" }) namespace_project_environment_url(project.namespace, project, environment) })
end end
end end
end end
......
require 'spec_helper' require 'spec_helper'
describe Projects::BuildsController do describe Projects::JobsController do
include ApiHelpers include ApiHelpers
let(:project) { create(:empty_project, :public) } let(:project) { create(:empty_project, :public) }
...@@ -213,7 +213,7 @@ describe Projects::BuildsController do ...@@ -213,7 +213,7 @@ describe Projects::BuildsController do
it 'redirects to the retried build page' do it 'redirects to the retried build page' do
expect(response).to have_http_status(:found) expect(response).to have_http_status(:found)
expect(response).to redirect_to(namespace_project_build_path(id: Ci::Build.last.id)) expect(response).to redirect_to(namespace_project_job_path(id: Ci::Build.last.id))
end end
end end
...@@ -249,7 +249,7 @@ describe Projects::BuildsController do ...@@ -249,7 +249,7 @@ describe Projects::BuildsController do
it 'redirects to the played build page' do it 'redirects to the played build page' do
expect(response).to have_http_status(:found) expect(response).to have_http_status(:found)
expect(response).to redirect_to(namespace_project_build_path(id: build.id)) expect(response).to redirect_to(namespace_project_job_path(id: build.id))
end end
it 'transits to pending' do it 'transits to pending' do
...@@ -285,7 +285,7 @@ describe Projects::BuildsController do ...@@ -285,7 +285,7 @@ describe Projects::BuildsController do
it 'redirects to the canceled build page' do it 'redirects to the canceled build page' do
expect(response).to have_http_status(:found) expect(response).to have_http_status(:found)
expect(response).to redirect_to(namespace_project_build_path(id: build.id)) expect(response).to redirect_to(namespace_project_job_path(id: build.id))
end end
it 'transits to canceled' do it 'transits to canceled' do
...@@ -323,7 +323,7 @@ describe Projects::BuildsController do ...@@ -323,7 +323,7 @@ describe Projects::BuildsController do
it 'redirects to a index page' do it 'redirects to a index page' do
expect(response).to have_http_status(:found) expect(response).to have_http_status(:found)
expect(response).to redirect_to(namespace_project_builds_path) expect(response).to redirect_to(namespace_project_jobs_path)
end end
it 'transits to canceled' do it 'transits to canceled' do
...@@ -340,7 +340,7 @@ describe Projects::BuildsController do ...@@ -340,7 +340,7 @@ describe Projects::BuildsController do
it 'redirects to a index page' do it 'redirects to a index page' do
expect(response).to have_http_status(:found) expect(response).to have_http_status(:found)
expect(response).to redirect_to(namespace_project_builds_path) expect(response).to redirect_to(namespace_project_jobs_path)
end end
end end
...@@ -363,7 +363,7 @@ describe Projects::BuildsController do ...@@ -363,7 +363,7 @@ describe Projects::BuildsController do
it 'redirects to the erased build page' do it 'redirects to the erased build page' do
expect(response).to have_http_status(:found) expect(response).to have_http_status(:found)
expect(response).to redirect_to(namespace_project_build_path(id: build.id)) expect(response).to redirect_to(namespace_project_job_path(id: build.id))
end end
it 'erases artifacts' do it 'erases artifacts' do
......
...@@ -16,7 +16,7 @@ describe 'Admin Builds' do ...@@ -16,7 +16,7 @@ describe 'Admin Builds' do
create(:ci_build, pipeline: pipeline, status: :success) create(:ci_build, pipeline: pipeline, status: :success)
create(:ci_build, pipeline: pipeline, status: :failed) create(:ci_build, pipeline: pipeline, status: :failed)
visit admin_builds_path visit admin_jobs_path
expect(page).to have_selector('.nav-links li.active', text: 'All') expect(page).to have_selector('.nav-links li.active', text: 'All')
expect(page).to have_selector('.row-content-block', text: 'All jobs') expect(page).to have_selector('.row-content-block', text: 'All jobs')
...@@ -27,7 +27,7 @@ describe 'Admin Builds' do ...@@ -27,7 +27,7 @@ describe 'Admin Builds' do
context 'when have no jobs' do context 'when have no jobs' do
it 'shows a message' do it 'shows a message' do
visit admin_builds_path visit admin_jobs_path
expect(page).to have_selector('.nav-links li.active', text: 'All') expect(page).to have_selector('.nav-links li.active', text: 'All')
expect(page).to have_content 'No jobs to show' expect(page).to have_content 'No jobs to show'
...@@ -44,7 +44,7 @@ describe 'Admin Builds' do ...@@ -44,7 +44,7 @@ describe 'Admin Builds' do
build3 = create(:ci_build, pipeline: pipeline, status: :success) build3 = create(:ci_build, pipeline: pipeline, status: :success)
build4 = create(:ci_build, pipeline: pipeline, status: :failed) build4 = create(:ci_build, pipeline: pipeline, status: :failed)
visit admin_builds_path(scope: :pending) visit admin_jobs_path(scope: :pending)
expect(page).to have_selector('.nav-links li.active', text: 'Pending') expect(page).to have_selector('.nav-links li.active', text: 'Pending')
expect(page.find('.build-link')).to have_content(build1.id) expect(page.find('.build-link')).to have_content(build1.id)
...@@ -59,7 +59,7 @@ describe 'Admin Builds' do ...@@ -59,7 +59,7 @@ describe 'Admin Builds' do
it 'shows a message' do it 'shows a message' do
create(:ci_build, pipeline: pipeline, status: :success) create(:ci_build, pipeline: pipeline, status: :success)
visit admin_builds_path(scope: :pending) visit admin_jobs_path(scope: :pending)
expect(page).to have_selector('.nav-links li.active', text: 'Pending') expect(page).to have_selector('.nav-links li.active', text: 'Pending')
expect(page).to have_content 'No jobs to show' expect(page).to have_content 'No jobs to show'
...@@ -76,7 +76,7 @@ describe 'Admin Builds' do ...@@ -76,7 +76,7 @@ describe 'Admin Builds' do
build3 = create(:ci_build, pipeline: pipeline, status: :failed) build3 = create(:ci_build, pipeline: pipeline, status: :failed)
build4 = create(:ci_build, pipeline: pipeline, status: :pending) build4 = create(:ci_build, pipeline: pipeline, status: :pending)
visit admin_builds_path(scope: :running) visit admin_jobs_path(scope: :running)
expect(page).to have_selector('.nav-links li.active', text: 'Running') expect(page).to have_selector('.nav-links li.active', text: 'Running')
expect(page.find('.build-link')).to have_content(build1.id) expect(page.find('.build-link')).to have_content(build1.id)
...@@ -91,7 +91,7 @@ describe 'Admin Builds' do ...@@ -91,7 +91,7 @@ describe 'Admin Builds' do
it 'shows a message' do it 'shows a message' do
create(:ci_build, pipeline: pipeline, status: :success) create(:ci_build, pipeline: pipeline, status: :success)
visit admin_builds_path(scope: :running) visit admin_jobs_path(scope: :running)
expect(page).to have_selector('.nav-links li.active', text: 'Running') expect(page).to have_selector('.nav-links li.active', text: 'Running')
expect(page).to have_content 'No jobs to show' expect(page).to have_content 'No jobs to show'
...@@ -107,7 +107,7 @@ describe 'Admin Builds' do ...@@ -107,7 +107,7 @@ describe 'Admin Builds' do
build2 = create(:ci_build, pipeline: pipeline, status: :running) build2 = create(:ci_build, pipeline: pipeline, status: :running)
build3 = create(:ci_build, pipeline: pipeline, status: :success) build3 = create(:ci_build, pipeline: pipeline, status: :success)
visit admin_builds_path(scope: :finished) visit admin_jobs_path(scope: :finished)
expect(page).to have_selector('.nav-links li.active', text: 'Finished') expect(page).to have_selector('.nav-links li.active', text: 'Finished')
expect(page.find('.build-link')).not_to have_content(build1.id) expect(page.find('.build-link')).not_to have_content(build1.id)
...@@ -121,7 +121,7 @@ describe 'Admin Builds' do ...@@ -121,7 +121,7 @@ describe 'Admin Builds' do
it 'shows a message' do it 'shows a message' do
create(:ci_build, pipeline: pipeline, status: :running) create(:ci_build, pipeline: pipeline, status: :running)
visit admin_builds_path(scope: :finished) visit admin_jobs_path(scope: :finished)
expect(page).to have_selector('.nav-links li.active', text: 'Finished') expect(page).to have_selector('.nav-links li.active', text: 'Finished')
expect(page).to have_content 'No jobs to show' expect(page).to have_content 'No jobs to show'
......
...@@ -85,7 +85,7 @@ feature 'Mini Pipeline Graph', :js, :feature do ...@@ -85,7 +85,7 @@ feature 'Mini Pipeline Graph', :js, :feature do
build_item.click build_item.click
find('.build-page') find('.build-page')
expect(current_path).to eql(namespace_project_build_path(project.namespace, project, build)) expect(current_path).to eql(namespace_project_job_path(project.namespace, project, build))
end end
it 'should show tooltip when hovered' do it 'should show tooltip when hovered' do
......
require 'spec_helper'
feature 'Browse artifact', :js, feature: true do
let(:project) { create(:project, :public) }
let(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.sha, ref: 'master') }
let(:job) { create(:ci_build, :artifacts, pipeline: pipeline) }
def browse_path(path)
browse_namespace_project_job_artifacts_path(project.namespace, project, job, path)
end
context 'when visiting old URL' do
let(:browse_url) do
browse_path('other_artifacts_0.1.2')
end
before do
visit browse_url.sub('/-/jobs', '/builds')
end
it "redirects to new URL" do
expect(page.current_path).to eq(browse_url)
end
end
end
require 'spec_helper'
feature 'Download artifact', :js, feature: true do
let(:project) { create(:project, :public) }
let(:pipeline) { create(:ci_empty_pipeline, status: :success, project: project, sha: project.commit.sha, ref: 'master') }
let(:job) { create(:ci_build, :artifacts, :success, pipeline: pipeline) }
shared_examples 'downloading' do
it 'downloads the zip' do
expect(page.response_headers['Content-Disposition'])
.to eq(%Q{attachment; filename="#{job.artifacts_file.filename}"})
# Check the content does match, but don't print this as error message
expect(page.source.b == job.artifacts_file.file.read.b)
end
end
context 'when downloading' do
before do
visit download_url
end
context 'via job id' do
let(:download_url) do
download_namespace_project_job_artifacts_path(project.namespace, project, job)
end
it_behaves_like 'downloading'
end
context 'via branch name and job name' do
let(:download_url) do
latest_succeeded_namespace_project_artifacts_path(project.namespace, project, "#{pipeline.ref}/download", job: job.name)
end
it_behaves_like 'downloading'
end
end
context 'when visiting old URL' do
before do
visit download_url.sub('/-/jobs', '/builds')
end
context 'via job id' do
let(:download_url) do
download_namespace_project_job_artifacts_path(project.namespace, project, job)
end
it_behaves_like 'downloading'
end
context 'via branch name and job name' do
let(:download_url) do
latest_succeeded_namespace_project_artifacts_path(project.namespace, project, "#{pipeline.ref}/download", job: job.name)
end
it_behaves_like 'downloading'
end
end
end
...@@ -6,7 +6,11 @@ feature 'Artifact file', :js, feature: true do ...@@ -6,7 +6,11 @@ feature 'Artifact file', :js, feature: true do
let(:build) { create(:ci_build, :artifacts, pipeline: pipeline) } let(:build) { create(:ci_build, :artifacts, pipeline: pipeline) }
def visit_file(path) def visit_file(path)
visit file_namespace_project_build_artifacts_path(project.namespace, project, build, path) visit file_path(path)
end
def file_path(path)
file_namespace_project_job_artifacts_path(project.namespace, project, build, path)
end end
context 'Text file' do context 'Text file' do
...@@ -56,4 +60,18 @@ feature 'Artifact file', :js, feature: true do ...@@ -56,4 +60,18 @@ feature 'Artifact file', :js, feature: true do
end end
end end
end end
context 'when visiting old URL' do
let(:file_url) do
file_path('other_artifacts_0.1.2/doc_sample.txt')
end
before do
visit file_url.sub('/-/jobs', '/builds')
end
it "redirects to new URL" do
expect(page.current_path).to eq(file_url)
end
end
end end
require 'spec_helper'
feature 'Raw artifact', :js, feature: true do
let(:project) { create(:project, :public) }
let(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.sha, ref: 'master') }
let(:job) { create(:ci_build, :artifacts, pipeline: pipeline) }
def raw_path(path)
raw_namespace_project_job_artifacts_path(project.namespace, project, job, path)
end
context 'when visiting old URL' do
let(:raw_url) do
raw_path('other_artifacts_0.1.2/doc_sample.txt')
end
before do
visit raw_url.sub('/-/jobs', '/builds')
end
it "redirects to new URL" do
expect(page.current_path).to eq(raw_url)
end
end
end
require 'spec_helper' require 'spec_helper'
require 'tempfile' require 'tempfile'
feature 'Builds', :feature do feature 'Jobs', :feature do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:user_access_level) { :developer } let(:user_access_level) { :developer }
let(:project) { create(:project) } let(:project) { create(:project) }
...@@ -19,12 +19,12 @@ feature 'Builds', :feature do ...@@ -19,12 +19,12 @@ feature 'Builds', :feature do
login_as(user) login_as(user)
end end
describe "GET /:project/builds" do describe "GET /:project/jobs" do
let!(:build) { create(:ci_build, pipeline: pipeline) } let!(:build) { create(:ci_build, pipeline: pipeline) }
context "Pending scope" do context "Pending scope" do
before do before do
visit namespace_project_builds_path(project.namespace, project, scope: :pending) visit namespace_project_jobs_path(project.namespace, project, scope: :pending)
end end
it "shows Pending tab jobs" do it "shows Pending tab jobs" do
...@@ -39,7 +39,7 @@ feature 'Builds', :feature do ...@@ -39,7 +39,7 @@ feature 'Builds', :feature do
context "Running scope" do context "Running scope" do
before do before do
build.run! build.run!
visit namespace_project_builds_path(project.namespace, project, scope: :running) visit namespace_project_jobs_path(project.namespace, project, scope: :running)
end end
it "shows Running tab jobs" do it "shows Running tab jobs" do
...@@ -54,7 +54,7 @@ feature 'Builds', :feature do ...@@ -54,7 +54,7 @@ feature 'Builds', :feature do
context "Finished scope" do context "Finished scope" do
before do before do
build.run! build.run!
visit namespace_project_builds_path(project.namespace, project, scope: :finished) visit namespace_project_jobs_path(project.namespace, project, scope: :finished)
end end
it "shows Finished tab jobs" do it "shows Finished tab jobs" do
...@@ -67,7 +67,7 @@ feature 'Builds', :feature do ...@@ -67,7 +67,7 @@ feature 'Builds', :feature do
context "All jobs" do context "All jobs" do
before do before do
project.builds.running_or_pending.each(&:success) project.builds.running_or_pending.each(&:success)
visit namespace_project_builds_path(project.namespace, project) visit namespace_project_jobs_path(project.namespace, project)
end end
it "shows All tab jobs" do it "shows All tab jobs" do
...@@ -78,12 +78,26 @@ feature 'Builds', :feature do ...@@ -78,12 +78,26 @@ feature 'Builds', :feature do
expect(page).not_to have_link 'Cancel running' expect(page).not_to have_link 'Cancel running'
end end
end end
context "when visiting old URL" do
let(:jobs_url) do
namespace_project_jobs_path(project.namespace, project)
end
before do
visit jobs_url.sub('/-/jobs', '/builds')
end
it "redirects to new URL" do
expect(page.current_path).to eq(jobs_url)
end
end
end end
describe "POST /:project/builds/:id/cancel_all" do describe "POST /:project/jobs/:id/cancel_all" do
before do before do
build.run! build.run!
visit namespace_project_builds_path(project.namespace, project) visit namespace_project_jobs_path(project.namespace, project)
click_link "Cancel running" click_link "Cancel running"
end end
...@@ -97,10 +111,10 @@ feature 'Builds', :feature do ...@@ -97,10 +111,10 @@ feature 'Builds', :feature do
end end
end end
describe "GET /:project/builds/:id" do describe "GET /:project/jobs/:id" do
context "Job from project" do context "Job from project" do
before do before do
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
end end
it 'shows commit`s data' do it 'shows commit`s data' do
...@@ -117,7 +131,7 @@ feature 'Builds', :feature do ...@@ -117,7 +131,7 @@ feature 'Builds', :feature do
context "Job from other project" do context "Job from other project" do
before do before do
visit namespace_project_build_path(project.namespace, project, build2) visit namespace_project_job_path(project.namespace, project, build2)
end end
it { expect(page.status_code).to eq(404) } it { expect(page.status_code).to eq(404) }
...@@ -126,7 +140,7 @@ feature 'Builds', :feature do ...@@ -126,7 +140,7 @@ feature 'Builds', :feature do
context "Download artifacts" do context "Download artifacts" do
before do before do
build.update_attributes(artifacts_file: artifacts_file) build.update_attributes(artifacts_file: artifacts_file)
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
end end
it 'has button to download artifacts' do it 'has button to download artifacts' do
...@@ -139,7 +153,7 @@ feature 'Builds', :feature do ...@@ -139,7 +153,7 @@ feature 'Builds', :feature do
build.update_attributes(artifacts_file: artifacts_file, build.update_attributes(artifacts_file: artifacts_file,
artifacts_expire_at: expire_at) artifacts_expire_at: expire_at)
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
end end
context 'no expire date defined' do context 'no expire date defined' do
...@@ -183,10 +197,25 @@ feature 'Builds', :feature do ...@@ -183,10 +197,25 @@ feature 'Builds', :feature do
end end
end end
context "when visiting old URL" do
let(:job_url) do
namespace_project_job_path(project.namespace, project, build)
end
before do
visit job_url.sub('/-/jobs', '/builds')
end
it "redirects to new URL" do
expect(page.current_path).to eq(job_url)
end
end
feature 'Raw trace' do feature 'Raw trace' do
before do before do
build.run! build.run!
visit namespace_project_build_path(project.namespace, project, build)
visit namespace_project_job_path(project.namespace, project, build)
end end
it do it do
...@@ -198,7 +227,7 @@ feature 'Builds', :feature do ...@@ -198,7 +227,7 @@ feature 'Builds', :feature do
before do before do
build.run! build.run!
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
end end
context 'when job has an initial trace' do context 'when job has an initial trace' do
...@@ -222,7 +251,7 @@ feature 'Builds', :feature do ...@@ -222,7 +251,7 @@ feature 'Builds', :feature do
end end
before do before do
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
end end
it 'shows variable key and value after click', js: true do it 'shows variable key and value after click', js: true do
...@@ -247,17 +276,17 @@ feature 'Builds', :feature do ...@@ -247,17 +276,17 @@ feature 'Builds', :feature do
let(:build) { create(:ci_build, :success, environment: environment.name, deployments: [deployment], pipeline: pipeline) } let(:build) { create(:ci_build, :success, environment: environment.name, deployments: [deployment], pipeline: pipeline) }
it 'shows a link for the job' do it 'shows a link for the job' do
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
expect(page).to have_link environment.name expect(page).to have_link environment.name
end end
end end
context 'job is complete and not successfull' do context 'job is complete and not successful' do
let(:build) { create(:ci_build, :failed, environment: environment.name, pipeline: pipeline) } let(:build) { create(:ci_build, :failed, environment: environment.name, pipeline: pipeline) }
it 'shows a link for the job' do it 'shows a link for the job' do
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
expect(page).to have_link environment.name expect(page).to have_link environment.name
end end
...@@ -268,7 +297,7 @@ feature 'Builds', :feature do ...@@ -268,7 +297,7 @@ feature 'Builds', :feature do
let(:build) { create(:ci_build, :success, environment: environment.name, pipeline: pipeline) } let(:build) { create(:ci_build, :success, environment: environment.name, pipeline: pipeline) }
it 'shows a link to latest deployment' do it 'shows a link to latest deployment' do
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
expect(page).to have_link('latest deployment') expect(page).to have_link('latest deployment')
end end
...@@ -276,11 +305,11 @@ feature 'Builds', :feature do ...@@ -276,11 +305,11 @@ feature 'Builds', :feature do
end end
end end
describe "POST /:project/builds/:id/cancel" do describe "POST /:project/jobs/:id/cancel" do
context "Job from project" do context "Job from project" do
before do before do
build.run! build.run!
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
click_link "Cancel" click_link "Cancel"
end end
...@@ -294,19 +323,19 @@ feature 'Builds', :feature do ...@@ -294,19 +323,19 @@ feature 'Builds', :feature do
context "Job from other project" do context "Job from other project" do
before do before do
build.run! build.run!
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
page.driver.post(cancel_namespace_project_build_path(project.namespace, project, build2)) page.driver.post(cancel_namespace_project_job_path(project.namespace, project, build2))
end end
it { expect(page.status_code).to eq(404) } it { expect(page.status_code).to eq(404) }
end end
end end
describe "POST /:project/builds/:id/retry" do describe "POST /:project/jobs/:id/retry" do
context "Job from project" do context "Job from project" do
before do before do
build.run! build.run!
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
click_link 'Cancel' click_link 'Cancel'
page.within('.build-header') do page.within('.build-header') do
click_link 'Retry job' click_link 'Retry job'
...@@ -322,18 +351,18 @@ feature 'Builds', :feature do ...@@ -322,18 +351,18 @@ feature 'Builds', :feature do
end end
end end
context "Build from other project" do context "Job from other project" do
before do before do
build.run! build.run!
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
click_link 'Cancel' click_link 'Cancel'
page.driver.post(retry_namespace_project_build_path(project.namespace, project, build2)) page.driver.post(retry_namespace_project_job_path(project.namespace, project, build2))
end end
it { expect(page).to have_http_status(404) } it { expect(page).to have_http_status(404) }
end end
context "Build that current user is not allowed to retry" do context "Job that current user is not allowed to retry" do
before do before do
build.run! build.run!
build.cancel! build.cancel!
...@@ -341,7 +370,7 @@ feature 'Builds', :feature do ...@@ -341,7 +370,7 @@ feature 'Builds', :feature do
logout_direct logout_direct
login_with(create(:user)) login_with(create(:user))
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
end end
it 'does not show the Retry button' do it 'does not show the Retry button' do
...@@ -352,30 +381,30 @@ feature 'Builds', :feature do ...@@ -352,30 +381,30 @@ feature 'Builds', :feature do
end end
end end
describe "GET /:project/builds/:id/download" do describe "GET /:project/jobs/:id/download" do
before do before do
build.update_attributes(artifacts_file: artifacts_file) build.update_attributes(artifacts_file: artifacts_file)
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
click_link 'Download' click_link 'Download'
end end
context "Build from other project" do context "Build from other project" do
before do before do
build2.update_attributes(artifacts_file: artifacts_file) build2.update_attributes(artifacts_file: artifacts_file)
visit download_namespace_project_build_artifacts_path(project.namespace, project, build2) visit download_namespace_project_job_artifacts_path(project.namespace, project, build2)
end end
it { expect(page.status_code).to eq(404) } it { expect(page.status_code).to eq(404) }
end end
end end
describe 'GET /:project/builds/:id/raw', :js do describe 'GET /:project/jobs/:id/raw', :js do
context 'access source' do context 'access source' do
context 'build from project' do context 'job from project' do
before do before do
Capybara.current_session.driver.headers = { 'X-Sendfile-Type' => 'X-Sendfile' } Capybara.current_session.driver.headers = { 'X-Sendfile-Type' => 'X-Sendfile' }
build.run! build.run!
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
find('.js-raw-link-controller').click() find('.js-raw-link-controller').click()
end end
...@@ -386,11 +415,11 @@ feature 'Builds', :feature do ...@@ -386,11 +415,11 @@ feature 'Builds', :feature do
end end
end end
context 'build from other project' do context 'job from other project' do
before do before do
Capybara.current_session.driver.headers = { 'X-Sendfile-Type' => 'X-Sendfile' } Capybara.current_session.driver.headers = { 'X-Sendfile-Type' => 'X-Sendfile' }
build2.run! build2.run!
visit raw_namespace_project_build_path(project.namespace, project, build2) visit raw_namespace_project_job_path(project.namespace, project, build2)
end end
it 'sends the right headers' do it 'sends the right headers' do
...@@ -410,7 +439,7 @@ feature 'Builds', :feature do ...@@ -410,7 +439,7 @@ feature 'Builds', :feature do
allow_any_instance_of(Gitlab::Ci::Trace).to receive(:paths) allow_any_instance_of(Gitlab::Ci::Trace).to receive(:paths)
.and_return(paths) .and_return(paths)
visit namespace_project_build_path(project.namespace, project, build) visit namespace_project_job_path(project.namespace, project, build)
end end
context 'when build has trace in file', :js do context 'when build has trace in file', :js do
...@@ -429,7 +458,7 @@ feature 'Builds', :feature do ...@@ -429,7 +458,7 @@ feature 'Builds', :feature do
end end
end end
context 'when build has trace in DB' do context 'when job has trace in DB' do
let(:paths) { [] } let(:paths) { [] }
it 'sends the right headers' do it 'sends the right headers' do
...@@ -437,38 +466,52 @@ feature 'Builds', :feature do ...@@ -437,38 +466,52 @@ feature 'Builds', :feature do
end end
end end
end end
context "when visiting old URL" do
let(:raw_job_url) do
raw_namespace_project_job_path(project.namespace, project, build)
end
before do
visit raw_job_url.sub('/-/jobs', '/builds')
end
it "redirects to new URL" do
expect(page.current_path).to eq(raw_job_url)
end
end
end end
describe "GET /:project/builds/:id/trace.json" do describe "GET /:project/jobs/:id/trace.json" do
context "Build from project" do context "Job from project" do
before do before do
visit trace_namespace_project_build_path(project.namespace, project, build, format: :json) visit trace_namespace_project_job_path(project.namespace, project, build, format: :json)
end end
it { expect(page.status_code).to eq(200) } it { expect(page.status_code).to eq(200) }
end end
context "Build from other project" do context "Job from other project" do
before do before do
visit trace_namespace_project_build_path(project.namespace, project, build2, format: :json) visit trace_namespace_project_job_path(project.namespace, project, build2, format: :json)
end end
it { expect(page.status_code).to eq(404) } it { expect(page.status_code).to eq(404) }
end end
end end
describe "GET /:project/builds/:id/status" do describe "GET /:project/jobs/:id/status" do
context "Build from project" do context "Job from project" do
before do before do
visit status_namespace_project_build_path(project.namespace, project, build) visit status_namespace_project_job_path(project.namespace, project, build)
end end
it { expect(page.status_code).to eq(200) } it { expect(page.status_code).to eq(200) }
end end
context "Build from other project" do context "Job from other project" do
before do before do
visit status_namespace_project_build_path(project.namespace, project, build2) visit status_namespace_project_job_path(project.namespace, project, build2)
end end
it { expect(page.status_code).to eq(404) } it { expect(page.status_code).to eq(404) }
......
...@@ -334,7 +334,7 @@ describe "Internal Project Access", feature: true do ...@@ -334,7 +334,7 @@ describe "Internal Project Access", feature: true do
end end
describe "GET /:project_path/builds" do describe "GET /:project_path/builds" do
subject { namespace_project_builds_path(project.namespace, project) } subject { namespace_project_jobs_path(project.namespace, project) }
context "when allowed for public and internal" do context "when allowed for public and internal" do
before { project.update(public_builds: true) } before { project.update(public_builds: true) }
...@@ -368,7 +368,7 @@ describe "Internal Project Access", feature: true do ...@@ -368,7 +368,7 @@ describe "Internal Project Access", feature: true do
describe "GET /:project_path/builds/:id" do describe "GET /:project_path/builds/:id" do
let(:pipeline) { create(:ci_pipeline, project: project) } let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) } let(:build) { create(:ci_build, pipeline: pipeline) }
subject { namespace_project_build_path(project.namespace, project, build.id) } subject { namespace_project_job_path(project.namespace, project, build.id) }
context "when allowed for public and internal" do context "when allowed for public and internal" do
before { project.update(public_builds: true) } before { project.update(public_builds: true) }
...@@ -402,7 +402,7 @@ describe "Internal Project Access", feature: true do ...@@ -402,7 +402,7 @@ describe "Internal Project Access", feature: true do
describe 'GET /:project_path/builds/:id/trace' do describe 'GET /:project_path/builds/:id/trace' do
let(:pipeline) { create(:ci_pipeline, project: project) } let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) } let(:build) { create(:ci_build, pipeline: pipeline) }
subject { trace_namespace_project_build_path(project.namespace, project, build.id) } subject { trace_namespace_project_job_path(project.namespace, project, build.id) }
context 'when allowed for public and internal' do context 'when allowed for public and internal' do
before do before do
......
...@@ -330,7 +330,7 @@ describe "Private Project Access", feature: true do ...@@ -330,7 +330,7 @@ describe "Private Project Access", feature: true do
end end
describe "GET /:project_path/builds" do describe "GET /:project_path/builds" do
subject { namespace_project_builds_path(project.namespace, project) } subject { namespace_project_jobs_path(project.namespace, project) }
it { is_expected.to be_allowed_for(:admin) } it { is_expected.to be_allowed_for(:admin) }
it { is_expected.to be_allowed_for(:owner).of(project) } it { is_expected.to be_allowed_for(:owner).of(project) }
...@@ -358,7 +358,7 @@ describe "Private Project Access", feature: true do ...@@ -358,7 +358,7 @@ describe "Private Project Access", feature: true do
describe "GET /:project_path/builds/:id" do describe "GET /:project_path/builds/:id" do
let(:pipeline) { create(:ci_pipeline, project: project) } let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) } let(:build) { create(:ci_build, pipeline: pipeline) }
subject { namespace_project_build_path(project.namespace, project, build.id) } subject { namespace_project_job_path(project.namespace, project, build.id) }
it { is_expected.to be_allowed_for(:admin) } it { is_expected.to be_allowed_for(:admin) }
it { is_expected.to be_allowed_for(:owner).of(project) } it { is_expected.to be_allowed_for(:owner).of(project) }
...@@ -391,7 +391,7 @@ describe "Private Project Access", feature: true do ...@@ -391,7 +391,7 @@ describe "Private Project Access", feature: true do
describe 'GET /:project_path/builds/:id/trace' do describe 'GET /:project_path/builds/:id/trace' do
let(:pipeline) { create(:ci_pipeline, project: project) } let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) } let(:build) { create(:ci_build, pipeline: pipeline) }
subject { trace_namespace_project_build_path(project.namespace, project, build.id) } subject { trace_namespace_project_job_path(project.namespace, project, build.id) }
it { is_expected.to be_allowed_for(:admin) } it { is_expected.to be_allowed_for(:admin) }
it { is_expected.to be_allowed_for(:owner).of(project) } it { is_expected.to be_allowed_for(:owner).of(project) }
......
...@@ -154,7 +154,7 @@ describe "Public Project Access", feature: true do ...@@ -154,7 +154,7 @@ describe "Public Project Access", feature: true do
end end
describe "GET /:project_path/builds" do describe "GET /:project_path/builds" do
subject { namespace_project_builds_path(project.namespace, project) } subject { namespace_project_jobs_path(project.namespace, project) }
context "when allowed for public" do context "when allowed for public" do
before { project.update(public_builds: true) } before { project.update(public_builds: true) }
...@@ -188,7 +188,7 @@ describe "Public Project Access", feature: true do ...@@ -188,7 +188,7 @@ describe "Public Project Access", feature: true do
describe "GET /:project_path/builds/:id" do describe "GET /:project_path/builds/:id" do
let(:pipeline) { create(:ci_pipeline, project: project) } let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) } let(:build) { create(:ci_build, pipeline: pipeline) }
subject { namespace_project_build_path(project.namespace, project, build.id) } subject { namespace_project_job_path(project.namespace, project, build.id) }
context "when allowed for public" do context "when allowed for public" do
before { project.update(public_builds: true) } before { project.update(public_builds: true) }
...@@ -222,7 +222,7 @@ describe "Public Project Access", feature: true do ...@@ -222,7 +222,7 @@ describe "Public Project Access", feature: true do
describe 'GET /:project_path/builds/:id/trace' do describe 'GET /:project_path/builds/:id/trace' do
let(:pipeline) { create(:ci_pipeline, project: project) } let(:pipeline) { create(:ci_pipeline, project: project) }
let(:build) { create(:ci_build, pipeline: pipeline) } let(:build) { create(:ci_build, pipeline: pipeline) }
subject { trace_namespace_project_build_path(project.namespace, project, build.id) } subject { trace_namespace_project_job_path(project.namespace, project, build.id) }
context 'when allowed for public' do context 'when allowed for public' do
before do before do
......
...@@ -8,7 +8,7 @@ import '~/breakpoints'; ...@@ -8,7 +8,7 @@ import '~/breakpoints';
import 'vendor/jquery.nicescroll'; import 'vendor/jquery.nicescroll';
describe('Build', () => { describe('Build', () => {
const BUILD_URL = `${gl.TEST_HOST}/frontend-fixtures/builds-project/builds/1`; const BUILD_URL = `${gl.TEST_HOST}/frontend-fixtures/builds-project/-/jobs/1`;
preloadFixtures('builds/build-with-artifacts.html.raw'); preloadFixtures('builds/build-with-artifacts.html.raw');
......
require 'spec_helper' require 'spec_helper'
describe Projects::BuildsController, '(JavaScript fixtures)', type: :controller do describe Projects::JobsController, '(JavaScript fixtures)', type: :controller do
include JavaScriptFixturesHelpers include JavaScriptFixturesHelpers
let(:admin) { create(:admin) } let(:admin) { create(:admin) }
......
...@@ -356,7 +356,7 @@ import '~/lib/utils/common_utils'; ...@@ -356,7 +356,7 @@ import '~/lib/utils/common_utils';
describe('gl.utils.setCiStatusFavicon', () => { describe('gl.utils.setCiStatusFavicon', () => {
it('should set page favicon to CI status favicon based on provided status', () => { it('should set page favicon to CI status favicon based on provided status', () => {
const BUILD_URL = `${gl.TEST_HOST}/frontend-fixtures/builds-project/builds/1/status.json`; const BUILD_URL = `${gl.TEST_HOST}/frontend-fixtures/builds-project/-/jobs/1/status.json`;
const FAVICON_PATH = '//icon_status_success'; const FAVICON_PATH = '//icon_status_success';
const spySetFavicon = spyOn(gl.utils, 'setFavicon').and.stub(); const spySetFavicon = spyOn(gl.utils, 'setFavicon').and.stub();
const spyResetFavicon = spyOn(gl.utils, 'resetFavicon').and.stub(); const spyResetFavicon = spyOn(gl.utils, 'resetFavicon').and.stub();
......
...@@ -31,7 +31,7 @@ describe Gitlab::Ci::Status::Build::Common do ...@@ -31,7 +31,7 @@ describe Gitlab::Ci::Status::Build::Common do
describe '#details_path' do describe '#details_path' do
it 'links to the build details page' do it 'links to the build details page' do
expect(subject.details_path).to include "builds/#{build.id}" expect(subject.details_path).to include "jobs/#{build.id}"
end end
end end
end end
require 'spec_helper' require 'spec_helper'
describe BuildActionEntity do describe BuildActionEntity do
let(:build) { create(:ci_build, name: 'test_build') } let(:job) { create(:ci_build, name: 'test_job') }
let(:request) { double('request') } let(:request) { double('request') }
let(:entity) do let(:entity) do
described_class.new(build, request: spy('request')) described_class.new(job, request: spy('request'))
end end
describe '#as_json' do describe '#as_json' do
subject { entity.as_json } subject { entity.as_json }
it 'contains original build name' do it 'contains original job name' do
expect(subject[:name]).to eq 'test_build' expect(subject[:name]).to eq 'test_job'
end end
it 'contains path to the action play' do it 'contains path to the action play' do
expect(subject[:path]).to include "builds/#{build.id}/play" expect(subject[:path]).to include "jobs/#{job.id}/play"
end end
it 'contains whether it is playable' do it 'contains whether it is playable' do
expect(subject[:playable]).to eq build.playable? expect(subject[:playable]).to eq job.playable?
end end
end end
end end
require 'spec_helper' require 'spec_helper'
describe BuildArtifactEntity do describe BuildArtifactEntity do
let(:build) { create(:ci_build, name: 'test:build') } let(:job) { create(:ci_build, name: 'test:job') }
let(:entity) do let(:entity) do
described_class.new(build, request: double) described_class.new(job, request: double)
end end
describe '#as_json' do describe '#as_json' do
subject { entity.as_json } subject { entity.as_json }
it 'contains build name' do it 'contains job name' do
expect(subject[:name]).to eq 'test:build' expect(subject[:name]).to eq 'test:job'
end end
it 'contains path to the artifacts' do it 'contains path to the artifacts' do
expect(subject[:path]) expect(subject[:path])
.to include "builds/#{build.id}/artifacts/download" .to include "jobs/#{job.id}/artifacts/download"
end end
end end
end end
...@@ -16,7 +16,7 @@ describe 'ci/status/_badge', :view do ...@@ -16,7 +16,7 @@ describe 'ci/status/_badge', :view do
end end
it 'has link to build details page' do it 'has link to build details page' do
details_path = namespace_project_build_path( details_path = namespace_project_job_path(
project.namespace, project, build) project.namespace, project, build)
render_status(build) render_status(build)
......
require 'spec_helper' require 'spec_helper'
describe 'projects/ci/builds/_build' do describe 'projects/ci/jobs/_build' do
include Devise::Test::ControllerHelpers include Devise::Test::ControllerHelpers
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
......
require 'spec_helper' require 'spec_helper'
describe 'projects/builds/show', :view do describe 'projects/jobs/show', :view do
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
let(:build) { create(:ci_build, pipeline: pipeline) } let(:build) { create(:ci_build, pipeline: pipeline) }
...@@ -278,7 +278,7 @@ describe 'projects/builds/show', :view do ...@@ -278,7 +278,7 @@ describe 'projects/builds/show', :view do
it 'links to issues/new with the title and description filled in' do it 'links to issues/new with the title and description filled in' do
title = "Build Failed ##{build.id}" title = "Build Failed ##{build.id}"
build_url = namespace_project_build_url(project.namespace, project, build) build_url = namespace_project_job_url(project.namespace, project, build)
href = new_namespace_project_issue_path( href = new_namespace_project_issue_path(
project.namespace, project.namespace,
project, project,
......
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