-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[IV-21-22] Objetivo 5 #35
base: main
Are you sure you want to change the base?
Changes from 7 commits
a4622ca
73089b8
6fb94c5
5f86a7a
f980104
3c5cda8
486c2bb
f7cbdd5
d5ddd18
dbd93a4
189e521
304b525
64f01b6
269e8c3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
version: 2 | ||
|
||
jobs: | ||
test-app: | ||
docker: | ||
- image: luisarostegui/mywallet:latest | ||
steps: | ||
- checkout | ||
- run: | ||
name: "Test app IV" | ||
command: "task test" | ||
|
||
workflows: | ||
version: 2 | ||
test-app-workflow: | ||
jobs: | ||
- test-app |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,23 @@ | ||
name: Publish Docker Image in Docker Hub | ||
name: Publicar imagen en Docker Hub | ||
|
||
# Indicamos activación cuando el código se envía a la rama principal del repo | ||
on: | ||
push: | ||
branches: | ||
- main | ||
push: | ||
paths: | ||
- '**.go' | ||
- Dockerfile | ||
- go.mod | ||
pull_request: | ||
branches: | ||
- main | ||
paths: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Si usas el contenedor para CI, ¿qué pasa si estás haciendo cambios en una rama? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No llego a comprender porque no es correcto. Es decir, entiendo que cuando hago push y se modifica el fichero Dockerfile o go.mod se va a lanzar los jobs pero creo que es correcto la parte del pull_request el problema con como lo tengo montando sería que solo funciona si hago yo ese PR, porque si lo hace otra persona no va a tener mis credenciales para poder ejecutar la parte de jobs... no? Si estoy haciendo cambios en una rama y quiero crear una imagen cuando actualice esa rama pondría algo como... on: push: branches: - '*' y ya cada vez que haga push sea cual sea la rama, se ejecutará la publicación de la imagen, correcto? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ¿Cómo se está modificando el contenedor si estás haciendo push a una rama aquí? ¿Entiendes eso? Siempre vas a desarrollar en una rama... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Vale, lo he modificado. Se publicará una imagen si se hace push y se modifica el fichero Dockerfile y go.mod. La parte de pull_request y branches ha sido eliminada. Asi entiendo que se crea la imagen correctamente este en la rama que este. |
||
- Dockerfile | ||
- go.mod | ||
|
||
# Especificamos lo que queramos que suceda dentro de nuestro flujo de trabajo. | ||
jobs: | ||
build: | ||
runs-on: ubuntu-latest # Indicamos que se ejecute en las últimas instancias de Ubuntu disponibles. | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- name: Checkout # Revisa nuestro repo en $GITHUB_WORKSPACE para que nuestro workflow pueda acceder a el. | ||
- name: Checkout | ||
uses: actions/checkout@v2 | ||
- name: Login to Docker Hub | ||
uses: docker/login-action@v1 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,19 @@ | ||
#Imagen base para docker | ||
FROM golang:1.17-alpine | ||
|
||
# Metadatos de información del encargado de mantenimiento | ||
LABEL maintainer="Luis Aróstegui Ruiz <luisarostegui@correo.ugr.es>" | ||
|
||
# Creamos variable de entorno para el directorio donde vamos a ejecutar los tests | ||
ENV TEST_DIR=/app/test | ||
|
||
# Añadimos usuario sin privilegios de superusuario y cremos un grupo para dicho usuario | ||
RUN addgroup -S mywallet && adduser -S mywallet -G mywallet | ||
|
||
# Cambiamos al nuevo usuario | ||
USER mywallet | ||
|
||
#Establecemos el directorio donde vamos a ejecutar los tests con nuestro nuevo usuario | ||
WORKDIR $TEST_DIR | ||
|
||
#Instalamos modulos necesarios para compilar | ||
COPY go.mod ./ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Este directorio no debes usarlo para nada, es sólo para montar el externo... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Vale, es decir, debería de hacer la copia de mi fichero de dependecias en la ruta /app (por ejemplo) y cuando tenga todo listo para ejecutar los tests hacer WORKDIR app/test, correcto? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Lo que debes es entender que el directorio de trabajo es eso, un directorio de trabajo para que se monte el repo, no para ninguna otra cosa. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Corregido. |
||
|
||
#Ahora podemos descargar y actualizar las dependecias | ||
RUN go mod download | ||
|
||
#Instalamos nuestro task runner | ||
RUN go install github.com/go-task/task/v3/cmd/task@latest | ||
|
||
#Especificamos el ejecutable que usará el contenedor | ||
ENTRYPOINT ["task", "test"] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# Integración Continua - OBJETIVO 6 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Podrías haber intentado copiar a esta rama sólo los ficheros necesarios para el test, no todos ellos. Esto es tremendamente confuso. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Se eliminará. |
||
|
||
Se trata de implementar acciones que se ejecuten cuando sucede un evento en nuestro repositorio, en general, se deberán de pasar nuestros tests desde una máquina externa, quien ejecutará estos tests y nos dirá cuales han pasado y cuales no. | ||
|
||
## Elección de servicio online de CI | ||
|
||
Para completar el objetivo se debe de implementar al menos dos servicios de integración continua. Primero vemos requisitos a tener en cuenta para seleccionar un servicio. | ||
|
||
### Que buscamos en un servicio de CI | ||
|
||
* **Configuración sencilla**, la herramienta CI debería permitir una fácil instalación y configuración. | ||
* **Facilidad de uso**, debería de funcionar completamente en segundo plano y tiene que ser sencilla su construcción y ver los resultados de la implementación. | ||
* **Arquitectura extensible**, que tenga complementos nos permitirá agregar funcionalidades a nuestra herramienta CI. | ||
* **Gratuito**. | ||
* **Matrix jobs**, con esto conseguimos ejecutar tests en varias versiones que nosotros indiquemos. | ||
|
||
### Algunos servicios de CI | ||
|
||
* **Jenkins**, servidor de automatización de código abierto para la integración continua, es bastante popular y de código abierto. El servidor está disponible para Windows, Mac y Linux. Tiene una configuración sencilla y agradable para el usuario gracias a su GUI. Diseñado como un servidor de automatización extensible, esto quiere decir que se puede usar solo para un servidor de CI o se puede convertir en un centro de entrega continua completo. Ofrece notificaciones sobre el estado de compilación. Posee Matrix Jobs. | ||
* **Bamboo**, destaca por mostrar métricas de calidad y estado. Una función de Agent Matrix permite asignar compilaciones a los agentes y permite visualizar los requisitos del sistema para cada compilación. Bamboo se encarga de las tareas de detección, compilación, prueba y fusión de ramas para implementar el código de dorma continua en entornos de producción o de prueba, basándose en el nombre de la rama. | ||
* **CircleCI**, compatible con muchos lenguajes de programación. Su única opción para el control de versiones es Github. Su GUI es bastante agradable para el usuario, proporciona paneles de control con estadísticas y datos sobre como trabajan los equipos y como se ejecuta su código. No es una herramienta gratuita pero tiene un nivel gratuito. | ||
* **Buddy**, destaca por su tiempo promedio de implementación, de unos 12 segundos, o por su procedimiento de configuración . Usa pipelines para construir, probar e implementar software. Ofrece una prueba de 5 proyectos gratis, a partir de que este se supere se tendrá que pagar por su uso. | ||
* **GoCD**, servidor de CI de código abierto, que se utiliza para visualizar y modelar fácilmente flujos de trabajo complejos. Tiene una interfaz intuitiva para crear canalizaciones de CD. Las canalizaciones se pueden tratar como un código normal registrado en el control de código fuente, lo que permite el control de versiones y el seguimiento de las canalizaciones. Adminte formatos JSON y YAML para la configuración. | ||
* **Github Actions**, es sencillo su uso. Tiene integración total, evidentemente, con Github. Posee Matrix Jobs. | ||
* **GitLab**, su herramienta CI se incluye como una aplicación web con una API abierta que administra proyectos a través de una interfaz de usuario amigable, integrándose con todas las funciones de GitLab. Ofrece un plan gratuito con todas las etapas del ciclo de vida de DevOps y hasta 2000 minutos de CI / CD. Posee Matrix Jobs. | ||
|
||
## Elección | ||
|
||
Se elegirá Circle CI y Github Actions como sistemas de CI para el proyecto. | ||
|
||
### Motivos | ||
|
||
En el caso de **Circle CI**, este sistema es compatible con imagenes Docker, por lo que podemos aprovechar que tenemos una imagen de nuestro proyecto en Docker Hub y usarla para ejecutar los tests. Si no quisieramos usar nuestra imagen podemos optar por usar Matrix jobs, que era uno de los requisitos que buscabamos de un sistema de integración continua, en nuestro caso no lo vamos a usar pero aun así [aquí](https://circleci.com/blog/circleci-matrix-jobs/) se encuentra la documentación sobre como montar. En este caso Circle CI tiene completa compatiblidad con Github útil para los Checks API y por último tiene una configuración muy sencilla, iniciando sesión en la plataforma con los datos de github, gracias al OAuth que ofrece, directamente detecta nuestro repositorios e indicar cual es el que queremos configurar. Al ser ficheros de configuración .yml es muy similar la sintaxis que vamos a usar respecto a la que hemos usado hasta ahora, por ejemplo la usada para configurar workflows de Github. Al final queda un fichero muy compacto, con pocas directivas y que funciona a la perfección. Otra característica es que ofrece plantillas para diversos lenguajes, en nuestro caso no va a servir para mucho pero es algo que cabe mencionar para tener en cuenta en alguna otra ocasión si se usa un lenguaje distinto al usado en este proyecto. | ||
|
||
En el caso de **Github Actions**, me optado por este sistema por su plena compatibilidad con Github, como es obvio. Ofrece Matrix jobs, los cuales vamos a configurar y nos puede resultar útil que podamos instalar nuestro task runner para poder usar las ordenes que tengamos configuradas en nuestro repositorio. Por último, la configuración es muy similar a la que utilizamos para publicar una imagen de nuestro proyecto en Docker Hub por tanto estaba totalmente familiarizado con a sintaxis usada y entendiendo todas las directivas desde el primer momento que se monta el fichero, solo se tiene que buscar como usar matrix jobs. | ||
|
||
Otra posible elección podía ser **Travis CI**, ofrece todo lo mencionado que buscamos en sistemas CI pero al intentar probar el producto tenía que insertar la tarjeta de crédito, algo que me echó bastante para atras para probar el sistema. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
# Explicación de Circle CI - OBJETIVO 6 | ||
|
||
## Documentación | ||
Para usar **Circle CI** como sistema de integración continua, se han consultado varias webs para poder entender las buenas prácticas con Circle CI. | ||
|
||
* [Aquí](https://programmerclick.com/article/78021241003/) se tiene la documentación que nos ayuda a enteder la sintáxis usada para configurar el sistema. | ||
* Para habilitar los checks API se ha seguido la [siguiente documentación](https://circleci.com/docs/2.0/enable-checks/). | ||
|
||
## Utilidad | ||
Circle CI, como sistema de integración continua, permite conectarte de forma muy sencilla con el repositorio de Github y actualizarlo por cada push. No presenta errores a la hora de descargar nuestra imagen de docker hub por tanto tiene completa compatibilidad con docker hub. Destacar que la documentación oficial nos comenta como trabajar con la versión 2. Existe una versión 2.1 pero he usado la version 2. Con la versión 2.1 existen nuevas directivas (las cuales nos podemos informar de ellas en el enlace del principio del documento) como 'when' y podemos evitar poner una versión en nuestro workflow, pero he optado por una opción más conservadora y basarme en la documentación oficial. | ||
|
||
## Contrucción .circleci/config.yml | ||
He montado el siguiente fichero de configuración: | ||
|
||
```yaml | ||
version: 2 # Es obligatorio indicar la versión que vamos a utilizar | ||
|
||
jobs: | ||
test-app: # Indicamos un nombre a nuestro job | ||
docker: # especificamos la configuración del contenedor | ||
- image: luisarostegui/mywallet:latest # Aprovechamos la imagen de nuestro proyecto | ||
steps: | ||
- checkout # Puede tener varios objetivos dependiendo de como se use. | ||
# En nuestro caso, configura Git para omitir la recolección automática de basura. | ||
- run: | ||
name: "Test app IV" # Le asignamos un nombre a la acción que vamos a ejecutar | ||
command: "task test" # command sirve para especifiar una acción que se ejecute a traves del shell | ||
|
||
workflows: # Orquesta el flujo de trabajo. | ||
version: 2 # Indicamos versión del workflow | ||
test-app-workflow: | ||
jobs: | ||
- test-app # Indicamos que se ejecute esta parte de jobs | ||
``` | ||
|
||
Destacar los siguientes puntos: | ||
|
||
* Se aprovecha la imagen que publicamos en docker hub gracias al trabajo realizado en el objetivo 5. | ||
* En Circle CI tenemos que tener en cuenta varios conceptos: | ||
* Orbs, es un paquete de configuración compartido entre proyectos. Es similar a lo que nos encontramos en Github con las 'Actions'. Requiere la versión 2.1. | ||
* Jobs, son una serie de pasos, todos los pasos (steps) de los jobs son unidades independientes en el contenedor Circle CI. | ||
* Steps, es una colección de comandos ejecutables durante la ejecución del trabajo. | ||
|
||
## Pruebas de funcionamiento | ||
|
||
Una vez guardamos toda la configuración estos son los resultados obtenidos: | ||
|
||
![Build Success](imgs/Circle_BuildSucceds.png) | ||
|
||
Podemos observar como se ejecutan los tests: | ||
|
||
![Tests passed](imgs/Circle_testpass.png) | ||
|
||
## Checks API | ||
|
||
Se muestra una imagen de que se han habilitado los checks para github siguiendo los pasos de [esta página](https://circleci.com/docs/2.0/enable-checks/). | ||
|
||
![Tests passed](imgs/checkApi.jpeg) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¿Qué pasa si cambian las dependencias en una rama? Esto petará.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Vale, tendría que publicar una imagen cuando se modifique sea cual sea la rama de esta manera al realizar los tests no presentará problemas. Todo reside en que me falta añadir esa sección a mi fichero para publicar una imagen en Docker Hub