Mise en place d’un RedMine actif sur Docker

Lorsque l’on développe une application, celle-ci est testée sur une machine de développement. Mais il peut être intéressant de préserver le comportement de l’application indépendamment de la machine utilisée. Pour cela, il est possible d’utiliser un Docker, qui permet la mise en place d’un environnement virtuel qui ne varie pas selon la machine sur laquelle il est déployé.

Cet article va se diviser en 2 parties :

  1. Mise en place d’un container Docker sur une machine Ubuntu.
  2. Mise en place d’une image de l’environnement de développement d’un RedMine existant.

1 . Technologies Utilisées

  • Linux Ubuntu 16.04
  • RedMine 3.3.3
  • Docker 17.03.1

2 . Déroulement du développement

2.1   Mettre à jour Linux :

Source(s) utilisée(s) : https://angristan.fr/mettre-a-jour-ubuntu-16-04-lts/

Dans un premier temps, afin d’être bien sûr de mon environnement, j’ai effectué une ‘bête’ mise à jour de Linux … sans imaginer tous les problèmes que cela allait engendrer …

Problème(s) rencontré(s) :

  1. Crash au redémarrage de la machine sur la page de chargement. Ubuntu ne se lance pas, seul le chargement des packages avec [OK] sont inscrits à l’écran.
  2. Connexion au réseau Wi-Fi, mais aucune connexion Internet.
  3. Message d’erreur rencontré lors de l’utilisation d’apt.

N: « 50unattended-upgrades.ucf-old » dans le répertoire « /etc./apt/apt.conf.d/ » a été ignoré car il utilise une extension non valable

Solution(s) apportée(s) :

  1. Suppression d’un package en passant par l’invite de commande (ctrl+alt+1).

apt-get remove insserv

  1. Suppression d’une 2ème route par défaut sur le mauvais port (eth0 au lieu de wlan0).
  2. Suppression du fichier “50unattended-upgrades.ucf-dist”

Source(s) solution(s) :

  1. https://help.directadmin.com/item.php?id=379
  2. Collègue Brice PAJOT
  3. https://forum.ubuntu-fr.org/viewtopic.php?id=1999366

2.2  Installation de Docker CE (Community Edition) pour Linux :

Source(s) utilisée(s) : https://docs.docker.com/engine/installation/linux/ubuntu/

Installation de Docker Community Edition sur la machine.

Problème(s) rencontré(s) : Aucun

Solution(s) apportée(s) : Aucune

Source(s) solution(s) : Aucune

2.3  Lancement d’un environnement RedMine sur Docker :

2.3.1  RedMine simple :

Source(s) utilisée(s) : https://hub.docker.com/_/redmine/

Dans un premier temps, j’ai mis en place un RedMine simple (qui ne s’appuie sur aucune base existante).

$ docker run -d --name some-redmine redmine

$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' some-redmine

>172.17.0.2

Aller dans le navigateur et entrer l’adresse retournée dans l’invite de commande + port 3000 : 172.17.0.2:3000

Voilà, un RedMine neuf est lancé, cependant ce n’est pas réellement ce qui nous intéressait initialement.

Problème(s) rencontré(s) : Aucun

Solution(s) apportée(s) : Aucune

Source(s) solution(s) : Aucune

2.3.2  RedMine personnalisé :

Source(s) utilisée(s) : http://www.outofpluto.com/blog/how-to-dockerize-your-outdated-redmine/

https://github.com/abgotsunami/simple-docker-redmine

Dans l’optique d’installer un RedMine personnalisé (Avec une base de donnée, des plugins, des thèmes) nous allons suivre le Tutoriel du site OutOfPluto :

Tout d’abord, récupérer les sources du GitHub pour la suite du développement, puis se placer dans le dosser ‘simple-docker-RedMine’ du git cloné.

Résumé du Tutoriel GitHub/OutOfPluto :

Création d’une boite qui contiendra la base de données de notre RedMine

docker pull busybox

docker create –name redminedata busybox

    docker pull mysql

    docker run -d –volumes-from redminedbdata -e MYSQL_ROOT_PASSWORD=<root_psswd> -e MYSQL_DATABASE=redmine -e MYSQL_USER=redmine -e MYSQL_PASSWORD=<redmine_psswd> --name tmpdb mysql

NOTE : Penser à remplacer <root_psswd> par ‘ root ’ et <redmine_psswd> par ‘ RedMine ’ dans lignes de commandes et le fichier docker-compose.yml

docker exec -ti tmpdb /bin/bash

mysql

