Merge pull request #2266 from riyad/improve-status-checks
Improve status checks
This commit is contained in:
commit
57e210f6e5
|
@ -52,14 +52,14 @@ edited by hand. But, you can use any editor you like instead.
|
|||
|
||||
Install the required packages:
|
||||
|
||||
sudo apt-get install -y wget curl build-essential checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libreadline6-dev libc6-dev libssl-dev zlib1g-dev libicu-dev redis-server openssh-server git-core libyaml-dev postfix
|
||||
sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev wget curl git-core openssh-server redis-server postfix checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev
|
||||
|
||||
Make sure you have the right version of Python installed.
|
||||
|
||||
# Install Python
|
||||
sudo apt-get install python
|
||||
|
||||
# Make sure that Python is 2.x (3.x is not supported at the moment)
|
||||
# Make sure that Python is 2.5+ (3.x is not supported at the moment)
|
||||
python --version
|
||||
|
||||
# If it's Python 3 you might need to install Python 2 separately
|
||||
|
@ -136,10 +136,10 @@ GitLab assumes *full and unshared* control over this Gitolite installation.
|
|||
# ... and use it as the admin key for the Gitolite setup
|
||||
sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gitolite setup -pk /home/git/gitlab.pub"
|
||||
|
||||
Fix the directory permissions for the repository:
|
||||
Fix the directory permissions for the repositories:
|
||||
|
||||
# Make sure the repositories dir is owned by git and it stays that way
|
||||
sudo chmod -R ug+rwXs /home/git/repositories/
|
||||
sudo chmod -R ug+rwXs,o-rwx /home/git/repositories/
|
||||
sudo chown -R git:git /home/git/repositories/
|
||||
|
||||
## Test if everything works so far
|
||||
|
@ -187,6 +187,12 @@ do so with caution!
|
|||
# host serving GitLab where necessary
|
||||
sudo -u gitlab -H vim config/gitlab.yml
|
||||
|
||||
# Make sure GitLab can write to the log/ and tmp/ directories
|
||||
sudo chown -R gitlab log/
|
||||
sudo chown -R gitlab tmp/
|
||||
sudo chmod -R u+rwX log/
|
||||
sudo chmod -R u+rwX tmp/
|
||||
|
||||
# Copy the example Unicorn config
|
||||
sudo -u gitlab -H cp config/unicorn.rb.example config/unicorn.rb
|
||||
|
||||
|
@ -209,7 +215,7 @@ used for the `email.from` setting in `config/gitlab.yml`)
|
|||
sudo -u gitlab -H git config --global user.name "GitLab"
|
||||
sudo -u gitlab -H git config --global user.email "gitlab@localhost"
|
||||
|
||||
## Setup GitLab hooks
|
||||
## Setup GitLab Hooks
|
||||
|
||||
sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive
|
||||
sudo chown git:git /home/git/.gitolite/hooks/common/post-receive
|
||||
|
@ -227,7 +233,7 @@ Check if GitLab and its environment is configured correctly:
|
|||
|
||||
To make sure you didn't miss anything run a more thorough check with:
|
||||
|
||||
sudo -u gitlab -H bundle exec rake gitlab:app:status RAILS_ENV=production
|
||||
sudo -u gitlab -H bundle exec rake gitlab:check RAILS_ENV=production
|
||||
|
||||
If you are all green: congratulations, you successfully installed GitLab!
|
||||
Although this is the case, there are still a few steps to go.
|
||||
|
@ -248,6 +254,8 @@ Make GitLab start on boot:
|
|||
Start your GitLab instance:
|
||||
|
||||
sudo service gitlab start
|
||||
# or
|
||||
sudo /etc/init.d/gitlab restart
|
||||
|
||||
|
||||
# 7. Nginx
|
||||
|
|
|
@ -54,9 +54,18 @@ Git: /usr/bin/git
|
|||
```
|
||||
|
||||
|
||||
### Check GitLab installation status
|
||||
### Check GitLab configuration
|
||||
|
||||
[Trouble-Shooting-Guide](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Trouble-Shooting-Guide)
|
||||
Runs the following rake tasks:
|
||||
|
||||
* gitlab:env:check
|
||||
* gitlab:gitolite:check
|
||||
* gitlab:resque:check
|
||||
* gitlab:app:check
|
||||
|
||||
It will check that each component was setup according to the installation guide and suggest fixes for issues found.
|
||||
|
||||
You may also have a look at our [Trouble Shooting Guide](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Trouble-Shooting-Guide).
|
||||
|
||||
```
|
||||
bundle exec rake gitlab:check
|
||||
|
@ -65,21 +74,68 @@ bundle exec rake gitlab:check
|
|||
Example output:
|
||||
|
||||
```
|
||||
config/database.yml............exists
|
||||
config/gitlab.yml............exists
|
||||
/home/git/repositories/............exists
|
||||
/home/git/repositories/ is writable?............YES
|
||||
Can clone gitolite-admin?............YES
|
||||
Can git commit?............YES
|
||||
UMASK for .gitolite.rc is 0007? ............YES
|
||||
/home/git/.gitolite/hooks/common/post-receive exists? ............YES
|
||||
Checking Environment ...
|
||||
|
||||
Validating projects repositories:
|
||||
* abcd.....post-receive file ok
|
||||
* abcdtest.....post-receive file missing
|
||||
gitlab user is in git group? ... yes
|
||||
Has no "-e" in ~git/.profile ... yes
|
||||
Git configured for gitlab user? ... yes
|
||||
Has python2? ... yes
|
||||
python2 is supported version? ... yes
|
||||
|
||||
Finished
|
||||
Checking Environment ... Finished
|
||||
|
||||
Checking Gitolite ...
|
||||
|
||||
Using recommended version ... yes
|
||||
Repo umask is 0007 in .gitolite.rc? ... yes
|
||||
Allow all Git config keys in .gitolite.rc ... yes
|
||||
Config directory exists? ... yes
|
||||
Config directory owned by git:git? ... yes
|
||||
Config directory access is drwxr-x---? ... yes
|
||||
Repo base directory exists? ... yes
|
||||
Repo base owned by git:git? ... yes
|
||||
Repo base access is drwsrws---? ... yes
|
||||
Can clone gitolite-admin? ... yes
|
||||
Can commit to gitolite-admin? ... yes
|
||||
post-receive hook exists? ... yes
|
||||
post-receive hook up-to-date? ... yes
|
||||
post-receive hooks in repos are links: ...
|
||||
GitLab ... ok
|
||||
Non-Ascii Files Test ... ok
|
||||
Touch Commit Test ... ok
|
||||
Without Master Test ... ok
|
||||
Git config in repos: ...
|
||||
GitLab ... ok
|
||||
Non-Ascii Files Test ... ok
|
||||
Touch Commit Test ... ok
|
||||
Without Master Test ... ok
|
||||
|
||||
Checking Gitolite ... Finished
|
||||
|
||||
Checking Resque ...
|
||||
|
||||
Running? ... yes
|
||||
|
||||
Checking Resque ... Finished
|
||||
|
||||
Checking GitLab ...
|
||||
|
||||
Database config exists? ... yes
|
||||
Database is not SQLite ... yes
|
||||
All migrations up? ... yes
|
||||
GitLab config exists? ... yes
|
||||
GitLab config not outdated? ... yes
|
||||
Log directory writable? ... yes
|
||||
Tmp directory writable? ... yes
|
||||
Init script exists? ... yes
|
||||
Init script up-to-date? ... yes
|
||||
Projects have satellites? ...
|
||||
GitLab ... yes
|
||||
Non-Ascii Files Test ... yes
|
||||
Touch Commit Test ... yes
|
||||
Without Master Test ... yes
|
||||
|
||||
Checking GitLab ... Finished
|
||||
```
|
||||
|
||||
|
||||
|
|
959
lib/tasks/gitlab/check.rake
Normal file
959
lib/tasks/gitlab/check.rake
Normal file
|
@ -0,0 +1,959 @@
|
|||
namespace :gitlab do
|
||||
desc "GITLAB | Check the configuration of GitLab and its environment"
|
||||
task check: %w{gitlab:env:check
|
||||
gitlab:gitolite:check
|
||||
gitlab:resque:check
|
||||
gitlab:app:check}
|
||||
|
||||
|
||||
|
||||
namespace :app do
|
||||
desc "GITLAB | Check the configuration of the GitLab Rails app"
|
||||
task check: :environment do
|
||||
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
|
||||
check_satellites_exist
|
||||
|
||||
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"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_database_is_not_sqlite
|
||||
print "Database is not SQLite ... "
|
||||
|
||||
database_config_file = Rails.root.join("config", "database.yml")
|
||||
|
||||
unless File.read(database_config_file) =~ /sqlite/
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
for_more_information(
|
||||
"https://github.com/gitlabhq/gitlabhq/wiki/Migrate-from-SQLite-to-MySQL",
|
||||
see_database_guide
|
||||
)
|
||||
check_failed
|
||||
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"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_gitlab_config_not_outdated
|
||||
print "GitLab config not outdated? ... "
|
||||
|
||||
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
|
||||
if File.read(gitlab_config_file) =~ /^web:/
|
||||
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"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_init_script_exists
|
||||
print "Init script exists? ... "
|
||||
|
||||
script_path = "/etc/init.d/gitlab"
|
||||
|
||||
if File.exists?(script_path)
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"Install the init script"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Install Init Script"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_init_script_up_to_date
|
||||
print "Init script up-to-date? ... "
|
||||
|
||||
script_path = "/etc/init.d/gitlab"
|
||||
unless File.exists?(script_path)
|
||||
puts "can't check because of previous errors".magenta
|
||||
return
|
||||
end
|
||||
|
||||
recipe_content = `curl https://raw.github.com/gitlabhq/gitlab-recipes/master/init.d/gitlab 2>/dev/null`
|
||||
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"
|
||||
)
|
||||
check_failed
|
||||
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
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"sudo -u gitlab -H bundle exec rake db:migrate"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_satellites_exist
|
||||
print "Projects have satellites? ... "
|
||||
|
||||
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.yellow} ... "
|
||||
|
||||
if project.satellite.exists?
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"sudo -u gitlab -H bundle exec rake gitlab:app:enable_automerge"
|
||||
)
|
||||
for_more_information(
|
||||
"doc/raketasks/maintenance.md "
|
||||
)
|
||||
check_failed
|
||||
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}",
|
||||
"sudo chmod -R rwX #{log_path}"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "GitLab"
|
||||
)
|
||||
check_failed
|
||||
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}",
|
||||
"sudo chmod -R rwX #{tmp_path}"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "GitLab"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
namespace :env do
|
||||
desc "GITLAB | Check the configuration of the environment"
|
||||
task check: :environment do
|
||||
warn_user_is_not_gitlab
|
||||
start_checking "Environment"
|
||||
|
||||
check_gitlab_in_git_group
|
||||
check_issue_1056_shell_profile_error
|
||||
check_gitlab_git_config
|
||||
check_python2_exists
|
||||
check_python2_version
|
||||
|
||||
finished_checking "Environment"
|
||||
end
|
||||
|
||||
|
||||
# Checks
|
||||
########################
|
||||
|
||||
def check_gitlab_git_config
|
||||
print "Git configured for gitlab user? ... "
|
||||
|
||||
options = {
|
||||
"user.name" => "GitLab",
|
||||
"user.email" => Gitlab.config.email_from
|
||||
}
|
||||
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(
|
||||
"sudo -u gitlab -H git config --global user.name \"#{options["user.name"]}\"",
|
||||
"sudo -u gitlab -H git config --global user.email \"#{options["user.email"]}\""
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "GitLab"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_gitlab_in_git_group
|
||||
print "gitlab user is in git group? ... "
|
||||
|
||||
if run_and_match("id -rnG", /\Wgit\W/)
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"sudo usermod -a -G git gitlab"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "System Users"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
# see https://github.com/gitlabhq/gitlabhq/issues/1059
|
||||
def check_issue_1056_shell_profile_error
|
||||
print "Has no \"-e\" in ~git/.profile ... "
|
||||
|
||||
profile_file = File.expand_path("~#{Gitlab.config.ssh_user}/.profile")
|
||||
|
||||
unless File.read(profile_file) =~ /^-e PATH/
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"Open #{profile_file}",
|
||||
"Find the line starting with \"-e PATH\"",
|
||||
"Remove \"-e \" so the line starts with PATH"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section("Gitolite"),
|
||||
"https://github.com/gitlabhq/gitlabhq/issues/1059"
|
||||
)
|
||||
check_failed
|
||||
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"
|
||||
)
|
||||
check_failed
|
||||
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"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
namespace :gitolite do
|
||||
desc "GITLAB | Check the configuration of Gitolite"
|
||||
task check: :environment do
|
||||
warn_user_is_not_gitlab
|
||||
start_checking "Gitolite"
|
||||
|
||||
check_gitolite_is_up_to_date
|
||||
check_gitoliterc_repo_umask
|
||||
check_gitoliterc_git_config_keys
|
||||
check_dot_gitolite_exists
|
||||
check_dot_gitolite_user_and_group
|
||||
check_dot_gitolite_permissions
|
||||
check_repo_base_exists
|
||||
check_repo_base_user_and_group
|
||||
check_repo_base_permissions
|
||||
check_can_clone_gitolite_admin
|
||||
check_can_commit_to_gitolite_admin
|
||||
check_post_receive_hook_exists
|
||||
check_post_receive_hook_is_up_to_date
|
||||
check_repos_post_receive_hooks_is_link
|
||||
check_repos_git_config
|
||||
|
||||
finished_checking "Gitolite"
|
||||
end
|
||||
|
||||
|
||||
# Checks
|
||||
########################
|
||||
|
||||
def check_can_clone_gitolite_admin
|
||||
print "Can clone gitolite-admin? ... "
|
||||
|
||||
test_path = "/tmp/gitlab_gitolite_admin_test"
|
||||
FileUtils.rm_rf(test_path)
|
||||
`git clone -q #{Gitlab.config.gitolite_admin_uri} #{test_path}`
|
||||
raise unless $?.success?
|
||||
|
||||
puts "yes".green
|
||||
rescue
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"Make sure the \"admin_uri\" is set correctly in config/gitlab.yml",
|
||||
"Try cloning it yourself with:",
|
||||
" git clone -q #{Gitlab.config.gitolite_admin_uri} /tmp/gitolite-admin",
|
||||
"Make sure Gitolite is installed correctly."
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
|
||||
# assumes #check_can_clone_gitolite_admin has been run before
|
||||
def check_can_commit_to_gitolite_admin
|
||||
print "Can commit to gitolite-admin? ... "
|
||||
|
||||
test_path = "/tmp/gitlab_gitolite_admin_test"
|
||||
unless File.exists?(test_path)
|
||||
puts "can't check because of previous errors".magenta
|
||||
return
|
||||
end
|
||||
|
||||
Dir.chdir(test_path) do
|
||||
`touch foo && git add foo && git commit -qm foo`
|
||||
raise unless $?.success?
|
||||
end
|
||||
|
||||
puts "yes".green
|
||||
rescue
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"Try committing to it yourself with:",
|
||||
" git clone -q #{Gitlab.config.gitolite_admin_uri} /tmp/gitolite-admin",
|
||||
" touch foo",
|
||||
" git add foo",
|
||||
" git commit -m \"foo\"",
|
||||
"Make sure Gitolite is installed correctly."
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
ensure
|
||||
FileUtils.rm_rf("/tmp/gitolite_gitlab_test")
|
||||
end
|
||||
|
||||
def check_dot_gitolite_exists
|
||||
print "Config directory exists? ... "
|
||||
|
||||
gitolite_config_path = File.expand_path("~#{Gitlab.config.ssh_user}/.gitolite")
|
||||
|
||||
if File.directory?(gitolite_config_path)
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
puts "#{gitolite_config_path} is missing".red
|
||||
try_fixing_it(
|
||||
"This should have been created when setting up Gitolite.",
|
||||
"Make sure Gitolite is installed correctly."
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_dot_gitolite_permissions
|
||||
print "Config directory access is drwxr-x---? ... "
|
||||
|
||||
gitolite_config_path = File.expand_path("~#{Gitlab.config.ssh_user}/.gitolite")
|
||||
unless File.exists?(gitolite_config_path)
|
||||
puts "can't check because of previous errors".magenta
|
||||
return
|
||||
end
|
||||
|
||||
if `stat --printf %a #{gitolite_config_path}` == "750"
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
puts "#{gitolite_config_path} is not writable".red
|
||||
try_fixing_it(
|
||||
"sudo chmod 750 #{gitolite_config_path}"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_dot_gitolite_user_and_group
|
||||
print "Config directory owned by git:git? ... "
|
||||
|
||||
gitolite_config_path = File.expand_path("~#{Gitlab.config.ssh_user}/.gitolite")
|
||||
unless File.exists?(gitolite_config_path)
|
||||
puts "can't check because of previous errors".magenta
|
||||
return
|
||||
end
|
||||
|
||||
if `stat --printf %U #{gitolite_config_path}` == "git" && # user
|
||||
`stat --printf %G #{gitolite_config_path}` == "git" #group
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
puts "#{gitolite_config_path} is not owned by git".red
|
||||
try_fixing_it(
|
||||
"sudo chown -R git:git #{gitolite_config_path}"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_gitolite_is_up_to_date
|
||||
print "Using recommended version ... "
|
||||
if gitolite_version.try(:start_with?, "v3.04")
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"We strongly recommend using the version pointed out in the installation guide."
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
# this is not a "hard" failure
|
||||
end
|
||||
end
|
||||
|
||||
def check_gitoliterc_git_config_keys
|
||||
gitoliterc_path = File.join(gitolite_home, ".gitolite.rc")
|
||||
|
||||
print "Allow all Git config keys in .gitolite.rc ... "
|
||||
option_name = if has_gitolite3?
|
||||
# see https://github.com/sitaramc/gitolite/blob/v3.04/src/lib/Gitolite/Rc.pm#L329
|
||||
"GIT_CONFIG_KEYS"
|
||||
else
|
||||
# assume older version
|
||||
# see https://github.com/sitaramc/gitolite/blob/v2.3/conf/example.gitolite.rc#L49
|
||||
"$GL_GITCONFIG_KEYS"
|
||||
end
|
||||
option_value = ".*"
|
||||
if open(gitoliterc_path).grep(/#{option_name}\s*=[>]?\s*["']#{option_value}["']/).any?
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"Open #{gitoliterc_path}",
|
||||
"Find the \"#{option_name}\" option",
|
||||
"Change its value to \".*\""
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_gitoliterc_repo_umask
|
||||
gitoliterc_path = File.join(gitolite_home, ".gitolite.rc")
|
||||
|
||||
print "Repo umask is 0007 in .gitolite.rc? ... "
|
||||
option_name = if has_gitolite3?
|
||||
# see https://github.com/sitaramc/gitolite/blob/v3.04/src/lib/Gitolite/Rc.pm#L328
|
||||
"UMASK"
|
||||
else
|
||||
# assume older version
|
||||
# see https://github.com/sitaramc/gitolite/blob/v2.3/conf/example.gitolite.rc#L32
|
||||
"$REPO_UMASK"
|
||||
end
|
||||
option_value = "0007"
|
||||
if open(gitoliterc_path).grep(/#{option_name}\s*=[>]?\s*#{option_value}/).any?
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"Open #{gitoliterc_path}",
|
||||
"Find the \"#{option_name}\" option",
|
||||
"Change its value to \"0007\""
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_post_receive_hook_exists
|
||||
print "post-receive hook exists? ... "
|
||||
|
||||
hook_file = "post-receive"
|
||||
gitolite_hooks_path = File.join(Gitlab.config.git_hooks_path, "common")
|
||||
gitolite_hook_file = File.join(gitolite_hooks_path, hook_file)
|
||||
|
||||
gitlab_hook_file = Rails.root.join.join("lib", "hooks", hook_file)
|
||||
|
||||
if File.exists?(gitolite_hook_file)
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"sudo -u git cp #{gitlab_hook_file} #{gitolite_hook_file}"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Setup GitLab Hooks"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_post_receive_hook_is_up_to_date
|
||||
print "post-receive hook up-to-date? ... "
|
||||
|
||||
hook_file = "post-receive"
|
||||
gitolite_hooks_path = File.join(Gitlab.config.git_hooks_path, "common")
|
||||
gitolite_hook_file = File.join(gitolite_hooks_path, hook_file)
|
||||
gitolite_hook_content = File.read(gitolite_hook_file)
|
||||
|
||||
unless File.exists?(gitolite_hook_file)
|
||||
puts "can't check because of previous errors".magenta
|
||||
return
|
||||
end
|
||||
|
||||
gitlab_hook_file = Rails.root.join.join("lib", "hooks", hook_file)
|
||||
gitlab_hook_content = File.read(gitlab_hook_file)
|
||||
|
||||
if gitolite_hook_content == gitlab_hook_content
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
try_fixing_it(
|
||||
"sudo -u git cp #{gitlab_hook_file} #{gitolite_hook_file}"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Setup GitLab Hooks"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_repo_base_exists
|
||||
print "Repo base directory exists? ... "
|
||||
|
||||
repo_base_path = Gitlab.config.git_base_path
|
||||
|
||||
if File.exists?(repo_base_path)
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
puts "#{repo_base_path} is missing".red
|
||||
try_fixing_it(
|
||||
"This should have been created when setting up Gitolite.",
|
||||
"Make sure it's set correctly in config/gitlab.yml",
|
||||
"Make sure Gitolite is installed correctly."
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_repo_base_permissions
|
||||
print "Repo base access is drwsrws---? ... "
|
||||
|
||||
repo_base_path = Gitlab.config.git_base_path
|
||||
unless File.exists?(repo_base_path)
|
||||
puts "can't check because of previous errors".magenta
|
||||
return
|
||||
end
|
||||
|
||||
if `stat --printf %a #{repo_base_path}` == "6770"
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
puts "#{repo_base_path} is not writable".red
|
||||
try_fixing_it(
|
||||
"sudo chmod -R ug+rwXs,o-rwx #{repo_base_path}"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_repo_base_user_and_group
|
||||
print "Repo base owned by git:git? ... "
|
||||
|
||||
repo_base_path = Gitlab.config.git_base_path
|
||||
unless File.exists?(repo_base_path)
|
||||
puts "can't check because of previous errors".magenta
|
||||
return
|
||||
end
|
||||
|
||||
if `stat --printf %U #{repo_base_path}` == "git" && # user
|
||||
`stat --printf %G #{repo_base_path}` == "git" #group
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
puts "#{repo_base_path} is not owned by git".red
|
||||
try_fixing_it(
|
||||
"sudo chown -R git:git #{repo_base_path}"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section "Gitolite"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
|
||||
def check_repos_git_config
|
||||
print "Git config in repos: ... "
|
||||
|
||||
unless Project.count > 0
|
||||
puts "can't check, you have no projects".magenta
|
||||
return
|
||||
end
|
||||
puts ""
|
||||
|
||||
options = {
|
||||
"core.sharedRepository" => "0660",
|
||||
}
|
||||
|
||||
Project.find_each(batch_size: 100) do |project|
|
||||
print "#{project.name.yellow} ... "
|
||||
|
||||
correct_options = options.map do |name, value|
|
||||
run("git --git-dir=\"#{project.path_to_repo}\" config --get #{name}").try(:chomp) == value
|
||||
end
|
||||
|
||||
if correct_options.all?
|
||||
puts "ok".green
|
||||
else
|
||||
puts "wrong or missing".red
|
||||
try_fixing_it(
|
||||
"sudo -u gitlab -H bundle exec rake gitlab:gitolite:update_repos"
|
||||
)
|
||||
for_more_information(
|
||||
"doc/raketasks/maintenance.md"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def check_repos_post_receive_hooks_is_link
|
||||
print "post-receive hooks in repos are links: ... "
|
||||
|
||||
hook_file = "post-receive"
|
||||
gitolite_hooks_path = File.join(Gitlab.config.git_hooks_path, "common")
|
||||
gitolite_hook_file = File.join(gitolite_hooks_path, hook_file)
|
||||
|
||||
unless File.exists?(gitolite_hook_file)
|
||||
puts "can't check because of previous errors".magenta
|
||||
return
|
||||
end
|
||||
|
||||
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.yellow} ... "
|
||||
project_hook_file = File.join(project.path_to_repo, "hooks", hook_file)
|
||||
|
||||
unless File.exists?(project_hook_file)
|
||||
puts "missing".red
|
||||
try_fixing_it(
|
||||
"sudo -u git ln -sf #{gitolite_hook_file} #{project_hook_file}"
|
||||
)
|
||||
for_more_information(
|
||||
"lib/support/rewrite-hooks.sh"
|
||||
)
|
||||
check_failed
|
||||
next
|
||||
end
|
||||
|
||||
if run_and_match("stat --format %N #{project_hook_file}", /#{hook_file}.+->.+#{gitolite_hook_file}/)
|
||||
puts "ok".green
|
||||
else
|
||||
puts "not a link to Gitolite's hook".red
|
||||
try_fixing_it(
|
||||
"sudo -u git ln -sf #{gitolite_hook_file} #{project_hook_file}"
|
||||
)
|
||||
for_more_information(
|
||||
"lib/support/rewrite-hooks.sh"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Helper methods
|
||||
########################
|
||||
|
||||
def gitolite_home
|
||||
File.expand_path("~#{Gitlab.config.ssh_user}")
|
||||
end
|
||||
|
||||
def gitolite_version
|
||||
gitolite_version_file = "#{gitolite_home}/gitolite/src/VERSION"
|
||||
if File.readable?(gitolite_version_file)
|
||||
File.read(gitolite_version_file)
|
||||
end
|
||||
end
|
||||
|
||||
def has_gitolite3?
|
||||
gitolite_version.try(:start_with?, "v3.")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
namespace :resque do
|
||||
desc "GITLAB | Check the configuration of Resque"
|
||||
task check: :environment do
|
||||
warn_user_is_not_gitlab
|
||||
start_checking "Resque"
|
||||
|
||||
check_resque_running
|
||||
|
||||
finished_checking "Resque"
|
||||
end
|
||||
|
||||
|
||||
# Checks
|
||||
########################
|
||||
|
||||
def check_resque_running
|
||||
print "Running? ... "
|
||||
|
||||
if run_and_match("ps aux | grep -i resque", /resque-[\d\.]+:.+$/)
|
||||
puts "yes".green
|
||||
else
|
||||
puts "no".red
|
||||
puts "#{repo_base_path} is not owned by git".red
|
||||
try_fixing_it(
|
||||
"sudo service gitlab restart",
|
||||
"or",
|
||||
"sudo /etc/init.d/gitlab restart"
|
||||
)
|
||||
for_more_information(
|
||||
see_installation_guide_section("Install Init Script"),
|
||||
"see log/resque.log for possible errors"
|
||||
)
|
||||
check_failed
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Helper methods
|
||||
##########################
|
||||
|
||||
def check_failed
|
||||
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
|
||||
|
||||
# Runs the given command
|
||||
#
|
||||
# Returns nil if the command was not found
|
||||
# Returns the output of the command otherwise
|
||||
#
|
||||
# see also #run_and_match
|
||||
def run(command)
|
||||
unless `#{command} 2>/dev/null`.blank?
|
||||
`#{command}`
|
||||
end
|
||||
end
|
||||
|
||||
# Runs the given command and matches the output agains the given pattern
|
||||
#
|
||||
# Returns nil if nothing matched
|
||||
# Retunrs the MatchData if the pattern matched
|
||||
#
|
||||
# see also #run
|
||||
# see also String#match
|
||||
def run_and_match(command, pattern)
|
||||
run(command).try(:match, pattern)
|
||||
end
|
||||
|
||||
def see_database_guide
|
||||
"doc/install/databases.md"
|
||||
end
|
||||
|
||||
def see_installation_guide_section(section)
|
||||
"doc/install/installation.md in section \"#{section}\""
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
def warn_user_is_not_gitlab
|
||||
unless @warned_user_not_gitlab
|
||||
current_user = run("whoami").chomp
|
||||
unless current_user == "gitlab"
|
||||
puts "#{Colored.color(:black)+Colored.color(:on_yellow)} Warning #{Colored.extra(:clear)}"
|
||||
puts " You are running as user #{current_user.magenta}, we hope you know what you are doing."
|
||||
puts " Some tests may pass\/fail for the wrong reason."
|
||||
puts " For meaningful results you should run this as user #{"gitlab".magenta}."
|
||||
puts ""
|
||||
end
|
||||
@warned_user_not_gitlab = true
|
||||
end
|
||||
end
|
||||
end
|
|
@ -84,7 +84,13 @@ namespace :gitlab do
|
|||
|
||||
# Helper methods
|
||||
|
||||
# Runs the given command and matches the output agains the given RegExp
|
||||
# Runs the given command and matches the output agains the given pattern
|
||||
#
|
||||
# Returns nil if nothing matched
|
||||
# Retunrs the MatchData if the pattern matched
|
||||
#
|
||||
# see also #run
|
||||
# see also String#match
|
||||
def run_and_match(command, regexp)
|
||||
run(command).try(:match, regexp)
|
||||
end
|
||||
|
@ -93,6 +99,8 @@ namespace :gitlab do
|
|||
#
|
||||
# Returns nil if the command was not found
|
||||
# Returns the output of the command otherwise
|
||||
#
|
||||
# see also #run_and_match
|
||||
def run(command)
|
||||
unless `#{command} 2>/dev/null`.blank?
|
||||
`#{command}`
|
||||
|
|
|
@ -1,113 +0,0 @@
|
|||
namespace :gitlab do
|
||||
namespace :app do
|
||||
desc "GITLAB | Check GitLab installation status"
|
||||
task :status => :environment do
|
||||
puts "\nStarting diagnostics".yellow
|
||||
git_base_path = Gitlab.config.git_base_path
|
||||
|
||||
print "config/database.yml............"
|
||||
if File.exists?(Rails.root.join "config", "database.yml")
|
||||
puts "exists".green
|
||||
else
|
||||
puts "missing".red
|
||||
return
|
||||
end
|
||||
|
||||
print "config/gitlab.yml............"
|
||||
if File.exists?(Rails.root.join "config", "gitlab.yml")
|
||||
puts "exists".green
|
||||
else
|
||||
puts "missing".red
|
||||
return
|
||||
end
|
||||
|
||||
print "#{git_base_path}............"
|
||||
if File.exists?(git_base_path)
|
||||
puts "exists".green
|
||||
else
|
||||
puts "missing".red
|
||||
return
|
||||
end
|
||||
|
||||
print "#{git_base_path} is writable?............"
|
||||
if File.stat(git_base_path).writable?
|
||||
puts "YES".green
|
||||
else
|
||||
puts "NO".red
|
||||
return
|
||||
end
|
||||
|
||||
FileUtils.rm_rf("/tmp/gitolite_gitlab_test")
|
||||
begin
|
||||
`git clone -q #{Gitlab.config.gitolite_admin_uri} /tmp/gitolite_gitlab_test`
|
||||
raise unless $?.success?
|
||||
print "Can clone gitolite-admin?............"
|
||||
puts "YES".green
|
||||
rescue
|
||||
print "Can clone gitolite-admin?............"
|
||||
puts "NO".red
|
||||
return
|
||||
end
|
||||
|
||||
begin
|
||||
Dir.chdir("/tmp/gitolite_gitlab_test") do
|
||||
`touch blah && git add blah && git commit -qm blah -- blah`
|
||||
raise unless $?.success?
|
||||
end
|
||||
print "Can git commit?............"
|
||||
puts "YES".green
|
||||
rescue
|
||||
print "Can git commit?............"
|
||||
puts "NO".red
|
||||
return
|
||||
ensure
|
||||
FileUtils.rm_rf("/tmp/gitolite_gitlab_test")
|
||||
end
|
||||
|
||||
print "UMASK for .gitolite.rc is 0007? ............"
|
||||
if open(File.absolute_path("#{git_base_path}/../.gitolite.rc")).grep(/UMASK([ \t]*)=([ \t>]*)0007/).any?
|
||||
puts "YES".green
|
||||
else
|
||||
puts "NO".red
|
||||
return
|
||||
end
|
||||
|
||||
gitolite_hooks_path = File.join(Gitlab.config.git_hooks_path, "common")
|
||||
gitlab_hook_files = ['post-receive']
|
||||
gitlab_hook_files.each do |file_name|
|
||||
dest = File.join(gitolite_hooks_path, file_name)
|
||||
print "#{dest} exists? ............"
|
||||
if File.exists?(dest)
|
||||
puts "YES".green
|
||||
else
|
||||
puts "NO".red
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
if Project.count > 0
|
||||
puts "\nValidating projects repositories:".yellow
|
||||
Project.find_each(:batch_size => 100) do |project|
|
||||
print "* #{project.name}....."
|
||||
hook_file = File.join(project.path_to_repo, 'hooks', 'post-receive')
|
||||
|
||||
unless File.exists?(hook_file)
|
||||
puts "post-receive file missing".red
|
||||
next
|
||||
end
|
||||
|
||||
original_content = File.read(Rails.root.join('lib', 'hooks', 'post-receive'))
|
||||
new_content = File.read(hook_file)
|
||||
|
||||
if original_content == new_content
|
||||
puts "post-receive file ok".green
|
||||
else
|
||||
puts "post-receive file content does not match".red
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
puts "\nFinished".blue
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue