Gitlab permet en un clic d'importer un projet depuis github donc ce n'est pas un problème du tout. Ce qui est plus problématique c'est le déploiement automatisé via Travis.

Gitlab propose Gitlab-CI et j'ai donc commencé à regarder comment déployer mon petit site en automatique suite à ma migration vers Gitlab.

La documentation

Elle est disponible ici et est plutôt bien faite.

Sélection d'un runner

Les options de paramétrage (settings) sont en haut à droite du projet (la petite roue). Il faut cliquer sur "Runners".

Cette page affiche les différents runners disponibles pour le projet.

Dans les specific runners, j'ai eu la mauvaise experience de tomber sur des runners tournant sur Windows. Donc tout d'abord, supprimons tous les specific runners disponibles à gauche affin d'utiliser un des shared runner pour notre projet.

Puis, nous allons copier le tocken d'un des shared runner qui serra celui utilisé par défaut par notre projet.

Configuration du runner

Cliquer sur CI/CD Pipelines dans le paramétrage.

Une fois la page affichée, dans la partie Runners token, entrons notre tocken précédemment copié.

On voit aussi l'état du build dans la partie Build status, copions le code pour l'afficher dans le README du projet.

On enregistre les changements et on va sur la page principale du projet.

Ajout du fichier yml

Tout d'abord, collons dans le README le code affichant le statut du build.

Puis on va cliquer sur Set Up CI. On peut ici sélectionner un code tout prêt pour notre projet selon le code utilisé. Mais avant d'enregistrer, on peut tester la config CI avec ce lien ça fait un retour à le mode Swagger.

Si on arrive de Travis, on est un peu perdu. Gitlab-CI ressemble plus à du Docker au premier abord. Heureusement ils mettent à disposition des documentations (que l'on peut enrichir) pour la mise en place de tests pour différents langages ici.

Je suis donc passé d'un fichier Travis comme celui-ci (avec mon api_key encrypté mais visible)

language: ruby
rvm:
- 2.0.0
script: bundle exec jekyll build --source octopress
deploy:
  provider: heroku
  api_key:
    secure: GvMuv4JRP8Bz/nU4Qnk/LyqhN5KhBXJuR4M1Uzb+86HHA6gYSBJSuBgJhv8qz/vadUWDWtPGXXYdGTbV5OfzPmOQczVTkb/zUr0JWHkI8DPcAyRX64CRmWqKtv+PYzdWiEoyhqHmWmCKDdABnK2kAy/VVOsouMQI5/IrRb+ezG32KmmA10hBZe9pPzkh+nU6bmoeYh2Z3IL9moqSaC2Lk7ulzR3FrRG1OhPJGcriL4bgbiEre8x9Oq90KOiwbykHkIFLlBVP6GALVLicnNDrYtCVNJQzEQqHm0PHU1GZcstS4YvBWU0bGK349C8Faj1iwVW6ZAaVoBEPpLrI412gIKo8QBLWlvbB6rlZsLPUI7SOSrkb2dEKSjnEKwXbyibr8FdjxtBlmdirJ1yBBIEyLOl/B3RtchjOlOYBTtYmAx4PIMHX8JyIuvWoLOdP1Fs61OCbwX2XZpOKXFMYQM2Asg1lLv8l4uiZRr7DODu9xF6x8KZPze4vpLfiFv3zVWfQrmSDXkQgx/HR5+fGTTFojlBszshQhG9rnjyDjC1x/JjzZe1/iVgXF/P+k+S3/rBC10ssXrmwNnlj7JfbJqZ/1mPmWYcwr462k2xme2KXR9bw/pea2G470qyfstFj8kUPEhacZ2GBFXB8e3tk38zLSk5fJUoySx5LDk9LHK0jDqo=
  app: mon-site
  on:
    repo: alain-andre/mon_site

A ce fichier là avec les variables d'environnement que j'ai enregistré dans le projet sous Gitlab via l'option Variables du paramétrage.

Attention, récupérez bien la clé sous Heroku pour la valeur de $HEROKUPRODUCTIONAPI_KEY et non celle encryptée qu'il y avait sous Travis.

image: "ruby:2.0"

# Cache gems in between builds
cache:
  paths:
    - vendor/ruby

before_script:
  - apt-get update >/dev/null
  - apt-get install -y locales >/dev/null
  - echo "en_US UTF-8" > /etc/locale.gen
  - locale-gen en_US.UTF-8
  - export LANG=en_US.UTF-8
  - export LANGUAGE=en_US:en
  - export LC_ALL=en_US.UTF-8

test:
  script:
  - ruby -v                                          # Print out ruby version for debugging
  - apt-get update -q && apt-get install nodejs -yqq # rails app needs a JS runtime
  - gem install bundler  --no-ri --no-rdoc           # Bundler is not installed with the image
  - bundle install -j $(nproc) --path vendor         # Install dependencies into ./vendor/ruby
  - bundle exec jekyll build --source octopress

production:
  type: deploy
  environment: production
  script:
  - gem install dpl
  - dpl --provider=heroku --app=$HEROKU_PRODUCTION_APP_NAME --api-key=$HEROKU_PRODUCTION_API_KEY
  - "curl -n -X POST https://api.heroku.com/apps/$HEROKU_PRODUCTION_APP_NAME/ps -H \"Accept: application/json\" -H \"Authorization: Bearer ${HEROKU_PRODUCTION_API_KEY}\""
  only:
  - master

Contrôle des tests

Tout est disponible dans la partie pipelines du projet.

L'interface est propre, on y distingue la partie test du déploiement, les logs sont disponibles. Rien à dire c'est cool.

Ce que j'ai beaucoup aimé c'est l’exécution des tests dans des systèmes encapsulés. Pour mon premier build, j'ai utilisé un runner mutualisé et les tests ne passaient pas alors que sur Travis ils passaient.

Conversion error: Jekyll::Converters::Scss encountered an error while converting 'css/main.scss':
                    Invalid US-ASCII character "\xC3" on line 2

Après pas mal de recherches et de tests infructueux, j'ai finalement compris que l'image utilisée par mon runner (la ruby:2.0) ne disposait pas des encodages UTF-8. Il fallait donc les mettre à disposition comme indiqué dans cette issue.

Conclusion

Je ne suis pas un professionnel de Travis, mais ce que propose Gitlab-CI est assez impressionnant et j'aime beaucoup.

  • On peut créer son propre Runner (versionné pour notre prod par exemple).
  • On peut tester la syntaxe de sa configuration.
  • Les tests sont basés sur des images donc versionné.
  • On peut utiliser des variables d'environnement.
  • On peut livrer la branche que l'on souhaite dans l'environnement voulu.

Publié dans les catégories suivantes

bac a sable
comments powered by Disqus

Téléphone

+33 637 700 504

Adresse

Bordeaux, 33300
France