builds_controller.rb 2.64 KB
Newer Older
1
class Projects::BuildsController < Projects::ApplicationController
Kamil Trzcinski's avatar
Kamil Trzcinski committed
2
  before_action :build, except: [:index, :cancel_all]
3
  before_action :authorize_read_build!, except: [:cancel, :cancel_all, :retry, :play]
4
  before_action :authorize_update_build!, except: [:index, :show, :status, :raw, :trace]
5
  layout 'project'
6

Kamil Trzcinski's avatar
Kamil Trzcinski committed
7 8
  def index
    @scope = params[:scope]
9
    @all_builds = project.builds.relevant
10
    @builds = @all_builds.order('created_at DESC')
Kamil Trzcinski's avatar
Kamil Trzcinski committed
11 12
    @builds =
      case @scope
13 14
      when 'pending'
        @builds.pending.reverse_order
15
      when 'running'
16
        @builds.running.reverse_order
Kamil Trzcinski's avatar
Kamil Trzcinski committed
17
      when 'finished'
18
        @builds.finished
Kamil Trzcinski's avatar
Kamil Trzcinski committed
19
      else
20
        @builds
Kamil Trzcinski's avatar
Kamil Trzcinski committed
21
      end
22
    @builds = @builds.page(params[:page]).per(30)
Kamil Trzcinski's avatar
Kamil Trzcinski committed
23 24 25
  end

  def cancel_all
26
    @project.builds.running_or_pending.each(&:cancel)
Kamil Trzcinski's avatar
Kamil Trzcinski committed
27 28 29
    redirect_to namespace_project_builds_path(project.namespace, project)
  end

30
  def show
31
    @builds = @project.pipelines.find_by_sha(@build.sha).builds.order('id DESC')
Kamil Trzcinski's avatar
Kamil Trzcinski committed
32
    @builds = @builds.where("id not in (?)", @build.id)
33
    @pipeline = @build.pipeline
34 35
  end

36
  def trace
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
    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
53 54 55 56
      end
    end
  end

57
  def retry
Kamil Trzcinski's avatar
Kamil Trzcinski committed
58
    return render_404 unless @build.retryable?
59

60
    build = Ci::Build.retry(@build, current_user)
Kamil Trzcinski's avatar
Kamil Trzcinski committed
61
    redirect_to build_path(build)
62 63
  end

64
  def play
Kamil Trzcinski's avatar
Kamil Trzcinski committed
65
    return render_404 unless @build.playable?
66 67 68 69 70

    build = @build.play(current_user)
    redirect_to build_path(build)
  end

71 72 73 74 75
  def cancel
    @build.cancel
    redirect_to build_path(@build)
  end

76
  def status
77 78
    render json: BuildSerializer
      .new(project: @project, user: @current_user)
Shinya Maeda's avatar
Shinya Maeda committed
79
      .represent_status(@build)
80
  end
81

82
  def erase
83
    @build.erase(erased_by: current_user)
84
    redirect_to namespace_project_build_path(project.namespace, project, @build),
85
                notice: "Build has been successfully erased!"
86 87
  end

88
  def raw
89 90 91 92 93 94
    build.trace.read do |stream|
      if stream.file?
        send_file stream.path, type: 'text/plain; charset=utf-8', disposition: 'inline'
      else
        render_404
      end
95 96 97
    end
  end

98 99 100
  private

  def build
101
    @build ||= project.builds.find_by!(id: params[:id]).present(current_user: current_user)
102
  end
103 104

  def build_path(build)
105
    namespace_project_build_path(build.project.namespace, build.project, build)
106
  end
107
end