/app/controllers/projects/jobs_controller.rb

https://gitlab.com/Ben305/gitlab-ce · Ruby · 147 lines · 121 code · 26 blank · 0 comment · 4 complexity · c04feea8eddae537be35b045d113b687 MD5 · raw file

  1. class Projects::JobsController < Projects::ApplicationController
  2. before_action :build, except: [:index, :cancel_all]
  3. before_action :authorize_read_build!,
  4. only: [:index, :show, :status, :raw, :trace]
  5. before_action :authorize_update_build!,
  6. except: [:index, :show, :status, :raw, :trace, :cancel_all, :erase]
  7. before_action :authorize_erase_build!, only: [:erase]
  8. layout 'project'
  9. def index
  10. @scope = params[:scope]
  11. @all_builds = project.builds.relevant
  12. @builds = @all_builds.order('ci_builds.id DESC')
  13. @builds =
  14. case @scope
  15. when 'pending'
  16. @builds.pending.reverse_order
  17. when 'running'
  18. @builds.running.reverse_order
  19. when 'finished'
  20. @builds.finished
  21. else
  22. @builds
  23. end
  24. @builds = @builds.includes([
  25. { pipeline: :project },
  26. :project,
  27. :tags
  28. ])
  29. @builds = @builds.page(params[:page]).per(30)
  30. end
  31. def cancel_all
  32. return access_denied! unless can?(current_user, :update_build, project)
  33. @project.builds.running_or_pending.each do |build|
  34. build.cancel if can?(current_user, :update_build, build)
  35. end
  36. redirect_to project_jobs_path(project)
  37. end
  38. def show
  39. @builds = @project.pipelines.find_by_sha(@build.sha).builds.order('id DESC')
  40. @builds = @builds.where("id not in (?)", @build.id)
  41. @pipeline = @build.pipeline
  42. respond_to do |format|
  43. format.html
  44. format.json do
  45. Gitlab::PollingInterval.set_header(response, interval: 10_000)
  46. render json: BuildSerializer
  47. .new(project: @project, current_user: @current_user)
  48. .represent(@build, {}, BuildDetailsEntity)
  49. end
  50. end
  51. end
  52. def trace
  53. build.trace.read do |stream|
  54. respond_to do |format|
  55. format.json do
  56. result = {
  57. id: @build.id, status: @build.status, complete: @build.complete?
  58. }
  59. if stream.valid?
  60. stream.limit
  61. state = params[:state].presence
  62. trace = stream.html_with_state(state)
  63. result.merge!(trace.to_h)
  64. end
  65. render json: result
  66. end
  67. end
  68. end
  69. end
  70. def retry
  71. return respond_422 unless @build.retryable?
  72. build = Ci::Build.retry(@build, current_user)
  73. redirect_to build_path(build)
  74. end
  75. def play
  76. return respond_422 unless @build.playable?
  77. build = @build.play(current_user)
  78. redirect_to build_path(build)
  79. end
  80. def cancel
  81. return respond_422 unless @build.cancelable?
  82. @build.cancel
  83. redirect_to build_path(@build)
  84. end
  85. def status
  86. render json: BuildSerializer
  87. .new(project: @project, current_user: @current_user)
  88. .represent_status(@build)
  89. end
  90. def erase
  91. if @build.erase(erased_by: current_user)
  92. redirect_to project_job_path(project, @build),
  93. notice: "Job has been successfully erased!"
  94. else
  95. respond_422
  96. end
  97. end
  98. def raw
  99. build.trace.read do |stream|
  100. if stream.file?
  101. send_file stream.path, type: 'text/plain; charset=utf-8', disposition: 'inline'
  102. else
  103. render_404
  104. end
  105. end
  106. end
  107. private
  108. def authorize_update_build!
  109. return access_denied! unless can?(current_user, :update_build, build)
  110. end
  111. def authorize_erase_build!
  112. return access_denied! unless can?(current_user, :erase_build, build)
  113. end
  114. def build
  115. @build ||= project.builds.find(params[:id])
  116. .present(current_user: current_user)
  117. end
  118. def build_path(build)
  119. project_job_path(build.project, build)
  120. end
  121. end