In diesem Artikel werfen wir einen Blick auf den Push-Prozess eines Ruby on Rails-Projekts auf Upsun mit Hilfe von devenv.sh.
Devenv ist ein lokales Entwicklungstool, ähnlich wie Docker Compose, aber ohne den Container-Build-Schritt, was bedeutet, dass es schneller und reproduzierbar ist, da es Nix verwendet , ein leistungsstarkes Paketmanagement- und Systemkonfigurationswerkzeug. Wenn Sie ein Rails-Anfänger sind und Nix als Entwicklungsumgebung ausprobieren wollen, ohne zu tief einzutauchen, können Sie dies auf ihrem Linux und MacOS schneller tun als mit Docker Compose oder Devbox, da sich beide auf Container konzentrieren. Und da es bereits eine Menge Sprachen und Dienste unterstützt, ist Nix ein ziemlich einfaches Tool zum Testen.
Der erste Schritt besteht darin, devenv.sh mit der von Ihnen bevorzugten Installationsmethode zu installieren - ich empfehle die Verwendung eines flake, mit dem Sie einfach experimental-features = nix-command flakes
zu ~/.config/nix/nix.conf
hinzufügen können.
Sobald Sie devenv.sh erfolgreich installiert haben, ist es an der Zeit, ein neues Rails-Projekt zu erstellen, indem Sie den folgenden Befehl verwenden, wir können das Bundle überspringen, da wir es später in devenv behandeln werden.
> rails new rails-7-mysql --database=mysql --skip-bundle
Erstellen Sie dann die Basisdateien mit diesem Befehl:
> devenv init
• .envrc erstellen
• devenv.nix erstellen
• devenv.yaml erstellen
• .gitignore erstellen
Wie Sie sehen, erzeugt devenv eine .envrc für direnv, um eine automatische Shell-Aktivierung einzurichten, wenn Sie ihr Projekt betrachten, und die devenv.nix enthält die Projektdefinition - dazu später mehr.
Für den Moment können Sie damit beginnen, einige Pakete zur devenv.nix hinzuzufügen:
# https://devenv.sh/packages/
packages = with pkgs; [
git
ruby_3_3
pkg-config
libyaml.dev
openssl.dev
];
Der nächste Schritt besteht darin, die Dinge so einzurichten, dass Sie die devenv-Shell aufrufen können. Wenn auf das Projektverzeichniss zugegriffen wird, wird die Umgebung geladen, die nötig ist, um den PATH mit nixpkgs anstelle von locals zu ersetzen und die dort definierten Befehle auszuführen. Ich ziehe es vor, `bundle` jedes Mal auszuführen, um die Projektabhängigkeiten zu installieren und sicherzustellen, dass wir immer die neuesten Abhängigkeiten haben und keine Probleme bekommen, wenn wir zur devenv-Umgebung wechseln.
enterShell = ''
git --version
ruby --version
bundle
'';
# https://devenv.sh/languages/
languages.ruby = {
enable = true;
package = pkgs.ruby_3_3;
};
Wenn Gems fehlschlagen, ein Beispiel für einen Fehler beim Build ist unten zu sehen, müssen ggf. postgresql
oder libmysqlclient
installiert werden, um das Problem zu lösen:
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.
Vom Terminal aus können Sie das richtige Paket finden, indem Sie die interaktive Shell nix repl --file '<nixpkgs>'
starten und die Paketausgaben mit libmysqlclient.outputs
untersuchen. Normalerweise enthält die dev-Ausgabe
Header, die für kompilierte Gems benötigt werden, z.B. libyaml.dev
für den Psych
Ruby YAML Parser Gem.
Gehen Sie vom Browser aus auf https://search.nixos.org/packages, wo auch die Outputs angezeigt werden, meistens ist es dev
und kann zur Paketliste
in devenv.nix
hinzugefügt werden.
Wenn Sie ihr Bundle komplett haben, können Sie sich nun den Diensten zuwenden, herzlichen Glückwunsch, das mit den Abhängigkeiten kann manchmal schwierig sein.
Für eine MySQL-Datenbank darf man nicht vergessen, libmysqlclient.dev
zur Paketliste hinzuzufügen, da sonst das mysql2-Gem nicht kompiliert werden kann:
services.mysql = {
enable = true;
package = pkgs.mysql;
initialDatabases = [{ name = "rails_7_mysql_development"; }];
ensureUsers = [
{
name = "root";
password = "";
ensurePermissions = {
"rails_7_mysql_development.*" = "ALL PRIVILEGES";
};
}
];
};
Um den Rails-Server zu starten, wenn devenv up
verwendet wird, müssen wir nur den folgenden Befehl zu den Prozessen hinzufügen:
processes.rails.exec = "rails server";
Jetzt sollten Sie in der Lage sein, lokal zu entwickeln, ihr Gemfile.lock zu aktualisieren und Datenbankmigrationen und Tests durchzuführen. Genießen Sie die schnelle Einrichtung und Entwicklung!
Um die grundlegende Upsun-Konfiguration zu erstellen, können Sie upsun project:init
ausführen, dies wird Ihnen einige Fragen stellen und .upsun/config.yaml
generieren. Wir sind dabei, den Rails-Stack in den project:init-Befehl
zu integrieren, daher müssen Sie einige Dinge zur Konfiguration hinzufügen, wie Sie unten sehen können. Vergessen Sie nicht, die .environment-Datei
zu Git hinzuzufügen und sie aus dem Standard-Rails .gitignore
zu entfernen.
Welcome to Upsun!
Let's get started with a few questions.
We need to know a bit more about your project. This will only take a minute!
What language is your project using? We support the following:
Use arrows to move up and down, type to filter
C#/.Net Core
Elixir
Go
Java
Lisp
JavaScript/Node.js
PHP
Python
> Ruby
Rust
—
Select all the services you are using:
Use arrows to move, space to select, type to filter
> [x] MariaDB
[ ] MySQL
[ ] PostgreSQL
[ ] Redis
[ ] Redis Persistent
[ ] Memcached
[ ] OpenSearch
Bei hooks müssen Sie Folgendes tun:
hooks:
build: |
set -eux
bundle install
bundle exec rails assets:precompile
deploy: |
set -eux
bundle exec rake db:migrate
Auf der Variablenseite müssen Sie Folgendes tun:
variables:
env:
PIDFILE: "tmp/server.pid"
RAILS_ENV: "production"
Der letzte Punkt sind die Mounts für Logs, tmp und Speicher:
mounts:
"log":
source: "tmp"
source_path: "tmp"
"storage":
source: "storage"
source_path: "storage"
"tmp":
source: "tmp"
source_path: "tmp"
Sobald dies abgeschlossen ist, können Sie ein Projekt mit upsun project:create
und upsun push
erstellen. Wenn alles klappt, sollten Sie den Standard-Rails-Index sehen. Hurra!
Mehr Informationen finden Sie immer in unseren Dokumenten.
Vielen Dank an Eder Leão Moosmann und Paul Gilzow für die Mitarbeit an diesem Beitrag.