check.rake 20.4 KB
Newer Older
1
namespace :gitlab do
R
Riyad Preukschas 已提交
2 3
  desc "GITLAB | Check the configuration of GitLab and its environment"
  task check: %w{gitlab:env:check
4
                 gitlab:gitlab_shell:check
R
Riyad Preukschas 已提交
5
                 gitlab:sidekiq:check
R
Riyad Preukschas 已提交
6 7 8
                 gitlab:app:check}


R
Riyad Preukschas 已提交
9

10
  namespace :app do
R
Riyad Preukschas 已提交
11 12
    desc "GITLAB | Check the configuration of the GitLab Rails app"
    task check: :environment  do
R
Riyad Preukschas 已提交
13 14 15 16 17 18 19 20 21 22 23 24
      warn_user_is_not_gitlab
      start_checking "GitLab"

      check_database_config_exists
      check_database_is_not_sqlite
      check_migrations_are_up
      check_gitlab_config_exists
      check_gitlab_config_not_outdated
      check_log_writable
      check_tmp_writable
      check_init_script_exists
      check_init_script_up_to_date
H
Hiroyuki Sato 已提交
25
      check_projects_have_namespace
R
Riyad Preukschas 已提交
26
      check_satellites_exist
27
      check_redis_version
28
      check_git_version
R
Riyad Preukschas 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

      finished_checking "GitLab"
    end


    # Checks
    ########################

    def check_database_config_exists
      print "Database config exists? ... "

      database_config_file = Rails.root.join("config", "database.yml")

      if File.exists?(database_config_file)
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
          "Copy config/database.yml.<your db> to config/database.yml",
          "Check that the information in config/database.yml is correct"
        )
        for_more_information(
          see_database_guide,
          "http://guides.rubyonrails.org/getting_started.html#configuring-a-database"
        )
R
Riyad Preukschas 已提交
54
        fix_and_rerun
R
Riyad Preukschas 已提交
55 56 57 58
      end
    end

    def check_database_is_not_sqlite
R
Riyad Preukschas 已提交
59
      print "Database is SQLite ... "
R
Riyad Preukschas 已提交
60 61 62

      database_config_file = Rails.root.join("config", "database.yml")

63
      unless File.read(database_config_file) =~ /adapter:\s+sqlite/
R
Riyad Preukschas 已提交
64
        puts "no".green
R
Riyad Preukschas 已提交
65
      else
R
Riyad Preukschas 已提交
66
        puts "yes".red
R
Riyad Preukschas 已提交
67 68 69 70
        for_more_information(
          "https://github.com/gitlabhq/gitlabhq/wiki/Migrate-from-SQLite-to-MySQL",
          see_database_guide
        )
R
Riyad Preukschas 已提交
71
        fix_and_rerun
R
Riyad Preukschas 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
      end
    end

    def check_gitlab_config_exists
      print "GitLab config exists? ... "

      gitlab_config_file = Rails.root.join("config", "gitlab.yml")

      if File.exists?(gitlab_config_file)
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
          "Copy config/gitlab.yml.example to config/gitlab.yml",
          "Update config/gitlab.yml to match your setup"
        )
        for_more_information(
          see_installation_guide_section "GitLab"
        )
R
Riyad Preukschas 已提交
91
        fix_and_rerun
R
Riyad Preukschas 已提交
92 93 94 95
      end
    end

    def check_gitlab_config_not_outdated
R
Riyad Preukschas 已提交
96
      print "GitLab config outdated? ... "
R
Riyad Preukschas 已提交
97 98 99 100 101 102 103

      gitlab_config_file = Rails.root.join("config", "gitlab.yml")
      unless File.exists?(gitlab_config_file)
        puts "can't check because of previous errors".magenta
      end

      # omniauth or ldap could have been deleted from the file
104
      unless Gitlab.config['git_host']
R
Riyad Preukschas 已提交
105
        puts "no".green
R
Riyad Preukschas 已提交
106
      else
R
Riyad Preukschas 已提交
107
        puts "yes".red
