Modifications entre les versions 3 et 9 (s'étendant sur 6 versions)
Version 3 à la date du 2010-01-27 11:28:24
Taille: 5945
Éditeur: ThomasNoël
Commentaire: cron LDAP vers groupe AUF
Version 9 à la date du 2012-09-21 23:37:13
Taille: 12735
Commentaire: mise à jour des patch AuF
Texte supprimé. Texte ajouté.
Ligne 7: Ligne 7:
On a décidé d'installer la version 0.9 (actuellement en finalisation) de façon «classique», c'est à dire sans passer par un paquet Debian. Le framework Rails est également installé directement, via le système «gem» de Ruby. Quelques paquets viennent des backports.

Sources d'inspiration : 
On a décidé d'installer la version 1.0-stable (svn) sans passer par un paquet Debian. Le framework Rails est également installé directement, via le système «gem» de Ruby. Quelques paquets viennent des backports.

Sources d'inspiration :
Ligne 32: Ligne 32:
# aptitude install ruby  # aptitude install ruby
Ligne 56: Ligne 56:
== Téléchargement de redmine 0.9-stable via svn == == Téléchargement de redmine 1.0-stable via svn ==
Ligne 62: Ligne 62:
# svn checkout http://redmine.rubyforge.org/svn/branches/0.9-stable redmine-0.9
# ln -s redmine-0.9 redmine
# svn checkout http://redmine.rubyforge.org/svn/branches/1.0-stable redmine-1.0
# ln -s redmine-1.0 redmine
Ligne 151: Ligne 151:
== Remplissage automatique du groupe AUF (par cron) == == Création automatique des comptes depuis le LDAP ==
Ligne 155: Ligne 155:
On désire que tous les utilisateurs qui ont été créés via l'authentification LDAP se retrouvent dans le groupe AUF. Une technique très-bête-mais-qui-marche : Script lancé en cron toutes les 5 minutes : [[attachment:sync_ldap.sh]]

== Synchronisation des dépôts git ==

Un cron est installé qui met à jour tous les dépôts `/srv/git/*.git` :
Ligne 159: Ligne 163:

# ajout des utilisateurs loggues via LDAP dans le groupe AUF
#
# script à lancer en cron, par exemple toutes les 5 minutes, avec le user "redmine"
# => */5 * * * * redmine /opt/redmine/ldap_dans_groupe_auf.sh
#

cat << EOF | /opt/redmine/script/console production 2>&1 > /dev/null
g = Group.find(4)
u = User.find_all_by_auth_source_id(1) - g.users
g.users << u
if u != []
    STDERR.write("\nredmine : ajout d'utilisateur LDAP dans le groupe AUF\n\n")
    for n in u
        STDERR.write(" - ")
        STDERR.write(n)
        STDERR.write("\n")
    end
    STDERR.write("\n-- \ncron ldap_dans_groupe_auf.sh sur redmine.auf.org\n")
end
EOF
}}}
# sources d'inspiration
# http://mult.ifario.us/p/integrating-github-and-redmine
# http://www.redmine.org/wiki/redmine/RedmineRepositories

# mise a jour des depots
for git in `ls -d /srv/git/*.git`
do
        echo "git fetch $git"
        cd $git
        git --bare fetch origin :master
        #git reset refs/remotes/origin/master > /dev/null #selon doc redmine, mais est-ce necessaire ?
done

# mise a jour du suivi par redmine
# (optionnel, car de toute façon ça serait fait lors du premier acces a chaque depot)
echo "mise a jour redmine (Repository.fetch_changesets)"
cd /opt/redmine
./script/runner "Repository.fetch_changesets" -e production
}}}

Pour activer un nouveau dépôt sur la machine, il suffit donc de faire quelque chose comme :
 {{{
    root@redmine# su - redmine
 redmine@redmine$ cd /srv/git
 redmine@redmine$ git clone --bare git://git.auf.org/xxxx.git xxxx.git
 redmine@redmine$ cd xxxx.git
 redmine@redmine$ git --bare remote add origin git://git.auf.org/xxxx.git
}}}

