Dans cet article, nous allons voir comment pousser un projet Ruby on Rails sur Upsun en utilisant la puissance de devenv.sh.
Devenv est un outil de développement local, similaire à Docker Compose mais sans l'étape de construction du conteneur, ce qui signifie qu'il est plus rapide et reproductible car il utilise Nix, un puissant outil de gestion de paquets et de configuration du système. Si vous êtes un débutant en Rails et que vous voulez essayer l'outillage Nix comme environnement de développement sans aller trop loin, il est plus rapide de le faire sur votre Linux et MacOS comparé à docker-compose ou devbox puisqu'ils se concentrent tous les deux sur les conteneurs. Et comme il dispose déjà d'un grand nombre de langages et de services intégrés, Nix est un outil assez facile à tester.
La première étape consiste à suivre votre méthode d'installation préférée pour installer devenv.sh. Jerecommande l'utilisation d'un flake qui vous permet d'ajouter experimental-features = nix-command flakest à
~/.config/nix/nix.conf.
Une fois que vous avez installé devenv.sh avec succès, il est temps de créer un nouveau projet Rails en utilisant la commande suivante - nous pouvons sauter le bundle puisque nous le gérerons sur devenv plus tard.
> rails new rails-7-mysql --database=mysql --skip-bundle
Ensuite, créez les fichiers de base avec cette commande :
> devenv init - Création de .envrc - Création de devenv.nix - Création de devenv.yaml - Création de .gitignore
Comme vous pouvez le voir, devenv va générer un .envrc pour direnv afin de mettre en place l'activation automatique du shell lorsque vous entrez dans votre projet et le fichier devenv.nix contiendra la définition du projet - nous en reparlerons plus tard.
Pour l'instant, vous pouvez commencer à ajouter des paquets au fichier devenv.nix :
# https://devenv.sh/packages/ packages = with pkgs ; [ git ruby_3_3 pkg-config libyaml.dev openssl.dev ] ;
L'étape suivante consiste à configurer les choses pour que vous puissiez entrer dans l'interpréteur de commandes de devenv. Lorsque vous allez dans le répertoire de votre projet, il va charger l'environnement dont il a besoin pour remplacer le PATH par nixpkgs au lieu de locals et exécuter les commandes qui y sont définies. Je préfère lancer `bundle` à chaque fois pour installer les dépendances du projet et m'assurer que nous avons toujours les dernières dépendances récupérées et que nous ne rencontrons pas de problèmes lorsque nous passons à l'environnement devenv.
enterShell = '' git --version ruby --version bundle '' ; # https://devenv.sh/languages/ languages.ruby = { enable = true ; package = pkgs.ruby_3_3 ; } ;
Si les gems commencent à échouer - un exemple d'erreur lors de la construction peut être vu ci-dessous - il se peut que vous deviez installer postgresql
ou libmysqlclient
pour résoudre le problème :
W : Gem::Ext::BuildError : ERROR : Failed to build gem native extension. W : W : current directory : /app/vendor/bundle/ruby/3.2.0/gems/psych-5.1.1/ext/psych W : /nix/store/7apky1wg5v258lk066d6xw1g3ddmy6dn-ruby-3.2.2/bin/ruby extconf.rb W : checking for yaml.h... no W : yaml.h not found W : *** extconf.rb failed *** W : Could not create Makefile due to some reason, probably lack of necessary W : libraries and/or headers.
Depuis le terminal, vous pouvez trouver le bon paquetage en lançant le shell interactif nix repl --file '<nixpkgs>'
et en explorant les sorties des paquets avec libmysqlclient.outputs
. Habituellement, les sorties dev
contiennent les en-têtes nécessaires aux gemmes compilées, par exemple libyaml.dev
pour la gemme Ruby YAML parser .
Depuis le navigateur, allez sur https://search.nixos.org/packages qui montre aussi les sorties - la plupart du temps c'est dev
et peut être ajouté à la liste des paquets
dans devenv.nix.
Une fois que votre bundle est complet, tout d'abord félicitations, cela peut être délicat parfois avec les dépendances, et vous pouvez maintenant passer aux services.
Pour une base de données MySQL, n'oubliez pas d'ajouter libmysqlclient.dev
à la liste des paquets, sinon la gem mysql2 ne se compilera pas :
services.mysql = { enable = true ; package = pkgs.mysql ; initialDatabases = [{ name = "rails_7_mysql_development" ; }] ; ensureUsers = [ { name = "root" ; password = "" ; ensurePermissions = { "rails_7_mysql_development.*" = "TOUS LES PRIVILÈGES" ; } ; } ] ; } ;
Pour que le serveur rails démarre lors de l'utilisation de devenv up
, il suffit d'ajouter la commande suivante aux processus :
processes.rails.exec = "rails server" ;
À ce stade, vous devriez être en mesure de développer localement, de mettre à jour votre Gemfile.lock, et d'exécuter des migrations de base de données et des tests. Appréciez la rapidité de l'installation et du développement !
Pour générer la configuration de base d'Upsun, vous pouvez lancer upsun project:init
, qui vous posera quelques questions et générera .upsun/config.yaml
. Nous sommes en train d'intégrer la pile Rails à la commande project:init
, vous devrez donc ajouter quelques éléments à la configuration comme vous pouvez le voir ci-dessous. N'oubliez pas d'ajouter à Git le fichier .environment
et de le supprimer du .gitignore
Rails par défaut.
Bienvenue à Upsun ! Commençons par quelques questions. Nous avons besoin d'en savoir un peu plus sur votre projet. Cela ne prendra qu'une minute ! Quel est le langage utilisé par votre projet ? Nous supportons les langages suivants : Utilisez les flèches pour vous déplacer, tapez pour filtrer C#/.Net Core Elixir Go Java Lisp JavaScript/Node.js PHP Python > Ruby Rust - Sélectionnez tous les services que vous utilisez : Utilisez les flèches pour vous déplacer, l'espace pour sélectionner, tapez pour filtrer > [x] MariaDB [ ] MySQL [ ] PostgreSQL [ ] Redis [ ] Redis Persistent [ ] Memcached [ ] OpenSearch
Sur hooks, vous devrez faire ce qui suit :
hooks : build : | set -eux bundle install bundle exec rails assets:precompile deploy : | set -eux bundle exec rake db:migrate
Du côté des variables, vous devrez faire ce qui suit :
variables : env : PIDFILE : "tmp/server.pid" RAILS_ENV : "production"
La dernière chose est les montages pour les logs, tmp, et le stockage :
mounts : "log" : source : "tmp" source_path : "tmp" "storage" : source : "storage" : source_path : "storage" : "storage" "tmp" : source : "tmp" source_chemin : "tmp"
Une fois cela terminé, vous pouvez créer un projet avec upsun project:create
et upsun push
. Vous devriez alors voir l'index Rails par défaut si tout se passe bien. Hourra !
Vous pouvez toujours trouver plus d'informations dans notre documentation.
Merci à Eder Leão Moosmann et Paul Gilzow pour leur contribution à cet article.