En la primera práctica de la asignatura vamos a tomar contacto con el framework de desarrollo de aplicaciones web en Java Play Framework, trabajando sobre la aplicación inicial domingogallardo/mads-todolist-inicial.
La práctica tendrá una duración de cuatro semanas. Deberás realizarla de forma individual, siguiendo las indicaciones que encontrarás en este documento. Tendrás que desarrollar código y trabajar en GitHub desarrollando issues, pull requests, releases y actualizando la wiki del proyecto.
Antes de comenzar la práctica debes leer la introducción a Play Framework para las prácticas de MADS.
La aplicación inicial es una aplicación para gestionar listas de tareas pendientes de los empleados de una empresa. Se pueden registrar y logear usuarios y los usuarios registrados pueden añadir, modificar y borrar tareas pendientes de hacer.
También tiene unas funcionalidades iniciales básicas relacionadas con la gestión de equipos de usuarios, de las que sólo se ha implementado el esqueleto, sin apenas interfaz de usuario.
A continuación puedes ver dos de las pantallas de la aplicación.
Pantalla de login |
Pantalla con listado de tareas |
Iremos desarrollando características adicionales de la aplicación a lo largo de las prácticas. El nombre de la aplicación es ToDo List.
En cuanto a la metodología de desarrollo, en esta primera práctica repasaremos e introduciremos el uso de:
- Git como sistema de control de versiones que nos permitirá registrar paso a paso los cambios realizados en el desarrollo, realizando e integrando ramas de features en las que desarrollaremos pequeños incrementos que añadirán poco a poco las funcionalidades necesarias en la aplicación.
- GitHub como servicio en el que publicaremos los cambios e integraremos las ramas usando pull requests (PRs). Utilizaremos un gran número de características de GitHub para realizar el seguimiento del desarrollo del proyecto: issues, labels, milestones, etc.
- JUnit y DBUnit para realizar continuamente pruebas unitarias que validen el desarrollo.
El objetivo es desarrollar software de una forma similar a cómo se hace en cientos de proyectos punteros de desarrollo open source.
Algunos ejemplos de repositorios en GitHub:
Git es el sistema de control de versiones más utilizado en la actualidad. Es muy flexible, distribuido, adaptable a múltiples flujos de trabajo e ideal para una metodología de desarrollo en equipo. Suponemos que ya tienes cierta experiencia con su uso. Puedes usar los siguientes enlaces para repasar su funcionamiento.
- Resumen de comandos de Git: Resumen de comandos principales para empezar a trabajar con Git.
- Atlassian Git Tutorials: Tutoriales muy orientados al uso de Git con gran cantidad de ejemplos. Es recomendable repasar los tutoriales básicos (Getting Started) y los tutoriales Syncing y Using Branches en el apartado Collaborating.
- Libro de Scott Chacon: Completo manual con todos los detalles de todos los comandos de Git.
Cuando utilicemos git es muy importante realizar unos mensajes de commit claros. Un mensaje de commit es la forma de comunicar a los compañeros del equipo qué cambios se han introducido en la aplicación y ponerlos en contexto (explicar por qué se han hecho, dar algún detalle de implementación, etc.). El post How to Write a Git Commit Message explica muy bien esto.
Desarrollaremos la aplicación de forma iterativa, utilizando inicialmente un flujo de trabajo Git denominado feature branch (consultar la guía de GitHub) en el que cada característica nueva se implementa en una rama separada que después se mezcla con la rama principal de desarrollo. Más adelante veremos otros flujos de trabajo. Puedes ver una introducción a distintos flujos de trabajo básicos con Git en este documento de Atlassian.
Para implementar este flujo de trabajo utilizaremos todos los instrumentos de GitHub que facilitan la comunicación entre los miembros del equipo:
-
Issues (incidencias): GitHub permite abrir issues (incidencias o tareas), asignarlos a personas, realizar comentarios, asignar etiquetas y cerrarlos cuando la implementación ha terminado. Consultar Mastering Issues.
Definiremos distintos tipos de issues en función de su propósito: feature, bug y technical.
Cada issue se desarrollará en una rama de Git y se integrará en la rama master haciendo un pull request.
-
Pull Requests: Un pull request permite avisar al equipo de que se va a integrar en la rama principal una rama con un desarrollo nuevo. Cuando creamos un PR, GitHub crea una página en la que se pueden realizar comentarios, revisiones de código o definir políticas de aceptación del PR. Consultar About pull requests.
Implementaremos cada issue en una rama separada de git y la integraremos en la rama
master
haciendo un pull request. Cuando se mezcle el PR enmaster
el issue se cerrará.Más adelante añadiremos otra rama de largo recorrido
releases
para incluir en ella las releases del proyecto. -
Milestones y Releases: Etiquetaremos cada issue con el milestone en el que queremos que se lance. Para identificar el milestone usaremos el versionado semántico: MAJOR.MINOR.PATCH.
Usaremos la funcionalidad de GitHub Releases para etiquetar los commits en los que queramos marcar una versión nueva del proyecto. Podemos añadir información sobre las novedades de la versión (normalmente serán enlaces a los issues y pull requests de ese milestone).
-
Tablero de proyecto: Un tablero de proyecto nos ayudará a hacer un seguimiento de en qué estado se encuentra cada issue o PR: cuáles han sido implementados, cuáles faltan por asignar, implementar, probar, etc. Vamos a utilizar la funcionalidad propia de GitHub llamada Projects. Consultar project boards.
-
Wiki: Por último, GitHub ofrece una wiki en que utilizaremos para documentar las nuevas features (también llamadas funcionalidades o historias de usuario) a implementar. Consultar documenting your projects on GitHub.
La documentación en la Wiki, en los issues, en los PRs y en el propio
README.md
del proyecto hay que escribirla en Markdown, un lenguaje de marcado muy popular y sencillo de dominar. Si no has trabajado todavía con él puedes leer estas guías de GitHub.Existen herramientas y servicios más avanzados para gestionar todos estos elementos del desarrollo. Por ejemplo Jira, YouTrack, Confluence o incluso Trello. Pero lo que nos ofrece GitHub es suficiente para lo que vamos a realizar en la asignatura y tiene la ventaja de estar integrado en una misma plataforma.
Software necesario:
- Git
- Docker, para ejecutar la imagen (similar a una máquina virtual) que contiene Java y Play Framework. En esta primera práctica se utiliza para compilar y ejecutar los proyectos Play y para lanzar el servicio de base de datos MySQL.
- Como entorno de desarrollo proporcionamos dos opciones:
- Visual Studio Code: IDE para trabajar en el desarrollo del proyecto si no es posible usar IntelliJ. No tiene las funcionalidades de IntelliJ de autocompletar código, depuración, etc.
- IntelliJ IDEA: IDE recomendado para trabajar en el desarrollo del proyecto. Debes descargar la versión Ultimate. Es de pago, pero puedes conseguir una licencia educativa en https://www.jetbrains.com/student/. Es necesario disponer del JDK Java 8. En la instalación se debe instalar el plugin de Scala.
Docker es una tecnología que ha tenido una gran expansión en los últimos años. Permite construir máquinas virtuales ligeras que utilizan el mismo sistema operativo de la máquina host. Estas máquinas virtuales se denominan contenedores y, al compartir el propio sistema operativo en el que se están ejecutando, su gestión (construcción, arranque, parada, etc.) es muchísimo más rápida que las máquinas virtuales tradicionales.
Utilizaremos la imagen Docker
domingogallardo/playframework,
que lanza el comando sbt
sobre el directorio actual necesario
para compilar y ejecutar aplicaciones Play.
Cada máquina docker se define con un fichero Dockerfile
. Puedes
mirar el fichero Dockerfile
de la imagen de la asignatura en este
enlace. Más
adelante en la asignatura estudiaremos más sobre Docker.
Tal y como hemos explicado en la introducción a Play Framework para las prácticas de MADS para lanzar esta imagen tenemos que ejecutar el siguiente comando, estando en el directorio de la aplicación Play:
$ cd /path/to/my/play/project
$ docker run --rm -it -v "${PWD}:/code" -p 9000:9000 domingogallardo/playframework
El comando docker run
buscará la imagen
domingogallardo/playframework
en local y la descargará si no la
encuentra. Después la ejecutará montando el directorio actual en el
directorio /code
y mapeando el puerto 80 de la máquina host en el
puerto 9000 del contenedor. La imagen está configurada para lanzar el
comando sbt
sobre el directorio code
.
Como en este directorio está montado el directorio de la máquina
host en donde tienes el proyecto, podrás editar y modificar los
ficheros en la propia máquina host y compilarlos y ejecutarlos desde
el comando sbt
en el contenedor.
En la configuración por defecto (fichero conf/application.conf
) la
aplicación trabaja con la base de datos en memoria. Existe otra
configuración (conf/develop-mysql.conf
) para que la aplicación
trabaje con una base de datos MySQL. La utilizaremos también en la práctica.
Es importante que el entorno de trabajo permita realizar con facilidad tanto el desarrollo de la aplicación como las pruebas.
Durante el desarrollo de la práctica será necesario realizar pruebas manuales de la aplicación, introducir datos en sus pantallas y comprobar que los cambios que hemos añadido funcionan correctamente.
Para estas pruebas manuales recomendamos utilizar la configuración de ejecución trabajando sobre la base de datos real MySQL. De esta forma podemos introducir datos y reutilizarlos en posteriores pruebas manuales.
Para poner en marcha la base de datos MySQL recomendamos usar
Docker. El siguiente comando lanza un contenedor llamado play-mysql
con una base de datos MySQL trabajando en el puerto interno 3306
y en
el puerto del host 3316
con el usuario root
con la contraseña mads
:
$ docker run -d -p 3316:3306 --name play-mysql -e MYSQL_ROOT_PASSWORD=mads -e MYSQL_DATABASE=mads mysql:5
!!! Warning "Importante"
En los laboratorios de la EPS está instalada la
imagen Docker 5.7.18 de MySQL. Hay que definir explícitamente esa versión
en el comando docker, escribiendo `mysql:5.7.18`.
También durante el desarrollo hay que implementar y lanzar tests automáticos. Recomendamos en este caso usar la base de datos de memoria, en lugar de la base de datos MySQL, para que la ejecución de los tests tenga más velocidad y para que no se borren los datos introducidos en las pruebas manuales.
Debemos configurar el entorno de trabajo para que sea posible realizar los dos tipos de pruebas, manuales y automáticas, simultáneamente.
Dependiendo de si utilizamos o no IntelliJ lo haremos de forma distinta.
Si tu ordenador no tiene prestaciones suficientes para trabajar con IntelliJ IDEA puedes usar un editor como Visual Studio Code.
Recomendamos trabajar con tres pestañas de terminal abiertas en el editor:
-
Terminal 1: ejecución de la aplicación para hacer pruebas manuales sobre base de datos MySQL. Lanzamos en el shell el comando docker para lanzar la aplicación usando la base de datos MySQL.
$ docker run --link db-mysql --rm -it -p 9000:9000 -e \ DB_URL="jdbc:mysql://db-mysql:3306/mads" -e DB_USER_NAME="root" -e \ DB_USER_PASSWD="mads" -v "${PWD}:/code" domingogallardo/playframework
Y desde la consola sbt modificamos la preferencia config.file
para
que la aplicación utilice la configuración definida en el fichero
conf/develop-mysql.conf
[mads-todolist-dgallardo] $ set javaOptions += "-Dconfig.file=conf/develop-mysql.conf"
[mads-todolist-dgallardo] $ run
-
Terminal 2: pruebas automáticas sobre la base de datos de memoria. Lanzamos en el shell el comando docker para lanzar sbt. No hace falta exportar el puerto 9000 porque sólo se va a usar el contenedor para lanzar los tests:
$ docker run --rm -it -v "${PWD}:/code" domingogallardo/playframework [mads-todolist-dgallardo] $ test
-
Terminal 3: shell en el que usaremos git:
$ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
Si tenemos un ordenador con suficiente capacidad es recomendable usar IntelliJ IDEA como entorno de desarrollo.
Recomendamos la siguiente configuración:
-
Pruebas manuales: para lanzar la aplicación y poder realizar pruebas manuales usando la base de datos MySQL debemos crear una configuración de run/debug que trabaje sobre MySQL y lanzar la ejecución.
-
Pruebas automáticas: se lanza
sbt
desde la propia pestaña de IntelliJ o desde un terminal con el comandodocker run
. Como hemos comentado anteriormente, no es necesario mapear el puerto 9000 porque el contenedor sólo se va a usar para lanzar los tests:$ docker run --rm -it -v "${PWD}:/code" domingogallardo/playframework [mads-todolist-dgallardo] $
Y se lanza el comando
test
. -
Shell de git: es recomendable tener abierta una ventana de terminal adicional para trabajar con git.
!!! Warning "Cuidado en las máquinas de la EPS"
En las máquinas virtuales Ubuntu de la EPS, la aplicación
Docker se ejecuta con el usuario `root`. Si se lanza una ejecución de
la máquina de docker con el directorio del proyecto antes de haberlo
compilado con IntelliJ, se crearán directorios de trabajo `logs` y
`target` con propiedad de `root`. Esto provocará un error de permisos cuando vayamos a compilar desde
IntelliJ y hará imposible la compilación desde el IDE.
Para que funcione correctamente la compilación desde IntelliJ
debemos eliminar esos directorios y hacer que sea IntelliJ quien
los cree. Por ejemplo, podemos borrarlos a mano con `$ sudo rm
-rf logs` y `$ sudo rm -rf target`.
O podemos volver a descargar el proyecto de GitHub y compilarlo
por primera vez con IntelliJ.
-
Descarga e instala el software indicado en el apartado anterior.
-
Inicializa tu nombre de usuario y tu correo en Git. El nombre de usuario será el nombre que aparecerá en los commits. Pon tu nombre y apellido.
$ git config --global user.name "Pepe Perez" $ git config --global user.email [email protected]<
-
Descarga la imagen de Docker para poder compilar y ejecutar los proyectos Play:
$ docker pull domingogallardo/playframework $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE domingogallardo/playframework latest 95c1eb17ecb4 5 weeks ago 530MB
-
Crea una cuenta en GitHub. Puedes usar el nombre de usuario que quieras (o usar el que ya tienes), pero escribe correctamente tu nombre y apellidos en el perfil usando la opción Settings > Profile y actualizando el campo Name.
-
Una vez logeado en GitHub, copia el enlace con una invitación que compartiremos en el foro de Moodle. Con esa invitación se creará automáticamente el repositorio
todolist-2018-<usuario>
en la organización mads-ua-18. Es un repositorio privado al que tienes acceso tú y el profesor. Contiene el código inicial de un proyecto base Play (es una copia del repositorio domingogallardo/mads-todolist-inicial) en la que se han comprimido todos los commits en uno.Es importante que tengas en cuenta que el repositorio recién creado no reside en tu cuenta, sino en la organización
mads-ua
. Puedes acceder a él desde el dashboard de GitHub que aparece cuando te logeas:También el profesor te invitará a formar parte de la organización y recibirás un mensaje de correo electrónico en el que deberás aceptar esta invitación. También se puede aceptar la invitación accediendo a https://github.com/mads-ua-18.
-
Descarga el proyecto y comprueba que se compila y ejecuta correctamente con la imagen de Docker y usando la base de datos de memoria (muy útil para pruebas y lanzar los tests).
$ git clone https://github.com/mads-ua/todolist-2018-usuario.git $ cd todolist-2018-usuario $ docker run --rm -it -v "${PWD}:/code" -p 9000:9000 domingogallardo/playframework [info] Loading project definition from /code/project [info] Updating {file:/code/project/}code-build... [info] Resolving org.fusesource.jansi#jansi;1.4 ... [info] Done updating. [info] Set current project to play-java (in build file:/code/) [mads-todolist-inicial] $ test ... [info] Passed: Total 35, Failed 0, Errors 0, Passed 35 [success] Total time: 35 s, completed Sep 4, 2018 9:34:04 AM [mads-todolist-inicial] $ run
Comprueba que la aplicación está funcionando en http://localhost:9000 en la máquina host.
Para salir del comando
run
desbt
debemos hacerCTRL+d
. Podemos lanzar cualquier otro comando de sbt (consultar Using the SBT console.Para salir del contenedor podemos escribir el comando
exit
o hacerCTRL+c
. -
Prueba que la aplicación funciona correctamente trabajando con la base de datos MySQL (el funcionamiento real de la aplicación y para hacer pruebas de integración).
Lanza MySQL con Docker:
$ docker run -d -p 3316:3306 --name db-mysql -e MYSQL_ROOT_PASSWORD=mads -e MYSQL_DATABASE=mads mysql:5
!!! Warning "Importante"
En los laboratorios de la EPS está instalada la imagen Docker 5.7.18 de MySQL. Hay que definir explícitamente esa versión en el comando docker, escribiendo `mysql:5.7.18`.
Para parar y volver a poner en marcha el contenedor mysql puedes usar los comandos
docker stop
ydocker start
. Los datos añadidos en la base de datos se mantendrán mientras que el contenedor no se borre. El comandodocker container ls -a
lista todos los contenedores existentes (parados y en marcha):$ docker container ls CONTAINER ID IMAGE CREATED STATUS PORTS NAMES bd057639b6ac mysql:5 30 minutes ago Up 22 minutes 33060/tcp, 0.0.0.0:3316->3306/tcp db-mysql $ docker container stop bd057639b6ac CONTAINER ID IMAGE CREATED STATUS PORTS NAMES bd057639b6ac mysql:5 31 minutes ago Exited (0) 7 seconds ago db-mysql $ docker container start bd057639b6ac CONTAINER ID IMAGE CREATED STATUS PORTS NAMES bd057639b6ac mysql:5 32 minutes ago Up 5 seconds 33060/tcp, 0.0.0.0:3316->3306/tcp db-mysql
Ahora ya podemos lanzar la aplicación con docker para que trabaje con la base de datos del contenedor, definiendo ahora en variables de entorno la URL, el usuario y la contraseña con la que debe conectarse la aplicación a la base de datos. Usamos la opción
link
de docker para definir el nombre lógico del contenedor al que debe conectarse la aplicación.$ docker run --link db-mysql --rm -it -p 9000:9000 -e \ DB_URL="jdbc:mysql://db-mysql:3306/mads" -e DB_USER_NAME="root" -e \ DB_USER_PASSWD="mads" -v "${PWD}:/code" domingogallardo/playframework
Y desde la consola sbt modificamos la preferencia
config.file
para que la aplicación utilice la configuración definida en el ficheroconf/develop-mysql.conf
.[mads-todolist-inicial] $ set javaOptions += "-Dconfig.file=conf/develop-mysql.conf" [mads-todolist-inicial] $ run
Prueba que la aplicación funciona correctamente. Puedes comprobar las tablas y los datos almacenados en la base de datos conectándote a la base de datos en el puerto 3316 desde cualquier cliente MySQL:
- En los laboratorios de la EPS, usando MySQL Workbench.
- En IntelliJ IDEA puedes usar la consola MySQL:
Es posible examinar el esquema de la base de datos:
Y examinar tablas en concreto:
-
Con todo lo hecho hasta ahora ya hemos comprobado que la aplicación se compila correctamente y se ejecuta sin problema en las dos configuraciones más importantes con las que trabajaremos: base de datos en memoria y base de datos MySQL.
Para el desarrollo de la práctica que viene a continuación es
fundamental que entiendas el funcionamiento de Play Framework. Lo
explicaremos rápidamente en la clase de teoría usando el documento
introducción a Play Framework para las prácticas de
MADS. Pero es imprescindible que hagas tú un
esfuerzo descargando, probando y modificando las dos aplicaciones:
domingogallardo/play-proyecto-inicial
y
domingogallardo/mads-todolist-inicial
(es la aplicación que se ha
copiado en tu repositorio).
Puedes trabajar en estos proyectos sin miedo de estropearlos. Es más, cuanto más los estropees mejor, porque es la forma de aprender. No deberás entregar nada de estos proyectos.
En esta primera práctica vamos a desarrollar las siguientes dos historias de usuario o features:
- Página Acerca de
- Barra de menú
- Página listado de equipos
- Página descripción de equipo
La práctica va a consistir en la realización en tu proyecto de todos los elementos necesarios para implementar estas features : wiki, issues, pull requests (con sus commits en los que se desarrolla paso a paso cada issue) y tablero del proyecto.
Haremos paso a paso la primera característica, creando la primera versión 1.0.0 de la aplicación. Las siguientes características las deberás desarrollar tu mismo y entregar la versión 1.1.0.
La versión 1.0.0 será la versión inicial de la aplicación. Desarrollaremos en esta versión la primera característica: Página Acerca de.
Utilizaremos la Wiki del proyecto GitHub para documentar las características a desarrollar en la aplicación. Deberá haber una página para cada característica. La página principal de la Wiki será el backlog del proyecto y deberá tener los enlaces a todas las características desarrolladas y pendientes de desarrollar.
Añade la página principal, en la que organizarás el listado de features desarrolladas en proyecto. Un posible ejemplo de organización es el siguiente:
Añade una página con la descripción de la característica Página Acerca de:
Configura el tablero del proyecto, poniendo como nombre ToDoList
y
seleccionando como plantilla Automated kanban
. Elimina las tarjetas
en la columna To do
y añade la columna In pull request
entre In progress
y Done
.
En las columnas deberán aparecer los issues y pull requests del proyecto. GitHub permite automatizar el movimiento de las tarjetas de una columna a otra. A continuación mostramos la configuración que usaremos:
Deberemos mover manualmente las tarjetas en algún caso, porque GitHub no podrá detectar las condiciones. En resumen, las condiciones de las fichas que habrá en cada columna son las siguientes:
- Columna
To do
: Nuevos issues añadidos al proyecto. Cuando añadimos el proyecto al issue (en la página del issue) GitHub lo coloca automáticamente en esta columna. - Columna
In progress
: Issues que se han comenzado a implementar (se ha creado una rama su desarrollo). Manual. - Columna
In pull request
: Pull request creados. Cuando añadimos el proyecto al pull request (en la página del pull request) GitHub lo coloca automáticamente en esta columna. Archivaremos el issue implementado por el pull request manualmente. - Columna
Done
: Pull requests cerrados. GitHub lo detecta automáticamente.
Añade el primer issue, correspondiente a la feature a desarrollar Página Acerca de. Añade las etiquetas que inicialmente vamos a usar (ver la imagen) y el milestone 1.0.0.
Añade el issue al tablero (desde la página del issue) y
automáticamente se añadirá en la columna To do
.
Para desarrollar el issue abriremos una rama en Git, realizaremos
commits sobre ella hasta estar terminado y después crearemos un pull
request en GitHub para realizar la integración con la rama master
.
Mueve en el tablero la tarjeta con el issue a la columna In progress
.
Empezamos el desarrollo importando el proyecto en IntelliJ y creando
dos pestañas en el panel Terminal
: una para lanzar el proyecto con
Docker y trabajar con Sbt y la otra para trabajar con Git.
Creamos la rama en la que desarrollaremos la feature y la subimos a
GitHub (en el panel Git
):
$ git checkout -b acerca-de
Switched to a new branch 'acerca-de'
$ git push -u origin acerca-de
Username for 'https://github.com': domingogallardo2
Password for 'https://[email protected]':
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/mads-ua-18/todolist-2018-domingogallardo2.git
* [new branch] acerca-de -> acerca-de
Branch 'acerca-de' set up to track remote branch 'acerca-de' from 'origin'.
Hacemos un primer commit.
Cambia en build.sbt
el nombre del proyecto a mads-todolist-<tu-nombre>
y
la versión a 1.0.0-SNAPSHOT
. El sufijo SNAPSHOT
indica en
desarrollo. Cuando hagamos el release de la versión 1.0.0
eliminaremos el sufijo.
Realiza el commit y súbelo a GitHub:
$ git add build.sbt
$ git status
On branch acerca-de
Your branch is up to date with 'origin/acerca-de'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: build.sbt
$ git commit -m "Cambiado el nombre del proyecto y empezamos versión 1.0.0"
[acerca-de f6180cc] Cambiado el nombre del proyecto y empezamos versión 1.0.0
1 file changed, 2 insertions(+), 2 deletions(-)
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 367 bytes | 367.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/mads-ua-18/todolist-2018-domingogallardo2.git
6767016..a332017 acerca-de -> acerca-de
Consulta en GitHub que el commit se ha subido en GitHub:
De esta forma habrás comprobado que tienes permiso de escritura en el repositorio y que ya puedes comenzar a realizar la práctica.
Si ahora vuelves a lanzar la máquina Docker en el proyecto, verás
que ha cambiado el nombre del proyecto (en el panel Sbt
):
$ docker run --rm -it -v "${PWD}:/code" -p 9000:9000 domingogallardo/playframework
[info] Loading project definition from /code/project
[info] Set current project to mads-todolist-dgallardo (in build file:/code/)
[mads-todolist-dgallardo] $
En el segundo commit incluiremos el desarrollo de los elementos necesarios para la página acerca de:
- Ruta
- Acción en controller
- Vista
Realiza los siguientes cambios.
Fichero conf/routes
:
GET /equipos/addUsuario controllers.EquipoController.formularioAddUsuarioEquipo()
POST /equipos/addUsuario controllers.EquipoController.addUsuarioEquipo()
+ GET /about controllers.HomeController.about()
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
Fichero app/controllers/HomeController.java
:
public Result index() {
return ok(index.render("Your new application is ready."));
}
+ public Result about() {
+ return ok(about.render());
+ }
}
Fichero app/views/about.scala.html
:
+@main("Acerca de") {
+ <div class="container-fluid">
+ <h1>ToDo List</h1>
+ <ul>
+ <li>Desarrollada por Domingo Gallardo</li>
+ <li>Versión 1.0.0 (en desarrollo)</li>
+ <li>Fecha de release: pendiente de release</li>
+ </ul>
+ </div>
+}
Prueba la página accediendo a la url http://localhost:9000/about.
Por último, confirma el commit en la rama y súbelo a GitHub. En el
panel Git
:
$ git add .
$ git status
On branch acerca-de
Your branch is up to date with 'origin/acerca-de'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: app/controllers/HomeController.java
new file: app/views/about.scala.html
modified: conf/routes
$ git commit -m "Añadida ruta, vista y controller 'about'"
[acerca-de 2831312] Añadida ruta, vista y controller 'about'
3 files changed, 14 insertions(+)
create mode 100644 app/views/about.scala.html
$ git push
En el tercer commit pondremos un enlace a la página acerca de en la página de login de la aplicación.
Realiza el siguiente cambio:
Fichero app/views/formLogin.scala.html
:
<a class="btn btn-link" href="@routes.UsuarioController.registroUsuario()">Ir a registro</a>
</p>
+ <p><a class="btn btn-link" href="@routes.HomeController.about()">Acerca de</a></p>
}
Prueba que funciona correctamente, haz el commit y súbelo a GitHub:
$ git commit -am "Añadido enlace a página 'about' en página 'login'"
[acerca-de 672c28f] Añadido enlace a página 'about' en página 'login'
1 file changed, 1 insertion(+)
$ git push
Una vez terminada la implementación de la feature en la rama, creamos un pull request en GitHub para indicar que estamos listos para mezclar la rama con la feature con la rama principal de desarrollo (master).
Más adelante añadiremos al pull request una comprobación automática de las pruebas y una revisión de código por parte de compañeros del equipo. Por ahora haremos nosotros ambas tareas.
Vamos a verlo paso a paso.
Empezamos por mezclar la rama de forma local con master
, antes de
hacer el pull request en GitHub, para probar que no se ha roto nada
(todos los tests deben seguir pasando) y que los tests que hemos
añadido también funcionan correctamente (en este caso no hemos añadido
ninguno).
En el panel Git
:
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ git merge acerca-de
Updating 6767016..672c28f
Fast-forward
app/controllers/HomeController.java | 4 ++++
app/views/about.scala.html | 8 ++++++++
app/views/formLogin.scala.html | 1 +
build.sbt | 4 ++--
conf/routes | 2 ++
5 files changed, 17 insertions(+), 2 deletions(-)
create mode 100644 app/views/about.scala.html
En el panel Sbt
:
[mads-todolist-dgallardo] $ test
...
[info] Passed: Total 35, Failed 0, Errors 0, Passed 35
[success] Total time: 71 s, completed Sep 6, 2018 10:04:55 AM
[mads-todolist-dgallardo] $
Una vez que hemos comprobado que todo funciona bien, deshacemos el
merge que acabamos de realizar en la rama master
, ya que
actualizaremos después la rama con el resultado del pull request en
GitHub:
$ git reset --hard origin/master
HEAD is now at 6767016 Commit inicial
$ git checkout acerca-de
Switched to branch 'acerca-de'
Your branch is up to date with 'origin/acerca-de'.
Ya podemos crear el pull request en GitHub.
Accede a la rama y comprueba que están todos los cambios pulsando
Compare
. Pulsa después el botón New pull request
para crear el
pull request.
Introduce el nombre del pull request, el comentario, el milestone y la etiqueta. Copia los datos del issue, y en el comentario escribe
Closes #1
De esta forma, cuando se cierre el pull request se cerrará
automáticamente el issue. El número #1
lo convierte GitHub en un
enlace al issue correspondiente. De esta forma podemos examinar el
issue resuelto por el PR.
Añade también el PR al tablero del proyecto. Se colocará
automáticamente la columna In pull request
. Entra en el proyecto y
archiva la tarjeta con el issue, ya que la actividad de desarrollar
la feature queda representada por el pull request.
En este momento se debería hacer una revisión del código del pull request y comprobar de forma automática que la integración con master no introduce errores en los tests. Lo haremos en siguientes prácticas.
GitHub informa de que no hay conflictos con la rama master
y que es
posible hacer el merge. Pulsa el botón de Merge
y confírmalo. Borra
la rama en GitHub, pulsando el botón correspondiente.
Por último, este merge lo has hecho en GitHub, debes integrarlo en tu repositorio local. En la pestaña de Git:
$ git checkout master
$ git fetch
remote: Counting objects: 1, done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From https://github.com/mads-ua-18/todolist-2018-domingogallardo2
6767016..9527ae2 master -> origin/master
$ git pull
Updating 6767016..9527ae2
Fast-forward
app/controllers/HomeController.java | 4 ++++
app/views/about.scala.html | 8 ++++++++
app/views/formLogin.scala.html | 1 +
build.sbt | 4 ++--
conf/routes | 2 ++
5 files changed, 17 insertions(+), 2 deletions(-)
create mode 100644 app/views/about.scala.html
$ git branch -d acerca-de
Deleted branch acerca-de (was 672c28f).
$ git remote prune origin
Pruning origin
URL: https://github.com/mads-ua-18/todolist-2018-domingogallardo2.git
* [pruned] origin/acerca-de
$ git log --oneline --graph --all
* 9527ae2 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #2 from mads-ua-18/acerca-de
|\
| * 672c28f Añadido enlace a página 'about' en página 'login'
| * 3fdfb83 Añadida ruta, vista y controller 'about'
| * a332017 Cambiado el nombre del proyecto y empezamos versión 1.0.0
|/
* 6767016 Commit inicial
Comprobamos también la historia de commits en GitHub. Aparecerá el commit de merge introducido por el pull request.
De esta forma hemos cerrado el PR e integrado su código en la rama
principal de desarrollo. En el tablero de proyecto debe haber cambiado
la tarjeta con el PR a la columna Done
.
Por último creamos el release 1.0.0. Haremos un commit directamente
sobre la rama master
(más adelante explicaremos una forma más
elaborada de hacer un release, cuando expliquemos el flujo de
trabajo de GitFlow).
Crea un commit con la confirmación del número de versión y fecha en
los ficheros build.sbt
y about.scala.html
Fichero build.sbt
:
name := """mads-todolist-dgallardo"""
-version := "1.0.0-SNAPSHOT"
+version := "1.0.0"
lazy val root = (project in file(".")).enablePlugins(PlayJava)
Fichero app/views/about.scala.html
:
<h1>ToDo List</h1>
<ul>
<li>Desarrollada por Domingo Gallardo</li>
- <li>Versión 1.0.0 (en desarrollo)</li>
- <li>Fecha de release: pendiente de release</li>
+ <li>Versión 1.0.0</li>
+ <li>Fecha de release: 6/9/2018</li>
</ul>
}
Añadimos el commit y lo subimos a GitHub
$ git add .
$ git commit -m "Cambio de versión a 1.0.0"
[master 61d4ac8] Cambio de versión a 1.0.0
2 files changed, 3 insertions(+), 3 deletions(-)
$ git push
Y, por último, creamos la versión 1.0.0 en GitHub pulsando en el
enlace release
en la página principal (pestaña Code
).
Un release en GitHub se guarda como una una etiqueta Git, junto con información asociada. Se suelen indicar las nuevas features añadidas en el release mediante enlaces a los pull requests añadidos. También añadiremos enlaces a la página de la Wiki en la que se describe la característica.
El resultado será:
El resto de la práctica consistirá en desarrollar la versión 1.1.0, usando la misma metodología vista anteriormente.
Deberás desarrollar tres características nuevas obligatorias y 2 opcionales:
- Barra de menú, obligatoria.
- Página de equipos de un usuario, obligatoria.
- Página de descripción de un equipo con el listado de usuarios que participan en él, obligatoria.
- (Opcional) Usuario administrador que gestiona los equipos
Deberás implementar cada característica siguiendo la metodología que hemos usado anteriormente. En la implementación, deberás añadir el código necesario en cada una de las capas de la aplicación:
- Capa de presentación (vista)
- Nuevo método en la capa de controller
- Métodos necesarios en la capa de servicio y de repository
En cada característica deberás también incluir tests que prueben los nuevos métodos añadidos en la capa de servicio.
La aplicación deberá tener una barra de menú común a todas sus páginas, menos en las páginas de login y registro.
- La barra de menú estará situada en la parte superior de la página y será un Navbar. de Bootstrap.
- La barra de menú tendrá como mínimo los siguientes elementos (de
izquierda a derecha):
ToDoList
: enlace a la página acerca de.Tareas
: enlace a la página de tareas, con la lista de tareas pendientes del usuario.Equipos
: enlace a la página de equipos, con el listado de equipos al que pertenece el usuario.- Nombre usuario: A la derecha de la página. Desplegable con las opciones:
Cuenta
: Futura página para gestionar la cuentaCerrar sesión <nombre usuario>
: cierra la sesión y lleva a la página de login.
Cuando el usuario pinche en la opción Equipos
del menú irá a una
página con un listado del equipo a los que pertenece.
- El listado de equipos será una tabla similar al listado de tareas, pero sin acciones.
- La ruta para obtener el listado de los equipos de un usuario será
/usuarios/:id/equipos
. Al igual que el listado de tareas, la ruta estará protegida para que sólo pueda acceder un usuario logeado y siendo el usuario logeado el mismo que elid
.
En la lista de equipos de un usuario los equipos tendrán un enlace para acceder a su descripción.
- En la descripción de un equipo aparecerá: su nombre y el listado de personas del equipo.
- La ruta para obtener la descripción de un equipo será
/equipos/:id
. La ruta estará protegida para que sólo pueda acceder un usuario logeado.
Al realizar el registro será posible darse de alta como usuario administrador.
- Para darse de alta como administrador se deberá activar un check box en la página de registro.
- Sólo puede haber un administrador. Si ya existe un administrador, no debe aparecer el check box en la página de registro.
- El usuario administrador tendrá una barra de menú en la que se
añadirá la opción vacía
Administración
(que iremos cambiando conforme añadamos funcionalidades a realizar por el administrador).
El usuario administrador podrá gestionar los equipos: añadir y editar equipos (la opción de borrar la dejamos para más adelante).
- El administrador tendrá una opción adicional del menú llamada
Administración
de la que se desplegarán la opciónEquipos
. - En la administración de equipos se entrará en una página donde se mostrará un listado de todos los equipos existentes (como el listado de tareas) y se dará la opción de añadir y editar.
- En la página de edición de un equipo se podrá modificar su nombre y aparecerá una tabla con todos los usuarios. Se podrá eliminar usuarios del equipo o añadir nuevos usuarios al mismo.
- Los usuarios a añadir se escogerán de un desplegable en el que se mostrarán todos los usuarios no pertenecientes al equipo que se está modificando.
- La práctica tiene una duración de 4 semanas y debe estar terminada el martes 9 de octubre.
- La parte obligatoria puntúa sobre 7 y la opcional sobre 3 puntos.
- La calificación de la práctica tiene un peso de un 12% en la nota final de la asignatura.
- Para realizar la entrega se debe subir a Moodle un ZIP que contenga
todo el proyecto, incluyendo el directorio
.git
que contiene la historia Git. Para ello comprime tu directorio local del proyecto después de haber hecho unclean
ensbt
para eliminar el directoriotarget
que contiene los binarios compilados. Debes dejar también en Moodle la URL del repositorio en GitHub.
Para la evaluación se tendrá en cuenta:
- Desarrollo continuo (los commits deben realizarse a lo largo de las 4 semanas y no dejar todo para la última semana).
- Correcto desarrollo de la metodología.
- Diseño e implementación del código y de los tests de las características desarrolladas.