R
Riyad Preukschas 已提交
108
        try_fixing_it(
R
Riyad Preukschas 已提交
109
          "Backup your config/gitlab.yml",
R
Riyad Preukschas 已提交
110 111 112 113 114 115
          "Copy config/gitlab.yml.example to config/gitlab.yml",
          "Update config/gitlab.yml to match your setup"
        )
        for_more_information(
          see_installation_guide_section "GitLab"
        )
R
Riyad Preukschas 已提交
116
        fix_and_rerun
R
Riyad Preukschas 已提交
117 118
      end
    end
119

R
Riyad Preukschas 已提交
120 121 122 123 124 125 126
    def check_init_script_exists
      print "Init script exists? ... "

      script_path = "/etc/init.d/gitlab"

      if File.exists?(script_path)
        puts "yes".green
N
Nihad Abbasov 已提交
127
      else
R
Riyad Preukschas 已提交
128 129 130 131 132 133 134
        puts "no".red
        try_fixing_it(
          "Install the init script"
        )
        for_more_information(
          see_installation_guide_section "Install Init Script"
        )
R
Riyad Preukschas 已提交
135
        fix_and_rerun
R
Riyad Preukschas 已提交
136 137 138 139 140 141
      end
    end

    def check_init_script_up_to_date
      print "Init script up-to-date? ... "

142
      recipe_path = Rails.root.join("lib/support/init.d/", "gitlab")
R
Riyad Preukschas 已提交
143
      script_path = "/etc/init.d/gitlab"
144

R
Riyad Preukschas 已提交
145 146
      unless File.exists?(script_path)
        puts "can't check because of previous errors".magenta
147 148 149
        return
      end

150
      recipe_content = File.read(recipe_path)
R
Riyad Preukschas 已提交
151 152 153 154 155 156 157 158 159 160 161 162
      script_content = File.read(script_path)

      if recipe_content == script_content
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
          "Redownload the init script"
        )
        for_more_information(
          see_installation_guide_section "Install Init Script"
        )
R
Riyad Preukschas 已提交
163
        fix_and_rerun
R
Riyad Preukschas 已提交
164 165 166 167 168 169 170 171 172 173
      end
    end

    def check_migrations_are_up
      print "All migrations up? ... "

      migration_status =  `bundle exec rake db:migrate:status`

      unless migration_status =~ /down\s+\d{14}/
        puts "yes".green
174
      else
R
Riyad Preukschas 已提交
175 176
        puts "no".red
        try_fixing_it(
177
          sudo_gitlab("bundle exec rake db:migrate RAILS_ENV=production")
R
Riyad Preukschas 已提交
178
        )
R
Riyad Preukschas 已提交
179
        fix_and_rerun
R
Riyad Preukschas 已提交
180 181 182 183 184 185 186 187
      end
    end

    def check_satellites_exist
      print "Projects have satellites? ... "

      unless Project.count > 0
        puts "can't check, you have no projects".magenta
188 189
        return
      end
R
Riyad Preukschas 已提交
190 191 192
      puts ""

      Project.find_each(batch_size: 100) do |project|
193
        print "#{project.name_with_namespace.yellow} ... "
R
Riyad Preukschas 已提交
194 195 196

        if project.satellite.exists?
          puts "yes".green
197 198
        elsif project.empty_repo?
          puts "can't create, repository is empty".magenta
R
Riyad Preukschas 已提交
199 200 201
        else
          puts "no".red
          try_fixing_it(
202
            sudo_gitlab("bundle exec rake gitlab:satellites:create RAILS_ENV=production"),
203 204
            "If necessary, remove the tmp/repo_satellites directory ...",
            "... and rerun the above command"
R
Riyad Preukschas 已提交
205 206 207 208
          )
          for_more_information(
            "doc/raketasks/maintenance.md "
          )
R
Riyad Preukschas 已提交
209
          fix_and_rerun
R
Riyad Preukschas 已提交
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
        end
      end
    end

    def check_log_writable
      print "Log directory writable? ... "

      log_path = Rails.root.join("log")

      if File.writable?(log_path)
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
          "sudo chown -R gitlab #{log_path}",
B
bassrock 已提交
225
          "sudo chmod -R u+rwX #{log_path}"
R
Riyad Preukschas 已提交
226 227 228 229
        )
        for_more_information(
          see_installation_guide_section "GitLab"
        )
