gcm1001 / TFG-CeniehAriadne

CENIEH & Ariadne+ project.
GNU General Public License v3.0
3 stars 2 forks source link

Estudio y aplicación de la práctica software CI (Integración continua) #32

Closed gcm1001 closed 4 years ago

gcm1001 commented 4 years ago
gcm1001 commented 4 years ago

Integración continua

La Integración Continua (CI) es una práctica utilizada en el desarrollo de software mediante la cual es posible automatizar operaciones tales como la compilación o ejecución de tests. Las ventajas principales de esta técnica son:

Github Actions

A través de Github Actions podemos introducir la Integración Continua en nuestro proyecto, es decir, nos permite automatizar:

Implementación

La implementación de acciones en Github es verdaderamente sencilla, simplemente hay que definir un archivo en nuestro repositorio. Sus dos requisitos principales son:

  1. Estar alojado en .github/workflows
  2. Tener formato .yml

En la primera línea del archivo .yml tenemos que indicar el nombre de la acción a desarrollar.

name: TFG CeniehAriadnePlus CI/CD

En las siguientes líneas debemos definir el disparador de la acción, es decir, el evento que activará la acción. Además, se pueden indicar condicionales como, por ejemplo, que un evento determinado active la acción únicamente cuando sea ejecutado sobre una rama específica.

...
  on:
    push:
      branches:
        - master
    pull_request:
      branches:
        - master

Como se puede observar, mi flujo de trabajo solo se activará cuando se haga push o pull request sobre la rama master.

El siguiente paso es especificar los trabajos que se van a llevar a cabo.

...
  jobs:
      Docker:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v1
          - name: Login
            run: docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }}
          - name: Build
            run: docker build -t omeka_cenieh .
          - name: Tags
            run: |
                docker tag omeka_cenieh ${{ secrets.DOCKER_USER }}/omeka_cenieh:${{ github.sha }}
                docker tag omeka_cenieh ${{ secrets.DOCKER_USER }}/omeka_cenieh:latest
          - name: Push
            run: |
                docker push ${{ secrets.DOCKER_USER }}/omeka_cenieh:${{ github.sha }}
                docker push ${{ secrets.DOCKER_USER }}/omeka_cenieh:latest
          - name: Deployment
            run: |
                docker swarm init
                echo ${{ secrets.DB_PASSWORD }} | docker secret create omeka_db_password -
                echo ${{ secrets.DB_ROOT_PASSWORD }} | docker secret create omeka_db_root_password -
                cp ./db.ini.modificar ./db.ini
                docker stack deploy -c docker-compose.yml omeka_cenieh

En este caso, solo especifico un único trabajo llamado Docker. A continuacón, explicaré brevemente en que consiste cada término utilizado:

Como podemos observar en el código, hago uso de secrets. Estos son muy sencillos de crear:

  1. Accedemos a la pestaña de configuración del proyecto Settings.
  2. Nos desplazamos a la ventana Secrets Screenshot_20200406_193126
  3. Clicamos sobre Add a new secret e introducimos el nombre y valor del secreto. Screenshot_20200406_193220
  4. Finalizamos el proceso clicando sobre Add secret.

Con todo esto ya tendríamos implementada la Integración Continua (aplicada únicamente a Docker).

gcm1001 commented 4 years ago

Excluir rutas

Dado que no me interesa que se ejecute la acción cuando realice cambios sobre la documentación, configuraré el workflow para que ignore la ruta donde está almacenada toda la documentación del proyecto.

Filtros

Se pueden excluir rutas usando dos tipos de filtros.

P.D: No se pueden usar los dos filtros a la vez en un mismo evento.

Implementación escogida paths-ignore

...
  on:
    push:
      branches:
        - master
      paths-ignore:
        - 'docs/**'
    pull_request:
      branches:
        - master
      paths-ignore:
        - 'docs/**'
...

Implementación alternativa paths

...
  on:
    push:
      branches:
        - master
      paths:
        - '**'
        - '!docs/**'
    pull_request:
      branches:
        - master
      paths:
        - '**'
        - '!docs/**'
...