builds_controller.rb 2.3 KB
Newer Older
1 2
class Projects::BuildsController < Projects::ApplicationController
  before_action :ci_project
K
Kamil Trzcinski 已提交
3
  before_action :build, except: [:index, :cancel_all]
4

K
Kamil Trzcinski 已提交
5
  before_action :authorize_manage_builds!, except: [:index, :show, :status]
K
Kamil Trzcinski 已提交
6
  before_action :authorize_download_build_artifacts!, only: [:download]
7

8 9
  layout "project"

K
Kamil Trzcinski 已提交
10 11
  def index
    @scope = params[:scope]
K
Kamil Trzcinski 已提交
12
    @all_builds = project.ci_builds
K
Kamil Trzcinski 已提交
13
    @builds = @all_builds.order('created_at DESC')
K
Kamil Trzcinski 已提交
14 15
    @builds =
      case @scope
K
Kamil Trzcinski 已提交
16
      when 'all'
K
Kamil Trzcinski 已提交
17
        @builds
K
Kamil Trzcinski 已提交
18
      when 'finished'
K
Kamil Trzcinski 已提交
19
        @builds.finished
K
Kamil Trzcinski 已提交
20
      else
K
Kamil Trzcinski 已提交
21
        @builds.running_or_pending.reverse_order
K
Kamil Trzcinski 已提交
22
      end
K
Kamil Trzcinski 已提交
23
    @builds = @builds.page(params[:page]).per(30)
K
Kamil Trzcinski 已提交
24 25 26 27 28 29 30 31
  end

  def cancel_all
    @project.ci_builds.running_or_pending.each(&:cancel)

    redirect_to namespace_project_builds_path(project.namespace, project)
  end

32 33
  def show
    @builds = @ci_project.commits.find_by_sha(@build.sha).builds.order('id DESC')
K
Kamil Trzcinski 已提交
34
    @builds = @builds.where("id not in (?)", @build.id)
35 36 37 38 39 40 41 42 43 44
    @commit = @build.commit

    respond_to do |format|
      format.html
      format.json do
        render json: @build.to_json(methods: :trace_html)
      end
    end
  end

45
  def retry
K
Kamil Trzcinski 已提交
46
    unless @build.retryable?
47 48 49 50 51
      return page_404
    end

    build = Ci::Build.retry(@build)

K
Kamil Trzcinski 已提交
52
    redirect_to build_path(build)
53 54
  end

K
Kamil Trzcinski 已提交
55 56 57 58 59 60 61 62 63 64 65 66
  def download
    unless artifacts_file.file_storage?
      return redirect_to artifacts_file.url
    end

    unless artifacts_file.exists?
      return not_found!
    end

    send_file artifacts_file.path, disposition: 'attachment'
  end

67 68 69 70 71 72 73 74 75 76
  def status
    render json: @build.to_json(only: [:status, :id, :sha, :coverage], methods: :sha)
  end

  def cancel
    @build.cancel

    redirect_to build_path(@build)
  end

77 78 79
  private

  def build
80
    @build ||= ci_project.builds.unscoped.find_by!(id: params[:id])
81
  end
82

K
Kamil Trzcinski 已提交
83 84 85 86
  def artifacts_file
    build.artifacts_file
  end

87 88 89
  def build_path(build)
    namespace_project_build_path(build.gl_project.namespace, build.gl_project, build)
  end
K
Kamil Trzcinski 已提交
90 91 92 93 94 95

  def authorize_manage_builds!
    unless can?(current_user, :manage_builds, project)
      return page_404
    end
  end
K
Kamil Trzcinski 已提交
96 97 98 99 100 101 102 103 104 105

  def authorize_download_build_artifacts!
    unless can?(current_user, :download_build_artifacts, @project)
      if current_user.nil?
        return authenticate_user!
      else
        return render_404
      end
    end
  end
106
end