CREATE USER ‘lwa’@’%’ IDENTIFIED BY ‘=<redmine_psswd>’;

CREATE DATABASE ‘redmine’;

GRANT ALL PRIVILEGES ON redmine.* TO ‘redmine’@’%’;

exit

exit

NOTE : Erreur dans le GitHub, écrire ‘ tmpdb ‘ à la place de ‘ db ‘.

NOTE : Une erreur peu intervenir à l’exécution de mysql, se référer aux erreurs ci-dessous (problèmes rencontrés).

docker stop tmpdb

docker rm tmpdb

(Inutile d’installer / configurer nginx dans notre situation)

Dans le fichier docker-compose.yml :

Supprimer la partie nginx

Remplacer <mydomain> par ‘ localhost ‘ à la ligne     – MAILNAME=localhost

Rajouter :

ports:

– 3000:3000

Juste en dessous de    – smtp:smtp

Changer les versions dans le fichier Dockerfile par les plus récentes :

  • ruby:2.4-slim
  • GOSU_VERSION 1.10
  • TINI_VERSION v0.14.0
  • REDMINE_VERSION 3.3.3

NOTE : Changer ruby:2.4-slim  par   ruby:2.2-slim  peut éviter quelques erreurs directement (voir liste des erreurs ci-dessous)

docker-compose build

docker-compose up

Problème(s) rencontré(s) :

  1. Erreur à l’étape 4 du github, pas les permissions pour root@localhost lors de l’exécution de mysql.
  2. Erreur lors du docker-compile build
ERROR: Service 'redmine' failed to build: The command '/bin/sh -c set -x     && curl -fSL -o /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)"     && […] && gosu nobody true' returned a non-zero code: 127
  1. Erreur lors du docker-compile build
ERROR: Service 'redmine' failed to build: The command '/bin/sh -c curl -fSL "http://www.redmine.org/releases/redmine-${REDMINE_VERSION}.tar.gz" -o redmine.tar.gz     && […] && chown -R redmine:redmine ./' returned a non-zero code: 1
  1. simpledockerredmine_redmine_1 exited with code 2 lors de   docker-compile up
  2. simpledockerredmine_redmine_1 exited with code 1 lors de docker-compile up En remontant plus haut on aperçoit également :
 /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.2.7.1/lib/active_support/core_ext/numeric/conversions.rb:121: warning: constant ::Fixnum is deprecated

/usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.2.7.1/lib/active_support/core_ext/numeric/conversions.rb:121: warning: constant ::Bignum is deprecated

rake aborted!

Solution(s) apportée(s) :

  1. mysql -u root -p  à la place de      mysql
  2. Ajout de RUN apt-get update && apt-get install -y apt-transport-https && apt-get install -y curl   dans le fichier Dockerfile avant la ligne :

#grab gosu for easy step-down from root

(Ecrire ligne 5)

  1. la ligne && echo “$REDMINE_DOWNLOAD_MD5 redmine.tar.gz” | md5sum -c – \  dans le fichier docker-compose.yml pose soucis, car la vérification de la variable  $REDMINE_DOWNLOAD_MD5  n’est pas connue en brut pour la version de RedMine 3.3.3, j’ai simplement retiré cette ligne. (On peut éventuellement la commenter ou chercher la valeur en ligne).
  2. Exécuter :

docker logs simpledockerredmine_redmine_1

On s’aperçoit qu’il y a un ‘ ” ‘ manquant dans le fichier docker-entrypoint.sh ligne 54

  1. RedMine 3.3.3 ne supporte pas Ruby 2.4 et 2.3, changer ruby:2.4-slim  par   ruby:2.2-slim dans le fichier Dockerfile

Source(s) solution(s) :

  1. http://askubuntu.com/questions/401449/error-104528000-access-denied-for-user-rootlocalhost-using-password-no
  2. http://www.redmine.org/issues/25109

2.4  Intégration de la base de données d’un RedMine existant :

Source(s) utilisée(s) : http://www.outofpluto.com/blog/how-to-dockerize-your-outdated-redmine/

Tout d’abord, faire une sauvegarde de la base de données du RedMine actuel, créer un fichier recover.sh contenant :

#!/bin/bash

/usr/bin/mysqldump -u redmine -pmy_password redmine |gzip > ./redmine_db`date +%y_%m_%d`.gz

Exécuter. recover.sh

Le .gz contient un fichier, extraire ce fichier, le renommer en .sql

(Pendant que le docker RedMine est lancé)