R
Riyad Preukschas 已提交
230
        fix_and_rerun
R
Riyad Preukschas 已提交
231 232 233 234 235 236 237 238 239 240 241 242 243 244
      end
    end

    def check_tmp_writable
      print "Tmp directory writable? ... "

      tmp_path = Rails.root.join("tmp")

      if File.writable?(tmp_path)
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
          "sudo chown -R gitlab #{tmp_path}",
B
bassrock 已提交
245
          "sudo chmod -R u+rwX #{tmp_path}"
R
Riyad Preukschas 已提交
246 247 248 249
        )
        for_more_information(
          see_installation_guide_section "GitLab"
        )
R
Riyad Preukschas 已提交
250
        fix_and_rerun
R
Riyad Preukschas 已提交
251
      end
R
Riyad Preukschas 已提交
252
    end
253

254
    def check_redis_version
255 256
      print "Redis version >= 2.0.0? ... "

257 258
      if run_and_match("redis-cli --version", /redis-cli 2.\d.\d/)
        puts "yes".green
259
      else
260 261
        puts "no".red
        try_fixing_it(
262
          "Update your redis server to a version >= 2.0.0"
263 264 265 266 267 268
        )
        for_more_information(
          "gitlab-public-wiki/wiki/Trouble-Shooting-Guide in section sidekiq"
        )
        fix_and_rerun
      end
269
    end
R
Riyad Preukschas 已提交
270 271
  end

R
Riyad Preukschas 已提交
272 273


R
Riyad Preukschas 已提交
274 275 276
  namespace :env do
    desc "GITLAB | Check the configuration of the environment"
    task check: :environment  do
R
Riyad Preukschas 已提交
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
      warn_user_is_not_gitlab
      start_checking "Environment"

      check_gitlab_git_config
      check_python2_exists
      check_python2_version

      finished_checking "Environment"
    end


    # Checks
    ########################

    def check_gitlab_git_config
292
      print "Git configured for #{gitlab_user} user? ... "
R
Riyad Preukschas 已提交
293 294 295

      options = {
        "user.name"  => "GitLab",
296
        "user.email" => Gitlab.config.gitlab.email_from
R
Riyad Preukschas 已提交
297 298 299 300 301 302 303 304 305 306
      }
      correct_options = options.map do |name, value|
        run("git config --global --get #{name}").try(:squish) == value
      end

      if correct_options.all?
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
307 308
          sudo_gitlab("git config --global user.name  \"#{options["user.name"]}\""),
          sudo_gitlab("git config --global user.email \"#{options["user.email"]}\"")
R
Riyad Preukschas 已提交
309 310 311 312
        )
        for_more_information(
          see_installation_guide_section "GitLab"
        )
R
Riyad Preukschas 已提交
313
        fix_and_rerun
R
Riyad Preukschas 已提交
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
      end
    end

    def check_python2_exists
      print "Has python2? ... "

      # Python prints its version to STDERR
      # so we can't just use run("python2 --version")
      if run_and_match("which python2", /python2$/)
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
          "Make sure you have Python 2.5+ installed",
          "Link it to python2"
        )
        for_more_information(
          see_installation_guide_section "Packages / Dependencies"
        )
R
Riyad Preukschas 已提交
333
        fix_and_rerun
R
Riyad Preukschas 已提交
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
      end
    end

    def check_python2_version
      print "python2 is supported version? ... "

      # Python prints its version to STDERR
      # so we can't just use run("python2 --version")

      unless run_and_match("which python2", /python2$/)
        puts "can't check because of previous errors".magenta
        return
      end

      if `python2 --version 2>&1` =~ /2\.[567]\.\d/
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
          "Make sure you have Python 2.5+ installed",
          "Link it to python2"
        )
        for_more_information(
          see_installation_guide_section "Packages / Dependencies"
        )
R
Riyad Preukschas 已提交
359
        fix_and_rerun
R
Riyad Preukschas 已提交
360
      end
R
Riyad Preukschas 已提交
361 362 363
    end
  end

R
Riyad Preukschas 已提交
364 365


366
  namespace :gitlab_shell do
B
Ben Bodenmiller 已提交
367
    desc "GITLAB | Check the configuration of GitLab Shell"
