Instalación de Ruby on Rails en Ubuntu 20.04 LTS

Clase 4 de 36Curso de Introducción a Ruby on Rails

Objetivo

Instalar el entorno de desarrollo necesario para desplegar aplicaciones con Ruby on Rails incluyendo librerías, consola de comandos, base de datos y editor de texto en ambientes de escritorio compatibles con linux, usando Ubuntu 20.04 LTS.

Recomendaciones

No copies y pegues los comandos de la guía dado que en algunas ocasiones podrían tener caracteres especiales de formato que podrían dañar la ejecución de los mismos, por otro lado, la instalación se realiza sobre un sistema operativo recién instalado, si tienes una instalación previa puedes encontrar que algunas respuestas de tus comandos sean diferentes.

Convenciones

$ (consola de comandos) debes traspasar el comando sin el símbolo $

#=> (salida de comando)

[] (Opcional)

<consola cursiva> (texto que hay que añadir o quitar acorde a la explicación del paso)

NOTA IMPORTANTE

No debes usar el usuario superusuario (root) a menos que de forma explícita se especifique que este debe ser usado a través del comando “sudo”, de otra forma no debes usarlo así como tampoco sus variaciones como “$ sudo su”

El programa “sudo” pronunciado “SUDU” /suːduː/ es normalmente interpretado como “superuser do…” y permite al comando inmediatamente siguiente, correr con los permisos de otro usuario que tiene condiciones especiales de seguridad o permisos, comúnmente sudo se usa para invocar los permisos del superusuario del sistema operativo, sin embargo, en las últimas versiones de sistemas compatibles con Linux no sólo puede ejecutar como superusuario sino también es posible usar otros tipos especiales de usuario. Sin embargo, nosotros usaremos “sudo” para usar los permisos de superusuario.

Adecuación del sistema operativo

Instalación de librerías base

Usando sudo y y el comando apt-get (como gestor de paquetes) vas a actualizar los enlaces a los repositorios de las librerías que se pueden instalar en el sistema operativo así como sus dependencias.

$ sudo apt-get update

Deberás obtener una respuesta de varias líneas al comando con la actualización de la lista de paquetes y una línea final mencionado que la lectura de las listas de paquetes ha sido finalizada similar a lo siguiente:

Reading package lists... Done

Ahora vamos a instalar las librerias necesarias usando sudo y el comando apt install

$ sudo apt install build-essential curl wget openssl libssl-dev libreadline-dev dirmngr zlib1g-dev libmagickwand-dev imagemagick-6.q16 libffi-dev libpq-dev cmake libwebp-dev

Para autorizar la instalación deberás aceptar la continuación del proceso digitando la letra Y y dando enter

Do you want to continue? [Y/n]

Las librerías instaladas cumplirán con los siguientes propósitos:

  • build-essentials: contiene herramientas para compilar y construir software desde sus fuentes usando generalmente lenguaje C y sus derivados

  • curl: es una herramienta para transferir información de un servidor a otro usando diversos tipos de protocolos, entre esos: HTTP, FTP, IMAP entre otros

  • wget: es una herramienta para recibir contenido desde la web usando los protocolos más comunes como HTTP y FTP

  • openssl: es un robusto conjunto de librerías que te permitirán manipular y leer contenido de los protocolos TLS y SSL, que son usados para garantizar la seguridad y encriptación de las comunicaciones entre servidores y clientes.

  • libssl-dev: es una librería que forma parte de OpenSSL usada para lidiar con procesos de encriptación, este paquete, contiene librerías de desarrollo, cabeceras de compilación entre otro tipos de archivos.

  • libreadline-dev: aporta la librerías de desarrollo para el paquete readline que ayuda a la consistencia de interfaces de usuario que están asociadas a líneas interactivas de comandos.

  • dirmngr: es un pequeño servidor para gestionar y descargar certificados de tipo X.509 y la lista de revocación de los mismos.

  • zlib1g-dev: aporta librerías de desarrollo para soportar mecanismos de compresión y descompresión compatibles con GZIP y PKZIP, tecnologías de compresión comunes en paquetes de herramientas para nuestro entorno.

  • imagemagick-6.q16: es un programa que permite editar, crear y componer mapas de bits en imágenes.

  • libmagickwand-dev: es un conjunto de librerías de desarrollo para compilar librerías necesarias para el uso de MagickWand, este último es la tecnología predilecta como interface del lenguaje de programación C a ImageMagick.

  • libffi-dev: provee librerías de desarrollo para habilitar mecanismos de alto nivel para el uso de calling conventions sobre ciertos compiladores, de esta forma esta librería le permite al desarrollador invocar cualquier función específica por medio de una llamada en tiempo de ejecución.

  • libpq-dev: esta librería contiene paquetes de desarrollo para habilitar el uso de conjuntos de binarios y cabeceras requeridas para construir componentes externos para PostgreSQL

  • cmake: es usado para controlar el proceso de compilación de software usando un método independiente del compilador.

  • libwebp-dev: habilita un conjunto de librerías de desarrollo para el manejo de formatos de imágenes de nueva generación compatibles con WebP

