/ee/db/fixtures/development/90_productivity_analytics.rb

https://gitlab.com/klml/gitlab-ee · Ruby · 157 lines · 127 code · 25 blank · 5 comment · 5 complexity · b08fab201c5cb64d7bc79229d55fbc83 MD5 · raw file

  1. # frozen_string_literal: true
  2. require './spec/support/sidekiq_middleware'
  3. class Gitlab::Seeder::ProductivityAnalytics
  4. def initialize(project)
  5. @project = project
  6. @user = User.admins.first
  7. @issue_count = 100
  8. end
  9. def seed!
  10. Sidekiq::Worker.skipping_transaction_check do
  11. Sidekiq::Testing.inline! do
  12. Timecop.travel 90.days.ago
  13. issues = create_issues
  14. print '.'
  15. Timecop.travel 10.days.from_now
  16. add_milestones_and_list_labels(issues)
  17. print '.'
  18. Timecop.travel 10.days.from_now
  19. branches = mention_in_commits(issues)
  20. print '.'
  21. Timecop.travel 10.days.from_now
  22. merge_requests = create_merge_requests_closing_issues(issues, branches)
  23. print '.'
  24. Timecop.travel 10.days.from_now
  25. create_notes(merge_requests)
  26. Timecop.travel 10.days.from_now
  27. merge_merge_requests(merge_requests)
  28. print '.'
  29. end
  30. end
  31. print '.'
  32. end
  33. private
  34. def create_issues
  35. Array.new(@issue_count) do
  36. issue_params = {
  37. title: "Productivity Analytics: #{FFaker::Lorem.sentence(6)}",
  38. description: FFaker::Lorem.sentence,
  39. state: 'opened',
  40. assignees: [@project.team.users.sample]
  41. }
  42. Timecop.travel rand(10).days.from_now do
  43. Issues::CreateService.new(project: @project, current_user: @project.team.users.sample, params: issue_params).execute
  44. end
  45. end
  46. end
  47. def add_milestones_and_list_labels(issues)
  48. issues.shuffle.map.with_index do |issue, index|
  49. Timecop.travel 12.hours.from_now do
  50. if index.even?
  51. issue.update(milestone: @project.milestones.sample)
  52. else
  53. label_name = "#{FFaker::Product.brand}-#{FFaker::Product.brand}-#{rand(1000)}"
  54. list_label = FactoryBot.create(:label, title: label_name, project: issue.project)
  55. FactoryBot.create(:list, board: FactoryBot.create(:board, project: issue.project), label: list_label)
  56. issue.update(labels: [list_label])
  57. end
  58. issue
  59. end
  60. end
  61. end
  62. def mention_in_commits(issues)
  63. issues.map do |issue|
  64. branch_name = filename = "#{FFaker::Product.brand}-#{FFaker::Product.brand}-#{rand(1000)}"
  65. Timecop.travel 12.hours.from_now do
  66. issue.project.repository.add_branch(@user, branch_name, 'master')
  67. commit_sha = issue.project.repository.create_file(@user, filename, "content", message: "Commit for #{issue.to_reference}", branch_name: branch_name)
  68. issue.project.repository.commit(commit_sha)
  69. ::Git::BranchPushService.new(
  70. issue.project,
  71. @user,
  72. change: {
  73. oldrev: issue.project.repository.commit("master").sha,
  74. newrev: commit_sha,
  75. ref: 'refs/heads/master'
  76. }
  77. ).execute
  78. end
  79. branch_name
  80. end
  81. end
  82. def create_merge_requests_closing_issues(issues, branches)
  83. issues.zip(branches).map do |issue, branch|
  84. opts = {
  85. title: 'Productivity Analytics merge_request',
  86. description: "Fixes #{issue.to_reference}",
  87. source_branch: branch,
  88. target_branch: 'master'
  89. }
  90. Timecop.travel issue.created_at do
  91. MergeRequests::CreateService.new(project: issue.project, current_user: @user, params: opts).execute
  92. end
  93. end
  94. end
  95. def create_notes(merge_requests)
  96. merge_requests.each do |merge_request|
  97. Timecop.travel merge_request.created_at + rand(5).days do
  98. Note.create!(
  99. author: @user,
  100. project: merge_request.project,
  101. noteable: merge_request,
  102. note: FFaker::Lorem.sentence(rand(5))
  103. )
  104. end
  105. end
  106. end
  107. def merge_merge_requests(merge_requests)
  108. merge_requests.each do |merge_request|
  109. Timecop.travel rand(15).days.from_now do
  110. MergeRequests::MergeService.new(merge_request.project, @user).execute(merge_request)
  111. end
  112. end
  113. end
  114. end
  115. Gitlab::Seeder.quiet do
  116. flag = 'SEED_PRODUCTIVITY_ANALYTICS'
  117. if ENV[flag]
  118. Project.find_each do |project|
  119. # This seed naively assumes that every project has a repository, and every
  120. # repository has a `master` branch, which may be the case for a pristine
  121. # GDK seed, but is almost never true for a GDK that's actually had
  122. # development performed on it.
  123. next unless project.repository_exists? && project.repository.commit('master')
  124. seeder = Gitlab::Seeder::ProductivityAnalytics.new(project)
  125. seeder.seed!
  126. puts "Productivity analytics seeded for project #{project.full_path}"
  127. break
  128. end
  129. else
  130. puts "Skipped. Use the `#{flag}` environment variable to enable."
  131. end
  132. end