R
Riyad Preukschas 已提交
368
    task check: :environment  do
R
Riyad Preukschas 已提交
369
      warn_user_is_not_gitlab
B
Ben Bodenmiller 已提交
370
      start_checking "GitLab Shell"
R
Riyad Preukschas 已提交
371

372
      check_gitlab_shell
R
Riyad Preukschas 已提交
373
      check_repo_base_exists
374
      check_repo_base_is_not_symlink
R
Riyad Preukschas 已提交
375 376
      check_repo_base_user_and_group
      check_repo_base_permissions
377 378
      check_update_hook_is_up_to_date
      check_repos_update_hooks_is_link
379
      check_gitlab_shell_self_test
R
Riyad Preukschas 已提交
380

B
Ben Bodenmiller 已提交
381
      finished_checking "GitLab Shell"
R
Riyad Preukschas 已提交
382 383 384 385 386 387 388
    end


    # Checks
    ########################


389 390
    def check_update_hook_is_up_to_date
      print "update hook up-to-date? ... "
R
Riyad Preukschas 已提交
391

392
      hook_file = "update"
393
      gitlab_shell_hooks_path = Gitlab.config.gitlab_shell.hooks_path
394
      gitlab_shell_hook_file  = File.join(gitlab_shell_hooks_path, hook_file)
R
Riyad Preukschas 已提交
395

396 397 398 399 400 401 402 403 404 405 406 407
      if File.exists?(gitlab_shell_hook_file)
        puts "yes".green
      else
        puts "no".red
        puts "Could not find #{gitlab_shell_hook_file}"
        try_fixing_it(
          'Check the hooks_path in config/gitlab.yml',
          'Check your gitlab-shell installation'
        )
        for_more_information(
          see_installation_guide_section "GitLab Shell"
        )
408
      end
R
Riyad Preukschas 已提交
409 410 411 412 413
    end

    def check_repo_base_exists
      print "Repo base directory exists? ... "

414
      repo_base_path = Gitlab.config.gitlab_shell.repos_path
R
Riyad Preukschas 已提交
415 416 417 418 419 420 421

      if File.exists?(repo_base_path)
        puts "yes".green
      else
        puts "no".red
        puts "#{repo_base_path} is missing".red
        try_fixing_it(
B
Ben Bodenmiller 已提交
422
          "This should have been created when setting up GitLab Shell.",
R
Riyad Preukschas 已提交
423
          "Make sure it's set correctly in config/gitlab.yml",
B
Ben Bodenmiller 已提交
424
          "Make sure GitLab Shell is installed correctly."
R
Riyad Preukschas 已提交
425 426
        )
        for_more_information(
B
Ben Bodenmiller 已提交
427
          see_installation_guide_section "GitLab Shell"
R
Riyad Preukschas 已提交
428
        )
R
Riyad Preukschas 已提交
429
        fix_and_rerun
R
Riyad Preukschas 已提交
430 431 432
      end
    end

433 434 435
    def check_repo_base_is_not_symlink
      print "Repo base directory is a symlink? ... "

436
      repo_base_path = Gitlab.config.gitlab_shell.repos_path
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
      unless File.exists?(repo_base_path)
        puts "can't check because of previous errors".magenta
        return
      end

      unless File.symlink?(repo_base_path)
        puts "no".green
      else
        puts "yes".red
        try_fixing_it(
          "Make sure it's set to the real directory in config/gitlab.yml"
        )
        fix_and_rerun
      end
    end

R
Riyad Preukschas 已提交
453
    def check_repo_base_permissions
454
      print "Repo base access is drwxrws---? ... "
R
Riyad Preukschas 已提交
455

456
      repo_base_path = Gitlab.config.gitlab_shell.repos_path
R
Riyad Preukschas 已提交
457 458
      unless File.exists?(repo_base_path)
        puts "can't check because of previous errors".magenta
459 460 461
        return
      end

462
      if File.stat(repo_base_path).mode.to_s(8).ends_with?("2770")
R
Riyad Preukschas 已提交
463 464 465 466
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
467
          "sudo chmod -R ug+rwX,o-rwx #{repo_base_path}",
468
          "sudo chmod -R ug-s #{repo_base_path}",