Instalación de GIT

A continuación instalaremos nuestro sistema para controlar versiones de nuestro código, para este caso usaremos GIT, y procederemos a su instalación usando el siguiente comando

$ sudo apt install git

Una vez instalado GIT configuraremos de forma global algunas variables

$ git config --global user.name "Johan Tique" $ git config --global user.email johan@platzi.com $ git config --global color.ui true

Solo si tu conexión a internet está habilitada a través de un proxy (muy común en las instituciones públicas) debemos configurarlo de la siguiente manera

$ git config --global http.proxy http://proxy.alu.uma.es:3128 $ git config --global https.proxy https://proxy.alu.uma.es:3128

Rockeando con tu consola de comandos

Por defecto nuestro sistema operativo está usando la consola BASH, que es genial, sin embargo, vamos usar un entorno aún más productivo integrando una nueva consola y un framework para configurar la misma.

La nueva consola que usaremos será ZSH, y el framework de configuración será oh-my-zsh (pronunciado <o mai si shel> [əʊ maɪ siː ʃɛl]); primero instalaremos la consola de la siguiente forma:

$ sudo aptitude install zsh

Luego instalaremos el framework oh-my-zsh con la ejecución comando de abajo, durante el proceso de instalación te va a preguntar si deseas cambiar tu consola por defecto a ZSH, a lo que debes responder afirmativamente

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

A continuación te mostraré una respuesta completa de este comando (debes ver esto después de la ejecución del comando incluyendo la pregunta de cambio de consola)

