Oggi ho bestemmiato un paio d'ore per installare Gitorious, progetto che mi ha incuriosito e di cui volevo capirne le potenzialità (in ottica di fargli sostituire l'ottimo Redmine). Dato che alla fine sono riuscito a farlo funzionare e non ho trovato una guida fatta a modo, ho deciso di mettere nero su bianco ciò che ho fatto.

L'installazione è stata effettuata su un server virtuale pulito Ubuntu server 10.04 x86_64. Ho provato ad utilizzare RVM e ruby 1.9.2 ma non ci sono riuscito... Ho quindi utilizzato Ruby Enterprise Edition 1.8.7

Per cominciare ho installato un po' di pacchetti:

apt-get install build-essential zlib1g-dev tcl-dev libexpat-dev libcurl4-openssl-dev postfix apache2 mysql-server mysql-client apg geoip-bin libgeoip1 libgeoip-dev libaspell-dev aspell sqlite3 libsqlite3-dev imagemagick libpcre3 libpcre3-dev zlib1g zlib1g-dev libyaml-dev libmysqlclient15-dev apache2-dev libonig-dev libmagick++-dev zip unzip memcached git-core git-svn git-doc git-cvs irb sphinxsearch uuid uuid-dev openjdk-6-jre libssl0.9.8 libxslt1-dev

Ho scaricato e installato ActiveMQ 5.5.0:

wget http://www.powertech.no/apache/dist/activemq/apache-activemq/5.5.0/apache-activemq-5.5.0-bin.tar.gz
sudo -s
tar xzvf apache-activemq-5.5.0-bin.tar.gz -C /usr/local/
echo "export ACTIVEMQ_HOME=/usr/local/apache-activemq-5.5.0" >> /etc/activemq.conf
echo "export JAVA_HOME=/usr/" >> /etc/activemq.conf
adduser --system --no-create-home activemq
chown -R activemq /usr/local/apache-activemq-5.5.0/data

Per lanciare ActiveMQ ho utilizzato questo file, copiato in /etc/init.d:

wget /uploads/2011/06/activemq.txt
sudo mv activemq.txt /etc/init.d/activemq
sudo chmod +x /atc/init.d/activemq
sudo update-rc.d activemq defaults
sudo service activemq start

A questo punto ho scaricato da qui REE e l'ho installato:

sudo dpkg -i ruby-enterprise_1.8.7-2011.03_amd64_ubuntu10.04.deb

dopodichè ho installato RubyGems. Come dicevo prima non sono riuscito ad utilizzare RVM proprio a causa di problemi con le gemme. Per far funzionare il tutto ho dovuto installare tutte le gemme da root:

wget http://production.cf.rubygems.org/rubygems/rubygems-1.8.5.tgz
tar xzf  rubygems-1.8.5.tgz
cd rubygems-1.8.5/
sudo ruby setup.rb
echo "gem: --no-ri --no-rdoc" > ~/.gemrc

Installato RubyGems bisogna installare le gemme. ATTENZIONE: se fin qui ho più o meno seguito le guide che trovate nella webografia, per le gemme ho fatto tutt'altro. Infatti per far funzionare Gitorious, che è scritto con Rails 2.3.x, non è possibile installare le gemme as is dato che molte sono ormai incompatibili con Rails 2. Meglio far fare tutto a Bundler o specificare gemma per gemma la versione da installare. Quindi prima cloniamo il repository di Gitorious:

sudo -s
git clone git://gitorious.org/gitorious/mainline.git /var/www/gitorious
cd /var/www/gitorious
gem install bundler
bundle install
gem install -b -v 1.1 stomp
gem install rmagick passenger stompserver raspell
gem install -v=0.8.7 rake
passenger-install-apache2-module

Al termine dell'ultimo passaggio creare il file /etc/apache2/mods-available/passenger.load con quanto suggerito dallo script precedente. Nel mio caso:

LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.7/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.7
PassengerRuby /usr/local/bin/ruby

Per attivare il modulo:

a2enmod passenger
a2enmod rewrite
a2enmod ssl
a2enmod expires
service apache2 restart

Ok, adesso ho copiato i necessari script di avvio:

cp /var/www/gitorious/doc/templates/ubuntu/git-daemon /etc/init.d/
cp /var/www/gitorious/doc/templates/ubuntu/git-ultrasphinx /etc/init.d/

In /etc/init.d/git-daemon modificare GIT_DAEMON come segue:

GIT_DAEMON="/usr/bin/local/ruby /var/www/gitorious/script/git-daemon -d"

Creare anche /etc/init.d/stomp:

#!/bin/sh
# Start/stop the stompserver
#
### BEGIN INIT INFO
# Provides:          stomp
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      1
# Short-Description: Stomp
# Description:       Stomp
### END INIT INFO

test -f /usr/local/bin/stompserver || exit 0

. /lib/lsb/init-functions

case "$1" in  
start)  log_daemon_msg "Starting stompserver" "stompserver"  
    start-stop-daemon --start --name stompserver --startas /usr/local/bin/stompserver --background --user git
    log_end_msg $?
    ;;
stop)  log_daemon_msg "Stopping stompserver" "stompserver"  
    start-stop-daemon --stop --name stompserver
    log_end_msg $?
    ;;