469
          "find #{repo_base_path} -type d -print0 | sudo xargs -0 chmod g+s"
R
Riyad Preukschas 已提交
470 471
        )
        for_more_information(
B
Ben Bodenmiller 已提交
472
          see_installation_guide_section "GitLab Shell"
R
Riyad Preukschas 已提交
473
        )
R
Riyad Preukschas 已提交
474
        fix_and_rerun
R
Riyad Preukschas 已提交
475 476 477 478
      end
    end

    def check_repo_base_user_and_group
479 480 481
      gitlab_shell_ssh_user = Gitlab.config.gitlab_shell.ssh_user
      gitlab_shell_owner_group = Gitlab.config.gitlab_shell.owner_group
      print "Repo base owned by #{gitlab_shell_ssh_user}:#{gitlab_shell_owner_group}? ... "
R
Riyad Preukschas 已提交
482

483
      repo_base_path = Gitlab.config.gitlab_shell.repos_path
R
Riyad Preukschas 已提交
484 485
      unless File.exists?(repo_base_path)
        puts "can't check because of previous errors".magenta
486 487 488
        return
      end

489 490 491
      uid = uid_for(gitlab_shell_ssh_user)
      gid = gid_for(gitlab_shell_owner_group)
      if File.stat(repo_base_path).uid == uid && File.stat(repo_base_path).gid == gid
R
Riyad Preukschas 已提交
492
        puts "yes".green
493
      else
R
Riyad Preukschas 已提交
494
        puts "no".red
495
        puts "  User id for #{gitlab_shell_ssh_user}: #{uid}. Groupd id for #{gitlab_shell_owner_group}: #{gid}".blue
R
Riyad Preukschas 已提交
496
        try_fixing_it(
497
          "sudo chown -R #{gitlab_shell_ssh_user}:#{gitlab_shell_owner_group} #{repo_base_path}"
R
Riyad Preukschas 已提交
498 499
        )
        for_more_information(
B
Ben Bodenmiller 已提交
500
          see_installation_guide_section "GitLab Shell"
R
Riyad Preukschas 已提交
501
        )
R
Riyad Preukschas 已提交
502
        fix_and_rerun
R
Riyad Preukschas 已提交
503 504 505
      end
    end

506 507
    def check_repos_update_hooks_is_link
      print "update hooks in repos are links: ... "
R
Riyad Preukschas 已提交
508

509
      hook_file = "update"
510
      gitlab_shell_hooks_path = Gitlab.config.gitlab_shell.hooks_path
511 512
      gitlab_shell_hook_file  = File.join(gitlab_shell_hooks_path, hook_file)
      gitlab_shell_ssh_user = Gitlab.config.gitlab_shell.ssh_user
R
Riyad Preukschas 已提交
513

514
      unless File.exists?(gitlab_shell_hook_file)
R
Riyad Preukschas 已提交
515 516 517
        puts "can't check because of previous errors".magenta
        return
      end
518

R
Riyad Preukschas 已提交
519 520 521 522 523
      unless Project.count > 0
        puts "can't check, you have no projects".magenta
        return
      end
      puts ""
524

R
Riyad Preukschas 已提交
525
      Project.find_each(batch_size: 100) do |project|
526
        print "#{project.name_with_namespace.yellow} ... "
527

R
Riyad Preukschas 已提交
528 529
        if project.empty_repo?
          puts "repository is empty".magenta
R
Riyad Preukschas 已提交
530
        else
R
Riyad Preukschas 已提交
531 532 533 534 535
          project_hook_file = File.join(project.repository.path_to_repo, "hooks", hook_file)

          unless File.exists?(project_hook_file)
            puts "missing".red
            try_fixing_it(
536
              "sudo -u #{gitlab_shell_ssh_user} ln -sf #{gitlab_shell_hook_file} #{project_hook_file}"
R
Riyad Preukschas 已提交
537 538
            )
            for_more_information(
M
Martin Bastien 已提交
539
              "#{gitlab_shell_user_home}/gitlab-shell/support/rewrite-hooks.sh"
R
Riyad Preukschas 已提交
540 541 542 543 544 545
            )
            fix_and_rerun
            next
          end

          if File.lstat(project_hook_file).symlink? &&