Time to change your default shell to zsh: **Do you want to change your default shell to zsh? [Y/n]** y Changing the shell... Password: Shell successfully changed to '/usr/bin/zsh'. __ __ ____ / /_ ____ ___ __ __ ____ _____/ /_ / __ \/ __ \ / __ `__ \/ / / / /_ / / ___/ __ \ / /_/ / / / / / / / / / / /_/ / / /_(__ ) / / / \____/_/ /_/ /_/ /_/ /_/\__, / /___/____/_/ /_/ /____/ ....is now installed! Please look over the ~/.zshrc file to select plugins, themes, and options. p.s. Follow us on https://twitter.com/ohmyzsh p.p.s. Get stickers, shirts, and coffee mugs at https://shop.planetargon.com/collections/oh-my-zsh

Al final de tu proceso deberás ver tu consola con un nuevo estilo como el siguiente:

~

Para corroborar que el proceso se finalizó con normalidad deberás cerrar tu sesión de usuario y volver a ingresar, y abrir tu consola de comandos, esta deberá verse de la siguiente forma:

unnamed.png

Después de haber instalado el framework y la consola con éxito, vamos a fortalecer nuestro framework oh-my-zsh vinculando algunos plugins, el primero de ellos lo debemos descargar, se trata del plugin zsh-syntax-highlighting.

Para descargarlo e instalarlo debemos ir al directorio de plugins de oh-my-zsh y clonar el repositorio del plugin

~ cd ~/.oh-my-zsh/custom/plugins ~ git clone git://github.com/zsh-users/zsh-syntax-highlighting.git

Para proceder con la habilitación de los plugins incluyendo el anterior, vamos a acceder al archivo .zshrc (archivo de run commands de zsh) y desde allí buscar la línea donde a través de un arreglo será pasados todos los plugins que queremos que sean habilitados, normalmente es la línea 71 y comienza con el texto plugins=(git)

~ cd ~ gedit ~/.zshrc

Dentro de este archivo, reemplazamos la línea anteriormente mencionada por lo siguiente:

plugins=(git bundler colorize brew zeus gem rails ruby npm node history-substring-search zsh-syntax-highlighting)

Finalmente, en el mismo archivo pero al final de este, vamos a añadir una de estas dos opciones:

Si usas lenguaje inglés y tu teclado está en inglés añadirás lo siguiente:

# Setting up a clean UTF-8 environment export LANGUAGE=en_US.UTF-8 export LC_ALL=en_US.UTF-8

Si usas lenguaje español y tu teclado está en español añadirás lo siguiente:

# Setting up a clean UTF-8 environment export LANGUAGE=es_CO.UTF-8 export LC_ALL=es_CO.UTF-8

Esta opción nos permitirá tener claridad sobre la codificación de caracteres usada en nuestro entorno. Para guardar toda la configuración generada debes usar CTRL + S si estás usando gedit como editor de texto.

Para actualizar las configuraciones generadas en tu archivo .zshrc tendrás dos opciones o cierras y vuelves a abrir tu consola de comandos, o en la raíz de tu directorio de usuario deberás ejecutar el siguiente comando:

~ source ~/.zshrc

Hasta aquí no deberías tener ningún inconveniente, sin embargo, sólo si llegas a obtener algún error similar a compdef: unknown command or service: rails deberás hacer lo siguiente

~ chmod -R go-w ~/.oh-my-zsh ~ rm -f ~/.zcompdump*; compinit

Instalando RBENV

Imagina que estás trabajando en varios proyectos con Ruby y Ruby on Rails, y que todos tengan diferentes versiones… ¿cómo haces para garantizar que todas librerias, versiones y paquetes sean consistentes en cada uno de los proyectos?

Bien, para resolver esto debemos usar gestores de versiones, en este caso usaremos RBENV, no debes confundirte con controladores de versiones (como GIT), son dos tecnologías con propósitos distintos, pero que se complementan.

Para instalar RBENV debemos ejecutar el siguiente comando

~ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash

Al final de la ejecución del comando deberás ver un texto similar a este, mencionando que a pesar de haber instalado RBENV este no se encuentra en la variable de entorno PATH

Running doctor script to verify installation... Checking for `rbenv' in PATH: not found You seem to have rbenv installed in `/home/platzi/.rbenv/bin', but that directory is not present in PATH. Please add it to PATH by configuring your `~/.bashrc', `~/.zshrc', or `~/.config/fish/config.fish'.

Para añadir a la variable de entorno PATH los binarios de RBENV y a su vez ejecutarlo cada vez que exista una nueva sesión, debemos agregar dos líneas al archivo .zshrc que habíamos visto antes, pero esta vez solo usaremos la consola para hacerlo, de la siguiente manera:

~ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc ~ echo 'eval "$(rbenv init -)"' >> .zshrc ~ source ~/.zshrc

Una vez instalado RBENV vamos a usarlo para instalar la versión 2.7.1 ejecutando lo siguiente (la instalación suele tardar unos minutos, así que asegurate de tener una buena velocidad y estabilidad de internet)

~ rbenv install 2.7.1

RBENV está en la capacidad de gestionar un sin número de versiones de ruby así como sus espacios de librerías de forma independiente, así que vamos a establecer la versión 2.7.1 como la versión por defecto y global, usando el siguiente comando.