restart) log_daemon_msg "Restarting stompserver" "stompserver"  
    start-stop-daemon --stop --retry 5 --name stompserver
    start-stop-daemon --start --name stompserver --startas /usr/local/bin/stompserver --background --user git
    log_end_msg $?
    ;;
status)  
    status_of_proc /usr/local/bin/stompserver stompserver && exit 0 || exit $?
    ;;
*)      log_action_msg "Usage: /etc/init.d/stomp {start|stop|restart|status}"
    exit 2
    ;;
esac  
exit 0

/etc/init.d/git-poller:

#!/bin/sh
# Start/stop the git poller
#
### BEGIN INIT INFO
# Provides:          git-poller
# Required-Start:    stomp
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      1
# Short-Description: Gitorious poller
# Description:       Gitorious poller
### END INIT INFO

/bin/su - git -c "cd /var/www/gitorious;RAILS_ENV=production script/poller $@"

Si possono quindi aggiungere tutti all'avvio:

chmod 755 /etc/init.d/git-ultrasphinx /etc/init.d/git-daemon /etc/init.d/stomp /etc/init.d/git-poller  
update-rc.d stomp defaults  
update-rc.d git-daemon defaults  
update-rc.d git-ultrasphinx defaults  
update-rc.d git-poller defaults

Bisogna creare la configurazione di apache. Gitorious utilizza SSL per il login, quindi i VirtualHost sono 2, io ho creato il file /etc/apache2/sites-available/gitorious:

<VirtualHost *:80>  
  ServerName MIODOMINIO
  DocumentRoot /var/www/gitorious/public
</VirtualHost>  
<IfModule mod_ssl.c>  
  <VirtualHost _default_:443>
    ServerName MIODOMINIO
    DocumentRoot /var/www/gitorious/public
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
  </VirtualHost>
</IfModule>

e quindi l'ho attivato:

a2dissite default
a2ensite gitorious

Torniamo a Gitorious che abbiamo un po' lasciato indietro. Serve un utente git che sarà il proprietario dell'applicazione:

adduser --system --home /var/www/gitorious/ --no-create-home --group --shell /bin/bash git
chown -R git:git /var/www/gitorious
su - git
cd /var/www/gitorious
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
mkdir -p tmp/pids repositories tarballs
cp config/database.sample.yml config/database.yml
cp config/gitorious.sample.yml config/gitorious.yml
cp config/broker.yml.example config/broker.yml

Modificare config/database.yml lasciando soltanto la sezione production e le sue configurazioni. Inserire un utente MySQL con permessi sul database gitorious_production (se non volete creare a mano questo db utilizzate un utente in grado di creare database). Nel file config/gitorious.yml inserite:

production:
  cookie_secret: "FRASESEGRETISSIMAELUNGHISSIMA"
  repository_base_path: "/var/www/gitorious/repositories"
  gitorious_client_port: 80
  gitorious_client_host: gitorious.dw
  gitorious_host: gitorious.dw
  archive_cache_dir: "/var/www/gitorious/tarballs"
  archive_work_dir: "/tmp/tarballs-work"
  hide_http_clone_urls: true
  is_gitorious_dot_org: false

Per il valore di cookie_secret utilizzate l'output del comando apg -m 64.
Ho avuto dei problemi con ActiveSupport, del tipo:

uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)

come suggerito qui li ho superati inserendo require 'thread' in config/boot.rb dopo RAILS_ROOT.

A questo punto si può procedere con la migrazione:

su - git
cd /var/www/gitorious
export RAILS_ENV=production
rake db:create
rake db:migrate
rake ultrasphinx:bootstrap

L'ultimo comando dovrebbe restituire un errore ma comunque crea il file di configurazione, che va editato per evitare l'errore. Il file è  config/ultrasphinx/production.conf in cui va sostituito base_tags con tags. Effettuata la sostituizione su può lanciare Sphinx con:

rake ultrasphinx:index RAILS_ENV=production
rake ultrasphinx:daemon:start RAILS_ENV=production

Per l'aggiornamento degli indici ho creato il file /etc/cron.d/ultrasphinx:

* */1 * * *       git     cd /var/www/gitorious && /usr/local/bin/rake ultrasphinx:index RAILS_ENV=production

Prima di accedere a Gitorious bisogna creare l'utente admin lanciando, come git, il comando:

env RAILS_ENV=production ruby script/create_admin

Riavviamo i servizi (ed eventualmente il server per essere sicuri che al riavvio Gitorious funzioni correttamente):

service git-daemon start
service apache2 restart

Colleghiamoci al sito e, se tutto è andato bene, iniziamo ad utilizzare Gitorious!

Resta un'ultima cosa da fare per poter pushare correttamente, ovvero creare un link simbolico al file /var/www/gitorious/script/gitorious in una cartella presente nella PATH dell'utente git, io l'ho creato in /usr/local/bin:

ln -s /var/www/gitorious/script/gitorious /usr/local/bin/

Senza questo passaggio al momento del push ottenevo un singolare quanto criptico errore da git:

bash: gitorious: comando non trovato

Webografia

blog comments powered by Disqus