Cada vez más empresas requieren que los desarrolladores comprendan la integración continua y la entrega continua, pero comenzar a implementarlo en sus proyectos puede ser un poco abrumador. Comience con un sitio web simple y pronto se sentirá más seguro para hacer proyectos más complejos.

La mentalidad correcta

TDD/BDD, CI/CD, XP, Agile, Scrum …. Ahhhhh, déjame en paz ¡Solo quiero programar!

Sí, todas estas metodologías pueden ser un poco complicadas al principio, pero simplemente porque no estás acostumbrado a ellas. Como un músculo, necesitas entrenarlos y cuanto más lo hagas, más pronto no tendrás ganas de hacerlo es una pérdida total de tiempo.

Una vez que haya decidido que el CD es para usted, su equipo o su proyecto, deberá definir un proceso y seguirlo. No facilite interrumpir el proceso y antes de darse cuenta, usted y su equipo se sentirán como peces en el agua.

Automatizar una implementación simple del sitio web

Hay muchas formas de resolver este problema. Usaré una cierta pila. Si no tiene experiencia con ninguna de las herramientas, intente implementarla con una con la que tenga experiencia.

Pila Herramienta/Servicio Alternativas
VPS DigitalOcean Linode or Vagrant
Configuration Management Ansible Chef or Puppet
Static site generator Middleman Jekyll or pure HTML
CI/CD Server Semaphore Codeship or Jenkins

Lo primero es crear una nueva gota en DO (también puede hacerlo con Ansible pero no lo haremos en este tutorial). Asegúrese de que haya un usuario de despliegue y configure las claves ssh para él (de nuevo, algo que podríamos hacer con Ansible pero lo dejaremos para otra publicación) Configure su dominio para que apunte a la dirección IP del nuevo servidor, usaré “ejemplo.com”.

Ansible

Crea una carpeta para tu libro de jugadas y dentro de ella comienza con un archivo llamado ansible.cfg. Allí anularemos la configuración predeterminada señalando un nuevo inventario dentro de la carpeta de su libro de jugadas y especificaremos el usuario de implementación.

[defaults]
hostfile=inventory
remote_user=deploy

Ahora en nuestro archivo inventory especificamos un grupo llamado web e incluimos nuestro dominio.

[web]
example.com

Nuestras tareas se definirán en simple-webserver.yml

- name: Simple Web Server
  hosts: example.com
  sudo: True
  tasks:
    - name: Install nginx
      apt: pkg=nginx state=installed update_cache=true
      notify: start nginx
    - name: remove default nginx site
      file: path=/etc/nginx/sites-enabled/default state=absent
    - name: Assures project root dir exists
      file: >
        path=/srv/www/example.com
        state=directory
        owner=deploy
        group=www-data
    - name: copy nginx config file
      template: >
        src=templates/nginx.conf.j2
        dest=/etc/nginx/sites-available/example.com
      notify: restart nginx
    - name: enable configuration
      file: >
        dest=/etc/nginx/sites-enabled/example.com
        src=/etc/nginx/sites-available/example.com
        state=link
      notify: restart nginx
  handlers:
    - name: start nginx
      service: name=nginx state=started
    - name: restart nginx
      service: name=nginx state=restarted

En él hacemos referencia a una plantilla llamada templates/nginx.conf.j2 donde especificaremos un host virtual simple.

server {
        listen *:80;

        root /srv/www/example.com;
        index index.html index.htm;

        server_name example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

Te mostraré en otra publicación cómo hacer esta misma configuración pero con varios hosts virtuales en caso de que ejecutes varios sitios.

Ejecútelo llamando:

ansible-playbook simple-webserver.yml

Middleman

Middleman tiene una forma muy sencilla de implementar a través de rsync. Solo asegúrate de tener la siguiente gema en tu Gemfile

gem 'middleman-deploy'

Y luego agregue algo como esto a su config.rb

activate :deploy do |deploy|
  deploy.method = :rsync
  deploy.host   = 'example.com'
  deploy.path   = '/srv/www/example.com'
  deploy.user  = 'deploy'
end

Antes de poder implementar, debe recordar construir su sitio. Esto es propenso a errores, así que en su lugar agregaremos una tarea de rastrillo en nuestro Rakefile para hacer esto por nosotros.

desc 'Build site'
task :build do
  `middleman build`
end

desc 'Deploy site'
task :deploy do
  `middleman deploy`
end

desc 'Build and deploy site'
task :build_deploy => [:build, :deploy] do
end

Git Flow

Técnicamente, realmente no necesita git flow para este proceso, pero creo que tener un modelo de ramificación adecuado es clave para un entorno de CD exitoso. Dependiendo del proceso de su equipo, es posible que desee usar otra cosa, pero si no tiene nada definido, eche un vistazo al flujo de git, podría ser justo lo que necesita.

Para este tutorial simplificaré en exceso el proceso y solo usaré las ramas de desarrollo, maestría y lanzamiento siguiendo estos tres pasos:

  1. Empuje todos los cambios deseados en la rama de desarrollo
  2. Cree una versión y agregue la información de la versión
  3. Fusionar el lanzamiento en maestro

Veamos los pasos en la línea de comando. Comenzamos agregando las nuevas funciones y comprometiéndolas.

git add Rakefile
git commit -m 'Add rake task for easier deployment'

Ahora creamos un lanzamiento.

git flow release start '1.0.0'

Este sería un buen momento para probar todo. Cambie el número de versión de su software (en mi caso 1.0.0), actualice el registro de cambios y realice las correcciones de última hora.

Confirme los cambios y terminemos este paso terminando nuestro lanzamiento.

git flow release finish '1.0.0'

Intente escribir algo significativo para su etiqueta de mensaje para que pueda consultar fácilmente una versión más adelante por su descripción.

git tag -n

Sostén tus caballos y no presiones tus cambios todavía.

Semaphore

Agregue un nuevo proyecto desde GitHub o Bitbucket.

Para la compilación, es posible que desee tener algo en la línea de:

bundle install --path vendor/bundle
bundle exec rake spec

Ahora vaya a la configuración de proyectos dentro de la pestaña Implementación y agregue un servidor.

Debido a que estamos utilizando una opción genérica, Semaphore necesitará acceso a nuestro servidor. Genere una llave SSH y pegue lo privado en Semaphore y lo público en su servidor.

Para los comandos de implementación, debe tener algo como esto:

ssh-keyscan -H -p 22 example.com >> ~/.ssh/known_hosts
bundle exec rake build_deploy

Empuja tus cambios

Empuje sus cambios en la rama maestra y listo, Semaphore construirá y desplegará su sitio.

Una vez que tenga el hábito de hacer esto con su sitio web, se sentirá más seguro de hacerlo con algo como una aplicación Rails.

Si tiene alguna pregunta, déjela a continuación, responderé a cada una de ellas.