~ rbenv global 2.7.1

Para poder mantener los espacios de librerías de forma consistente entre versiones y manifiestos usaremos BUNDLER, la cual es una librería que nos permitirá gestionar a su vez un conjunto de librerías de ruby agrupadas por entornos de trabajo y garantizando la consistencia de versiones y dependencias entre las mismas.

En Ruby, las librerías son llamadas gemas, y bundler usa un archivo manifiesto llamado Gemfile para listar todas las gemas que un proyecto tendrá, bundler puede usar varias fuentes para encontrar de forma pública estas librerías en la nube, sin embargo, nosotros vamos a usar dos fuentes rubygems y github.

Para instalar Bundler (que también es una gema) usaremos el comando gem que es proveído en este caso por RBENV. También habilitaremos el protocolo seguro de HTTP para que cuando se tome github como fuente este sea establecido por defecto.

~ gem install bundler ~ bundle config github.https true

Rails necesita de un motor de javascript para abordar ciertas funcionalidades de compilación, transformación y en sus últimas versiones, funcionalidades de integración con webpack, es por esta razón que vamos a usar nodejs como nuestro motor, sin embargo, NodeJS podría tener la misma situación de conflicto de versiones entre ambientes, por lo que que usaremos también un gestion de versiones de NodeJS para lidiar con estos escenarios.

NOTA si ya tienes instalado NodeJS u otro motor de javascript compatible con el interprete de javascript V8 o similar, no deberás hacer este paso, aunque es ampliamente recomendable usar un gestor de versiones, si lo quieres llegar a usar debes desinstalar el intérprete de javascript que tengas instalado para evitar conflictos futuros.

Para gestionar la versiones de NodeJS usaremos NODENV ejecutando la siguiente secuencia de comandos, que instalará el NODENV, añadirá sus binarios a la variable de entorno PATH, e instalará la versión 12.17.0 de NodeJS.

~ curl -fsSL https://raw.githubusercontent.com/nodenv/nodenv-installer/master/bin/nodenv-installer | bash ~ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.zshrc ~ echo 'eval "$(nodenv init -)"' >> ~/.zshrc ~ source ~/.zshrc ~ nodenv install 12.17.0 ~ nodenv global 12.17.0

Instalando el ambiente de desarrollo con Rails y PostgreSQL

Habiendo instalado RBENV y BUNDLER ya podemos empezar a instalar todas las gemas, herramientas y servidores necesarios para poder seguir adelante con nuestros primeros pasos con Ruby on Rails

Vamos a instalar Ruby on Rails usando el siguiente comando (si, Rails es también una gema...)

~ gem install rails

Rails instalará con varias gemas como dependencias para su ejecución, así que obtendremos una instalación con una larga lista de librerías, al final podrás corroborar la versión de Rails usando el comando de abajo, que en nuestro caso será la versión 6.0.3.1

~ rails -v #=> Rails 6.0.3.1

Las versiones de Rails superiores a la 6, requieren usar YARN como gestor de paquetes de javascript y habilitar el enlace de Webpack usando la tecnología Webpacker, para esto, vamos a usar la versión oficial de los repositorios de YARN a través de los siguientes comandos

~ sudo curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - ~ sudo sh -c "echo 'deb https://dl.yarnpkg.com/debian/ stable main' >> /etc/apt/sources.list" ~ sudo apt update

Para instalar YARN vamos a usar el comando de abajo, y usaremos nuestra versión de NodeJS instalada en el paso anterior usando la opción --no-install-recommends

~ sudo apt --no-install-recommends install yarn

Finalmente, vamos a instalar la base de datos de postgreSQL y configurar un usuario para poder gestionarla, lo primero que debes hacer es configurar las listas de los repositorios

~ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - ~ echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list ~ sudo apt update

Una vez actualizado la lista de paquetes de postgreSQL usaremos el siguiente comando para instalarlo

~ sudo apt -y install postgresql-12 postgresql-client-12