546
              File.realpath(project_hook_file) == File.realpath(gitlab_shell_hook_file)
R
Riyad Preukschas 已提交
547 548
            puts "ok".green
          else
B
Ben Bodenmiller 已提交
549
            puts "not a link to GitLab Shell's hook".red
R
Riyad Preukschas 已提交
550
            try_fixing_it(
551
              "sudo -u #{gitlab_shell_ssh_user} ln -sf #{gitlab_shell_hook_file} #{project_hook_file}"
R
Riyad Preukschas 已提交
552 553 554 555 556 557
            )
            for_more_information(
              "lib/support/rewrite-hooks.sh"
            )
            fix_and_rerun
          end
558 559
        end
      end
R
Riyad Preukschas 已提交
560
    end
R
Riyad Preukschas 已提交
561

562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578
    def check_gitlab_shell_self_test
      gitlab_shell_repo_base = File.expand_path('gitlab-shell', gitlab_shell_user_home)
      check_cmd = File.expand_path('bin/check', gitlab_shell_repo_base)
      puts "Running #{check_cmd}"
      if system(check_cmd, chdir: gitlab_shell_repo_base)
        puts 'gitlab-shell self-check successful'.green
      else
        puts 'gitlab-shell self-check failed'.red
        try_fixing_it(
          'Make sure GitLab is running;',
          'Check the gitlab-shell configuration file:',
          sudo_gitlab("editor #{File.expand_path('config.yml', gitlab_shell_repo_base)}")
        )
        fix_and_rerun
      end
    end

H
Hiroyuki Sato 已提交
579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
    def check_projects_have_namespace
      print "projects have namespace: ... "

      unless Project.count > 0
        puts "can't check, you have no projects".magenta
        return
      end
      puts ""

      Project.find_each(batch_size: 100) do |project|
        print "#{project.name_with_namespace.yellow} ... "

        if project.namespace
          puts "yes".green
        else
          puts "no".red
          try_fixing_it(
            "Migrate global projects"
          )
          for_more_information(
            "doc/update/5.4-to-6.0.md in section \"#global-projects\""
          )
          fix_and_rerun
        end
      end
    end
R
Riyad Preukschas 已提交
605 606 607 608

    # Helper methods
    ########################

609 610
    def gitlab_shell_user_home
      File.expand_path("~#{Gitlab.config.gitlab_shell.ssh_user}")
R
Riyad Preukschas 已提交
611 612
    end

613
    def gitlab_shell_version
M
Martin Bastien 已提交
614
      gitlab_shell_version_file = "#{gitlab_shell_user_home}/gitlab-shell/VERSION"
615 616
      if File.readable?(gitlab_shell_version_file)
        File.read(gitlab_shell_version_file)
R
Riyad Preukschas 已提交
617 618 619
      end
    end

620 621
    def has_gitlab_shell3?
      gitlab_shell_version.try(:start_with?, "v3.")
R
Riyad Preukschas 已提交
622
    end
R
Riyad Preukschas 已提交
623
  end
624

R
Riyad Preukschas 已提交
625 626


R
Riyad Preukschas 已提交
627
  namespace :sidekiq do
D
Dmitriy Zaporozhets 已提交
628
    desc "GITLAB | Check the configuration of Sidekiq"
R
Riyad Preukschas 已提交
629
    task check: :environment  do
R
Riyad Preukschas 已提交
630
      warn_user_is_not_gitlab
R
Riyad Preukschas 已提交
631
      start_checking "Sidekiq"
R
Riyad Preukschas 已提交
632

R
Riyad Preukschas 已提交
633
      check_sidekiq_running
634
      only_one_sidekiq_running
R
Riyad Preukschas 已提交
635

R
Riyad Preukschas 已提交
636
      finished_checking "Sidekiq"
R
Riyad Preukschas 已提交
637 638 639 640 641 642
    end


    # Checks
    ########################

R
Riyad Preukschas 已提交
643
    def check_sidekiq_running
R
Riyad Preukschas 已提交
644 645
      print "Running? ... "

646
      if sidekiq_process_count > 0