Voir aussi [[Git/DépôtGit]]

== Patches AUF ==

Ces modifications ont été apportées au redmine installé :

 * --(utilisation correcte de `git` pour les projets avec dépôt git :)-- plus nécessaire depuis 1.0
 {{{
--- lib/redmine/scm/adapters/git_adapter.rb (revision 3762)
+++ lib/redmine/scm/adapters/git_adapter.rb (working copy)
@@ -22,7 +22,7 @@
     module Adapters
       class GitAdapter < AbstractAdapter
         # Git executable name
- GIT_BIN = "git"
+ GIT_BIN = "/usr/bin/git"

         def info
           begin
}}}
 * --(ne pas afficher les descriptions dans la liste des projets (https://redmine.auf.org/projects) :)-- mieux géré en 1.0
 {{{
--- app/helpers/projects_helper.rb (revision 3762)
+++ app/helpers/projects_helper.rb (working copy)
@@ -70,7 +70,7 @@
         classes = (ancestors.empty? ? 'root' : 'child')
         s << "<li class='#{classes}'><div class='#{classes}'>" +
                link_to(h(project), {:controller => 'projects', :action => 'show', :id => project}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
- s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
+ # s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
         s << "</div>\n"
         ancestors << project
       end
}}}
 * permettre des logins de 60 caractères : http://www.redmine.org/attachments/1642/0001-Fixes-2719.patch
 * rendre accessible l'URL demandée initialement
 {{{
--- app/helpers/application_helper.rb (révision 6284)
+++ app/helpers/application_helper.rb (copie de travail)
@@ -766,6 +766,12 @@
     form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
   end

+ def back_url_link
+ back_url = params[:back_url] || request.env['HTTP_REFERER']
+ back_url = CGI.unescape(back_url.to_s)
+ CGI.escape(back_url)
+ end
+
   def back_url_hidden_field_tag
     back_url = params[:back_url] || request.env['HTTP_REFERER']
     back_url = CGI.unescape(back_url.to_s)
}}}
 * ajouter l'accès id.auf (SSO/SLO) sur la page de login :
 {{{
--- app/views/account/login.rhtml (révision 7077)
+++ app/views/account/login.rhtml (copie de travail)
@@ -3,13 +3,30 @@
 <% form_tag({:action=> "login"}) do %>
 <%= back_url_hidden_field_tag %>
 <table>
+<tbody>
+<tr><td align="left"><strong>Usagers de l'AUF&nbsp;:</strong></td>
+ <td align="right">
+ <a href="/mellon/login?ReturnTo=<%= back_url_link %>" onMouseOver="document.idauf_bouton.src='/idauf_bouton_survol.png';" onMouseOut="document.idauf_bouton.src='/idauf_bouton.png';"><img id="idauf_bouton" width="200" height="32" src="/idauf_bouton.png" /></a>
+ </td>
+</tr>
+<tr><td colspan="2"><div style="position: relative; top: 0; left: 0; text-align: center;">
+ <hr style="display: inline-block; position: absolute; left: 0; width: 45%; height: 2px;" />
+ <span> ou </span>
+ <hr style="display: inline-block; position: absolute; right: 0; width: 45%; height: 2px;" />
+ </div></td>
+</tr>
+<tr><td colspan="2" align="left"><strong>Pour les usagers qui n'ont pas d'adresse @auf.org,</strong><br />utilisez le formulaire de connexion suivant&nbsp;:</strong></td></tr>
 <tr>
     <td align="right"><label for="username"><%=l(:field_login)%>:</label></td>
     <td align="left"><%= text_field_tag 'username', nil, :tabindex => '1' %></td>
 </tr>
 <tr>
     <td align="right"><label for="password"><%=l(:field_password)%>:</label></td>
- <td align="left"><%= password_field_tag 'password', nil, :tabindex => '2' %></td>
+ <td align="left"><%= password_field_tag 'password', nil, :tabindex => '2' %>
+ <% if Setting.lost_password? %>
+ &nbsp;&nbsp;<%= link_to 'Oublié ?', :controller => 'account', :action => 'lost_password' %>
+ <% end %>
+ </td>
 </tr>
 <% if Setting.openid? %>
 <tr>
@@ -20,21 +37,13 @@
 <tr>
     <td></td>
     <td align="left">
+ <input type="submit" name="login" value="<%=l(:button_login)%> &#187;" tabindex="5" style="float: right;" />
         <% if Setting.autologin? %>
         <label for="autologin"><%= check_box_tag 'autologin', 1, false, :tabindex => 4 %> <%= l(:label_stay_logged_in) %></label>
         <% end %>
     </td>
 </tr>
-<tr>
- <td align="left">
- <% if Setting.lost_password? %>
- <%= link_to l(:label_password_lost), :controller => 'account', :action => 'lost_password' %>
- <% end %>
- </td>
- <td align="right">
- <input type="submit" name="login" value="<%=l(:button_login)%> &#187;" tabindex="5"/>
- </td>
-</tr>
+</tbody>
 </table>
 <%= javascript_tag "Form.Element.focus('username');" %>
 <% end %>
}}}
 {{{
--- public/stylesheets/application.css (révision 7077)
+++ public/stylesheets/application.css (copie de travail)
@@ -89,7 +89,8 @@
 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
 #login-form table td {padding: 6px;}
 #login-form label {font-weight: bold;}
-#login-form input#username, #login-form input#password { width: 300px; }
+#login-form input#username { width: 300px; }
+#login-form input#password { width: 220px; }
 
 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
 
}}}
 * affichage plus claire des sous-projets d'un projet (items au lieu d'une seule liste virgulée) :
 {{{
--- app/views/projects/show.rhtml (revision 6284)
+++ app/views/projects/show.rhtml (working copy)
@@ -14,7 +14,10 @@
  <% unless @project.homepage.blank? %><li><%=l(:field_homepage)%>: <%= auto_link(h(@project.homepage)) %></li><% end %>
   <% if @subprojects.any? %>
   <li><%=l(:label_subproject_plural)%>:
- <%= @subprojects.collect{|p| link_to(h(p), :action => 'show', :id => p)}.join(", ") %></li>
+ <ul><li>
+ <%= @subprojects.collect{|p| link_to(h(p), :action => 'show', :id => p)}.join("</li><li>") %>
+ </li></ul>
+ </li>
   <% end %>
  <% @project.custom_values.each do |custom_value| %>
  <% if !custom_value.value.blank? %>
}}}

Notes sur l'installation de http://redmine.auf.org

(rappel : première version de JeanChristopheAndré : /PremiereVersion)

On a décidé d'installer la version 1.0-stable (svn) sans passer par un paquet Debian. Le framework Rails est également installé directement, via le système «gem» de Ruby. Quelques paquets viennent des backports.

Sources d'inspiration :

Préparation

Machine Debian Lenny 5.0, avec activation des backports et de volatile :

  • ajout de lenny/volatile et lenny-backports au /etc/apt/sources.list

  • création d'un fichier /etc/apt/preferences contenant :

    Explanation: autoriser les mises à jour automatiques pour les backports
    Package: *
    Pin: release a=lenny-backports
    Pin-Priority: 200
  • correction du /etc/hosts pour mettre le nom pleinement qualifié (FQDN) avant l'alias...

  • vérification du support des locales Unicode, en particulier fr_FR.UTF-8

  • installation de mysql-server, sécurisation et mise en place du support Unicode

  • installation de apache2 et mise en place du support Unicode

Installation Ruby et paquets ruby de base nécessaires

  • # aptitude install ruby
    # aptitude install irb             # facultatif, utile pour le script/console de redmine
    # aptitude -t lenny-backports install rubygems rake
    # aptitude install libopenssl-ruby
    # aptitude install libdbd-mysql-ruby mysql-client
    # aptitude install librmagick-ruby  # facultatif, permettra d'avoir des graphes dans redmine

Installation de rails 2.3.5 et dépendances (via gem)

  • # gem install rails -V -v=2.3.5
    (...)
    Successfully installed rake-0.8.7
    Successfully installed activesupport-2.3.5
    Successfully installed activerecord-2.3.5
    Successfully installed rack-1.0.1
    Successfully installed actionpack-2.3.5
    Successfully installed actionmailer-2.3.5
    Successfully installed activeresource-2.3.5
    Successfully installed rails-2.3.5
    8 gems installed

Téléchargement de redmine 1.0-stable via svn

On installe redmine dans /opt :

  • # cd /opt
    # svn checkout http://redmine.rubyforge.org/svn/branches/1.0-stable redmine-1.0
    # ln -s redmine-1.0 redmine

Configuration de redmine

Création de la base MySQL redmine09 et de l'utilisateur correspondant :

  • create database redmine09 character set utf8;
    create user 'redmine'@'localhost' identified by 'trucmachin';
    grant all privileges on redmine09.* to 'redmine'@'localhost';

Connexion de redmine à cette base :

  • # cat > config/database.yml << EOF
    production:
      adapter: mysql
      database: redmine09
      host: localhost
      username: redmine
      password: trucmachin
      encoding: utf8
    EOF

Initialisation de redmine

  • $ rake generate_session_store
    $ export RAILS_ENV=production
    $ rake db:migrate
    $ rake redmine:load_default_data
    $ rake db:migrate_plugins  # est-ce nécessaire ? je ne pense pas, mais ça fait pas de mal.

Mise en production via mongrel

(note : ceci est inspiré de http://doc.ubuntu-fr.org/redmine#configuration)

Mongrel est un serveur HTTP qui va propulser redmine sur un port local (127.0.0.1:3000). C'est ensuite apache qui rendra redmine visible de l'extérieur en HTTPS (voir ci-dessous) :

  • # aptitude install mongrel

Création d'un utilisateur dédié à redmine et mise en place des droits d'accès :

  • # adduser --system redmine --home /opt/redmine --no-create-home --group --gecos "redmine system user" --disabled-login --disabled-password
    # cd /opt/redmine
    # chown -R redmine:redmine log files tmp plugin/plugin_assets

Ajout d'un script de démarrage de redmine via mongrel : /etc/init.d/redmine_mongrel, et activation de ce script avec update-rc.d redmine_mongrel defaults

Mise à disposition en HTTPS avec apache

Activation des modules d'apache2 nécessaires :

  • # a2enmod proxy proxy_http ssl

On installe le certificat et la clé SSL pour *.auf.org et on configure le site dans /etc/apache2/sites-enabled/redmine.auf.org :

  • <VirtualHost *:443>
            (...)
            SSLEngine on
            SSLCertificateFile    /.../all-auf.org.crt
            SSLCertificateKeyFile /.../all-auf.org.key
            SSLCACertificateFile  /.../CA.pem
            SSLVerifyClient None
            (...)
            ProxyPreserveHost Off
            ProxyPass        /  http://127.0.0.1:3000/
            ProxypassReverse /  http://127.0.0.1:3000/
            <Proxy *>
                    Order allow,deny
                    Allow from all
            </Proxy>
    </VirtualHost>
    
    <VirtualHost *:80>
            ServerAdmin webmaster@auf.org
            ServerName redmine.auf.org
            Redirect permanent / https://redmine.auf.org/
    </VirtualHost>

Création automatique des comptes depuis le LDAP

Note : ceci suppose que l'authentification LDAP a été activée dans redmine, et que le groupe AUF existe.

Script lancé en cron toutes les 5 minutes : sync_ldap.sh

Synchronisation des dépôts git

Un cron est installé qui met à jour tous les dépôts /srv/git/*.git :

  • # sources d'inspiration
    # http://mult.ifario.us/p/integrating-github-and-redmine
    # http://www.redmine.org/wiki/redmine/RedmineRepositories
    
    # mise a jour des depots
    for git in `ls -d /srv/git/*.git`
    do
            echo "git fetch $git"
            cd $git
            git --bare fetch origin :master
            #git reset refs/remotes/origin/master > /dev/null  #selon doc redmine, mais est-ce necessaire ?
    done
    
    # mise a jour du suivi par redmine
    # (optionnel, car de toute façon ça serait fait lors du premier acces a chaque depot)
    echo "mise a jour redmine (Repository.fetch_changesets)"
    cd /opt/redmine
    ./script/runner "Repository.fetch_changesets" -e production

Pour activer un nouveau dépôt sur la machine, il suffit donc de faire quelque chose comme :

  •     root@redmine# su - redmine
     redmine@redmine$ cd /srv/git
     redmine@redmine$ git clone --bare git://git.auf.org/xxxx.git xxxx.git
     redmine@redmine$ cd xxxx.git
     redmine@redmine$ git --bare remote add origin git://git.auf.org/xxxx.git

Voir aussi Git/DépôtGit

Patches AUF

Ces modifications ont été apportées au redmine installé :

  • utilisation correcte de git pour les projets avec dépôt git : plus nécessaire depuis 1.0

    --- lib/redmine/scm/adapters/git_adapter.rb     (revision 3762)
    +++ lib/redmine/scm/adapters/git_adapter.rb     (working copy)
    @@ -22,7 +22,7 @@
         module Adapters
           class GitAdapter < AbstractAdapter
             # Git executable name
    -        GIT_BIN = "git"
    +        GIT_BIN = "/usr/bin/git"
    
             def info
               begin
  • ne pas afficher les descriptions dans la liste des projets (https://redmine.auf.org/projects) : mieux géré en 1.0

    --- app/helpers/projects_helper.rb      (revision 3762)
    +++ app/helpers/projects_helper.rb      (working copy)
    @@ -70,7 +70,7 @@
             classes = (ancestors.empty? ? 'root' : 'child')
             s << "<li class='#{classes}'><div class='#{classes}'>" +
                    link_to(h(project), {:controller => 'projects', :action => 'show', :id => project}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
    -        s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
    +        # s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
             s << "</div>\n"
             ancestors << project
           end
  • permettre des logins de 60 caractères : http://www.redmine.org/attachments/1642/0001-Fixes-2719.patch

  • rendre accessible l'URL demandée initialement
    --- app/helpers/application_helper.rb   (révision 6284)
    +++ app/helpers/application_helper.rb   (copie de travail)
    @@ -766,6 +766,12 @@
         form_for(name, object, options.merge({ :builder => TabularFormBuilder, :lang => current_language}), &proc)
       end
    
    +  def back_url_link
    +    back_url = params[:back_url] || request.env['HTTP_REFERER']
    +    back_url = CGI.unescape(back_url.to_s)
    +    CGI.escape(back_url)
    +  end
    +
       def back_url_hidden_field_tag
         back_url = params[:back_url] || request.env['HTTP_REFERER']
         back_url = CGI.unescape(back_url.to_s)
  • ajouter l'accès id.auf (SSO/SLO) sur la page de login :
    --- app/views/account/login.rhtml       (révision 7077)
    +++ app/views/account/login.rhtml       (copie de travail)
    @@ -3,13 +3,30 @@
     <% form_tag({:action=> "login"}) do %>
     <%= back_url_hidden_field_tag %>
     <table>
    +<tbody>
    +<tr><td align="left"><strong>Usagers de l'AUF&nbsp;:</strong></td>
    +    <td align="right">
    +        <a href="/mellon/login?ReturnTo=<%= back_url_link %>" onMouseOver="document.idauf_bouton.src='/idauf_bouton_survol.png';" onMouseOut="document.idauf_bouton.src='/idauf_bouton.png';"><img id="idauf_bouton" width="200" height="32" src="/idauf_bouton.png" /></a>
    +    </td>
    +</tr>
    +<tr><td colspan="2"><div style="position: relative; top: 0; left: 0; text-align: center;">
    +        <hr style="display: inline-block; position: absolute; left: 0; width: 45%; height: 2px;" />
    +        <span> ou </span>
    +        <hr style="display: inline-block; position: absolute; right: 0; width: 45%; height: 2px;" />
    +    </div></td>
    +</tr>
    +<tr><td colspan="2" align="left"><strong>Pour les usagers qui n'ont pas d'adresse @auf.org,</strong><br />utilisez le formulaire de connexion suivant&nbsp;:</strong></td></tr>
     <tr>
         <td align="right"><label for="username"><%=l(:field_login)%>:</label></td>
         <td align="left"><%= text_field_tag 'username', nil, :tabindex => '1' %></td>
     </tr>
     <tr>
         <td align="right"><label for="password"><%=l(:field_password)%>:</label></td>
    -    <td align="left"><%= password_field_tag 'password', nil, :tabindex => '2' %></td>
    +    <td align="left"><%= password_field_tag 'password', nil, :tabindex => '2' %>
    +        <% if Setting.lost_password? %>
    +            &nbsp;&nbsp;<%= link_to 'Oublié ?', :controller => 'account', :action => 'lost_password' %>
    +        <% end %>
    +    </td>
     </tr>
     <% if Setting.openid? %>
     <tr>
    @@ -20,21 +37,13 @@
     <tr>
         <td></td>
         <td align="left">
    +        <input type="submit" name="login" value="<%=l(:button_login)%> &#187;" tabindex="5" style="float: right;" />
             <% if Setting.autologin? %>
             <label for="autologin"><%= check_box_tag 'autologin', 1, false, :tabindex => 4 %> <%= l(:label_stay_logged_in) %></label>
             <% end %>
         </td>
     </tr>
    -<tr>
    -    <td align="left">
    -        <% if Setting.lost_password? %>
    -            <%= link_to l(:label_password_lost), :controller => 'account', :action => 'lost_password' %>
    -        <% end %>
    -    </td>
    -    <td align="right">
    -        <input type="submit" name="login" value="<%=l(:button_login)%> &#187;" tabindex="5"/>
    -    </td>
    -</tr>
    +</tbody>
     </table>
     <%= javascript_tag "Form.Element.focus('username');" %>
     <% end %>
    --- public/stylesheets/application.css  (révision 7077)
    +++ public/stylesheets/application.css  (copie de travail)
    @@ -89,7 +89,8 @@
     #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
     #login-form table td {padding: 6px;}
     #login-form label {font-weight: bold;}
    -#login-form input#username, #login-form input#password { width: 300px; }
    +#login-form input#username { width: 300px; }
    +#login-form input#password { width: 220px; }
     
     input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
  • affichage plus claire des sous-projets d'un projet (items au lieu d'une seule liste virgulée) :
    --- app/views/projects/show.rhtml       (revision 6284)
    +++ app/views/projects/show.rhtml       (working copy)
    @@ -14,7 +14,10 @@
            <% unless @project.homepage.blank? %><li><%=l(:field_homepage)%>: <%= auto_link(h(@project.homepage)) %></li><% end %>
       <% if @subprojects.any? %>
            <li><%=l(:label_subproject_plural)%>:
    -           <%= @subprojects.collect{|p| link_to(h(p), :action => 'show', :id => p)}.join(", ") %></li>
    +         <ul><li>
    +           <%= @subprojects.collect{|p| link_to(h(p), :action => 'show', :id => p)}.join("</li><li>") %>
    +         </li></ul>
    +       </li>
       <% end %>
            <% @project.custom_values.each do |custom_value| %>
            <% if !custom_value.value.blank? %>

redmine/InstallationMontreal (dernière édition le 2019-11-25 17:36:43 par JeanChristopheAndré)