Una vez instalado postgreSQL, entraremos a la sesión del mismo y crearemos desde allí un nuevo usuario con capacidad de crear bases de datos (de usuario platzi, rol platzi y contraseña platzi), y que usaremos para nuestras futuras aplicaciones, para hacerlo debemos seguir el siguiente conjunto de instrucciones (No tener en cuenta el prefijo postgres@ubuntu:~$ para su ejecución):

~ sudo -i -u postgres postgres@ubuntu:~$ createuser --pwprompt --interactive platzi #=> Enter password for new role: ****** (platzi) #=> Enter it again: ****** #=> Shall the new role be a superuser? (y/n) n #=> Shall the new role be allowed to create databases? y #=> Shall the new role be allowed to create more new roles? (y/n) n

Para salir de la sesión de postgreSQl debemos usar el comando exit

postgres@ubuntu:~$ exit

Instalación del editor de texto

Vamos a instalar el editor de texto Atom, primero añadiremos sus listas de paquetes oficiales y luego procederemos a su instalación

~ wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add - ~ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list' ~ sudo apt-get update ~ sudo apt-get install atom

Una vez instalado nuestro editor de texto, iremos a la raíz de nuestra consola de comandos, y crearemos los directorios coding/platzi con el comando mkdir (make directory), la opción -p nos permite crear directorios anidados de forma concatenada si estos no existen previamente.

~ mkdir -p coding/platzi

Accederemos dentro de este directorio, para posteriormente invocar al editor a través del siguiente comando

~ coding/platzi ~ atom .

Al ejecutar el comando deberás ver la interfaz gráfica del editor de la siguiente manera

atom.png

Finalmente vamos a instalar y habilitar algunos paquetes que complementarán tus procesos de desarrollo.

Paquete autosave

Este paquete debemos habilitarlo, para hacerlo debemos sobre el Atom usar la combinación de teclas CTRL + , clickear la opción Packages, para luego buscar el paquete autosave, seleccionarlo y finalmente habilitarlo.

rubyyy.png

Instalación de paquetes

En la misma pantalla de de configuración, ahora debes clickear install y allí procederemos a buscar e instalar cada uno de los siguientes paquetes:

atom-beautify, file-icons, git-blame, ident-guide-improved, language-haml, minimap, pigments, sass, save-workspace, selection-highlight, todo-show.

atom-beautify, file-icons, git-blame, ident-guide-.png

BONUS atajos de teclado y comandos

Para la consola de comando podrás usar los siguientes comandos y atajos, los cuales iremos abordando en el transcurso del curso

# gestión de archivos y carpetas $ cd *<nombre_de_carpeta>* # ingresar a un directorio $ ls # ver el contenido del directorio $ cp *<nombre_archivo>* *<nombre_archivo_2>* # copiar un archivo especificando sus nombres # GIT $ ga . # atajo de `git add .` $ gc -m ‘’ # atajo de `git commit -m ‘’` $ gco # atajo de `git checkout` $ gp # atajo de `git push` # Rails $ rs # atajo de `rails server` $ rc # atajo de `rails console` $ bi # atajo de bundle install

Dentro del editor de texto Atom puedes encontrar útil estos comandos

CTRL + P # Buscar archivos y carpetas dentro del proyecto CTRL + SHIFT + P # Buscar comando derivado de los paquetes instalados CTRL + K + B # collapsar o expandir el arbol de directorio CTRL + D # ejecutado varias veces, seleccionará las coincidencias del término enfocado CTRL + SHIFT + D # duplicar línea CTRL + <flechas arriba/abajo> # mover la línea hacia abajo o arriba ALT + \ # enfocar y navegar el árbol de directorios SHIFT + A # enfocado el árbol de directorios, creará una carpeta A # enfocado el árbol de directorios, creará un archivo D # enfocado el árbol de directorios, duplicará un archivo F2 # enfocado el árbol de directorios, renombrará un archivo CTRL + F # buscar un término dentro del archivo abierto CTRL + SHIFT + F # buscar un término en todo el proyecto