(Pour lancer un docker sans avoir besoin d'une console active, utiliser l'argument -d après docker-compose up)

 docker cp backup_db/redmine_db17_04_13.sql simpledockerredmine_db_1:/

 docker exec -ti simpledockerredmine_db_1 /bin/bash



 mysql -u RedMine -predmine -D RedMine < /redmine_db17_04_13.sql

 rm redmine-db17_04_13.sql

 exit

NOTE : Remplacer 17_04_13 par la date du fichier .sql (date actuelle)

Enfin, associer maintenant les fichiers présents sur notre RedMine actuel avec le RedMine du Docker.

docker inspect --format "{{ .Mounts }}" simpledockerredmine_redmine_1

 [{bind  /var/lib/docker/volumes/24d85b9a6996844d7c1260a19b200e49a1001a7b40962377b5d40ef4c323694f/_data /usr/src/redmine/files  rw true }]

 sudo cp -r <REDMINE_PATH>/files/* /var/lib/docker/volumes/24d85b9a6996844d7c1260a19b200e49a1001a7b40962377b5d40ef4c323694f/_data

NOTE : <REDMINE_PATH> est le chemin vers le RedMine (éventuellement. si on se place à la racine du RedMine)

NOTE : La partie longue (/var/lib/docker/volumes/24…/_data) est propre au résultat obtenu par la commande précédente

Voilà, le RedMine du Docker possède maintenant la même base de données (utilisateurs, fichiers, etc. …) que le RedMine précédent.

Problème(s) rencontré(s) : Aucun

Solution(s) apportée(s) : Aucune

Source(s) solution(s) : Aucune

2.5  Ajout de Plugins et Thèmes :

Source(s) utilisée(s) : http://www.outofpluto.com/blog/how-to-dockerize-your-outdated-redmine/

2.5.1  Ajouter un plugin custom ou existant sur la machine :

Pour ajouter un plugin déjà présent sur le pc, créer un .tar.gz de celui-ci puis le mettre dans le répertoire RedMine/plugins de notre répertoire Docker.

Dans le fichier Dockerfile, sous la catégorie #install some plugins, écrire :

COPY RedMine/monplugin.tar.gz /usr/src/RedMine/plugins/

RUN tar xzf /usr/src/RedMine/plugins/monplugin.tar.gz -C /usr/src/RedMine/plugins/ \

    && rm /usr/src/RedMine/plugins/monplugin.tar.gz

Puis dans l’invite de commande :

docker-compose stop

docker-compose build

docker-compose up -d
2.5.2  Ajouter un plugin depuis un github :

Dans le cas d’un plugin qui provient directement d’un GitHub, il est possible de l’intégrer par lien. Dans le fichier Dockerfile, sous la catégorie #install some plugins, écrire :

RUN git clone <adresse_github>.git <nom_repertoire_plugin> && mv <nom_repertoire_plugin> /usr/src/RedMine/plugins/

<adresse_github> est l’adresse à laquelle se trouve le plugin à télécharger ex : https://github.com/onozaty/redmine-parent-issue-filter

<nom_repertoire_plugin> est le nom que doit porter le répertoire du plugin ex : parent_issue_filter

le nom du répertoire peut être connu en regardant dans le fichier init.rb du plugin : RedMine::Plugin.register :parent_issue_filter do

Exemple final :

RUN git clone https://github.com/onozaty/redmine-parent-issue-filter.git parent_issue_filter && mv parent_issue_filter /usr/src/redmine/plugins/
2.5.3  Ajouter un thème :

Pour ajouter un thème, il suffit d’appliquer exactement la même méthode que pour l’ajout d’un plugin. Dans le fichier Dockerfile, sous la catégorie #install theme, écrire :

RUN git clone <adresse_github>.git && mv <nom_repertoire_theme> /usr/src/redmine/public/themes/<nom_theme>

COPY redmine/themes/<nom_theme>/stylesheets/ /usr/src/redmine/public/themes/<nom_theme>/stylesheets/

Ici le répertoire n’a pas besoin d’être renommé (il peut l’être, de la même manière que pour le plugin si le nom ne convient pas).

<nom_theme> est le nom que vous choisirez de donner au thème.

Problème(s) rencontré(s) : Aucun

Solution(s) apportée(s) : Aucune

Source(s) solution(s) : Aucune

3. Durée de développement

Le développement de ce module a duré 2 jours du 04/12 au 04/13.

4. Commentaires supplémentaires

Une partie du développement a été consacrée à la lecture de la documentation Docker (et à la résolution des problèmes engendrés par la mise à jour de Linux).

 

Auteur : Alexandre BOUDINE