R
Riyad Preukschas 已提交
647 648 649 650
        puts "yes".green
      else
        puts "no".red
        try_fixing_it(
651
          sudo_gitlab("RAILS_ENV=production script/background_jobs start")
R
Riyad Preukschas 已提交
652 653 654
        )
        for_more_information(
          see_installation_guide_section("Install Init Script"),
D
Dmitriy Zaporozhets 已提交
655
          "see log/sidekiq.log for possible errors"
R
Riyad Preukschas 已提交
656
        )
R
Riyad Preukschas 已提交
657
        fix_and_rerun
R
Riyad Preukschas 已提交
658 659
      end
    end
660 661

    def only_one_sidekiq_running
662 663
      process_count = sidekiq_process_count
      return if process_count.zero?
664 665

      print 'Number of Sidekiq processes ... '
666
      if process_count == 1
667 668
        puts '1'.green
      else
669
        puts "#{process_count}".red
670 671
        try_fixing_it(
          'sudo service gitlab stop',
672 673
          "sudo pkill -u #{gitlab_user} -f sidekiq",
          "sleep 10 && sudo pkill -9 -u #{gitlab_user} -f sidekiq",
674 675 676 677 678 679
          'sudo service gitlab start'
        )
        fix_and_rerun
      end
    end

680 681
    def sidekiq_process_count
      `ps ux`.scan(/sidekiq \d+\.\d+\.\d+/).count
682
    end
R
Riyad Preukschas 已提交
683 684 685 686 687 688
  end


  # Helper methods
  ##########################

R
Riyad Preukschas 已提交
689
  def fix_and_rerun
R
Riyad Preukschas 已提交
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
    puts "  Please #{"fix the error above"} and rerun the checks.".red
  end

  def for_more_information(*sources)
    sources = sources.shift if sources.first.is_a?(Array)

    puts "  For more information see:".blue
    sources.each do |source|
      puts "  #{source}"
    end
  end

  def finished_checking(component)
    puts ""
    puts "Checking #{component.yellow} ... #{"Finished".green}"
    puts ""
  end

  def see_database_guide
    "doc/install/databases.md"
  end

  def see_installation_guide_section(section)
    "doc/install/installation.md in section \"#{section}\""
  end

716 717 718 719
  def sudo_gitlab(command)
    "sudo -u #{gitlab_user} -H #{command}"
  end

720 721 722 723
  def gitlab_user
    Gitlab.config.gitlab.user
  end

R
Riyad Preukschas 已提交
724 725 726 727 728 729 730 731 732 733 734 735 736
  def start_checking(component)
    puts "Checking #{component.yellow} ..."
    puts ""
  end

  def try_fixing_it(*steps)
    steps = steps.shift if steps.first.is_a?(Array)

    puts "  Try fixing it:".blue
    steps.each do |step|
      puts "  #{step}"
    end
  end
737 738

  def check_gitlab_shell
739
    required_version = Gitlab::VersionInfo.new(1, 7, 9)
740
    current_version = Gitlab::VersionInfo.parse(gitlab_shell_version)
741

742
    print "GitLab Shell version >= #{required_version} ? ... "
S
Sato Hiroyuki 已提交
743
    if current_version.valid? && required_version <= current_version
744
      puts "OK (#{current_version})".green
745
    else
746
      puts "FAIL. Please update gitlab-shell to #{required_version} from #{current_version}".red
747 748
    end
  end
749 750

  def check_git_version
751
    required_version = Gitlab::VersionInfo.new(1, 7, 10)
752
    current_version = Gitlab::VersionInfo.parse(run("#{Gitlab.config.git.bin_path} --version"))
S
Sato Hiroyuki 已提交
753

754
    puts "Your git bin path is \"#{Gitlab.config.git.bin_path}\""
S
Sato Hiroyuki 已提交
755 756
    print "Git version >= #{required_version} ? ... "

S
Sato Hiroyuki 已提交
757
    if current_version.valid? && required_version <= current_version
758
        puts "yes (#{current_version})".green
759 760 761
    else
      puts "no".red
      try_fixing_it(
S
Sato Hiroyuki 已提交
762
        "Update your git to a version >= #{required_version} from #{current_version}"
763 764 765 766
      )
      fix_and_rerun
    end
  end
767
end