Travis, Deploy on his server with Bash Script

Travis, Deploy on his server with Bash Script

Depuis peu ma méthode de déploiement continu ne fonctionnait plus côté Travis.

J'avais fait les choses de manière un peu brute, rsync du build fait chez Travis, puis redémarrage du service via SSH. J'ai donc décidé de switcher sur quelque chose de plus propre :) .

Après quelques tests et un changement de méthode tout est ok, j'en profite pour décrire rapidement la méthodologie mise en place pour exécuter du ssh sur son serveur privé depuis Travis, avec interprétation des variables d'Environnement et des fonctions sur le serveur distant.


1/ Travis <-> Server

Il faut pour commencer autoriser Travis à se connecter à votre server. Cela se fera par un ensemble de clés privé/public.

Pour permettre à l'environnement généré par Travis d'utiliser votre clé, il faudra lui la fournir, via votre Repo Git, et donc la chiffrer. Heureuemsement, Travis a tout prévu.

Generate Key

ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys"

Install Travis

sudo gem install travis

Generate and add Encrypt Key to .travis.yml

mkdir /PATH_TO_YOUR_PROJECT_GIT/.travis
cp ~/.ssh/id_rsa /PATH_TO_YOUR_PROJECT_GIT/.travis/deploy_key
cd /PATH_TO_YOUR_PROJECT_GIT/.travis
travis encrypt-file deploy_key --add
rm -rf deploy_key #IMPORTANT

/!\ Vous devez garder uniquement le fichier deploy_key.enc sur votre repo. N'ajoutez jamais le deploy_key. Si jamais vous faites l'erreur, révoquez immédiatement les clés précédement généré.

Vous verrez alors deux lignes ajoutées à votre Travis.yml :

before_install:
- openssl aes-256-cbc -K $encrypted_XXX_key -iv $encrypted_XXX_iv -in ./.travis/deploy_key.enc -out ./.travis/deploy_key -d

Assurez vous que les Paths soient les bons, puis vous pouvez pousser le travail.

git commit -a
git push

Normalement, Travis et votre serveur sont maintenant apte à communiquer.

1/ Travis -> SSH on your server

Travis.yml

Il vous suffit d'informer travis qu'il va devoir exécuter un script :

deploy:
  skip_cleanup:    true
  provider:        script
  script:          scripts/deploy-travis.sh
  on:
    branch: master
    node: 7
    os: linux

A vous de jouer avec les conditions, vous avez ici un exemple Node, Os, Branch. A noté que tout cela sera aussi gérable dans votre scripts/deploy-travis.sh.

if ! [[ $TRAVIS_TAG ]]; then exit 0; fi

Script Bash

#!/bin/bash

eval "$(ssh-agent -s)" # Start ssh-agent cache
chmod 600 $TRAVIS_BUILD_DIR/.travis/deploy_key # Allow read access to the private key
ssh-add $TRAVIS_BUILD_DIR/.travis/deploy_key # Add the private key to SSH

ssh -p $SSH_PORT $SSH_USER@$SSH_SERVER -o StrictHostKeyChecking=no "$( cat <<EOT
  echo "$(date -u) Deploy '${PROJECT}'"  >> ./deploy.log
  exit
EOT
)"

ou SSH_PORT SSH_USER SSH_SERVER PROJECT sont des variables déclaré via l'interface de Travis, dans "More Options" / "Settings".

Après cela nous avons plusieurs options, soit :

  • vous réalisez un pull via le script ssh et réeffectuez un build puis lancer votre application sur votre server
  • vous poussez les nouveautés depuis le Bash, via git, cela s'appelle Remonte Git repository, puis via ssh vous réeffectuer un build puis lancer votre application sur votre serveur
  • vous pouvez toujours faire un rsync du build côté Travis vers votre serveur, puis redémarrer le tout via ssh

Have fun 😊