Montar un servidor Push Android en la nube en 10 minutos

dic 13
2012

En primer lugar quiero dejar claro que el alcance de este post es montar un servidor Push de pruebas usando el servidor de ejemplo de GCM que nos provee Google.

Respecto a OpenShift vamos a usar la opción gratuita ya que es más que suficiente, incluso se puede activar el escalado y gratuitamente te permite escalar hasta 3 instancias.

Respecto la decisión de usar OpenShift por encima de otros como Google App Engine, el cual GCM ya dispone de un proyecto preparado para ello, es probar esta nuevo sistema PaaS que ha creado Red Hat y el cual tiene muy buena pinta. Por otro lado Google App Engine la primera vez que accedes a la aplicación es bastante lento y como el proposito de mi servidor son pruebas no quería tener que esperar demasiado.

Creación de la aplicación en OpenShift


Dicho esto manos a la obra. En primer lugar lo primero es crear una cuenta en OpenShift. Una vez creada la cuenta y validado el correo, lo siguiente que tenemos que hacer es elegir el tipo de servidor en el que vamos a desplegar nuestra aplicación. Para nuestro ejemplo elegiremos JBoss Application Server 7.1

Servidor a elegir

Un vez hemos elegido el servidor tenemos que configurar lo que ellos llaman el “Cartridge”

configure_server

Un par de aclaraciones respecto a la elección de parámetros:

  • En la parte denominada “Source Code” lo hemos dejado por defecto porque no queremos subir nuestro proyecto a otro sitio sino que queremos usar su el repositorio GIT que nos crear OpenShift. En caso de querer utilizar uno propio, GitHub, BitBucket, etc. con pulsar “Change” e introducir le URL del vuestro es suficiente
  • Hemos dejado todo por defecto excepto el hombre de la URL que la hemos personalizado con nuestro nombre de App, Push, y nuestro namespace

Hecho esto pasamos al tercer paso que es configurar las capacidades de nuestro servidor pero esto por ahora no vamos a tocar nada. Con esto terminamos la creación de nuestra primera aplicación en OpenShift.

Instalación de RHC para controlar nuestra aplicación


Una vez tenemos creada la aplicación el siguiente paso es poder iniciar, parar, modificar la instancia, en definitiva interactuar con nuestra aplicación. Para ello los chicos de Red Hat han creado una gema llamada “RHC”. Al ser una gema necesitamos tener Ruby instalado en nuestra máquina para poder utilizarla. Todo ello viene muy bien explicado en este articulo de OpenShift sobre como instalar RHC y configurarlo. Al terminar de instalar y configurar RHC, lo habremos vinculado con nuestro login de OpenShift para poder operar con nuestra cuenta.

Obtención y configuración del proyecto


Hasta aquí lo que hemos hecho ha sido crear una aplicación en OpenShift y configurar RHC para poder interactuar con ella. Ahora toca el turno de bajarnos el servidor de prueba de GCM y adaptarlo a la estructura que necesita OpenShift para funcionar. Lamentablemente parece que no está disponible por separado así que hay que descarger e instalar el SDK de Android. Una vez instalado tenemos que abrir el SDK Manager e instalar el plugin Google Cloud Messaging for Android Library

gcm_install

Para que podamos desplegar el proyecto en OpenShift tenemos que sincrinizarlo con el repositorio que hemos creado / tenemos y convertir el proyecto en algo que OpenShift pueda usar.

Lo primero es conectarlo al repositorio GIT, si no tenemos GIT habrá que instalarlo, que se ha creado en OpenShift para alojar el código de nuestro proyecto (o el nuestro si hemos decidido hacerlo así).

La URL de nuestro repositorio GIT la encontramos en la página de OpenShift, en “My Applications” pulsamos en el nombre de nuestra aplicación

app_name_link

Una vez dentro vemos una caja donde está puesto el nombre del repositorio que nos han creado

git_repository

Teniendo localizada la URL procedemos a copiar el proyecto en nuestro workspace. Dentro de la carpeta ${ANDROID_SDK_HOME}/extras/google/gcm/samples tenemos los dos ejemplos de servidor: el preparado para Google App Engine (gcm-demo-appengine) y el proyecto Java que nosotros vamos a desplegar en OpenShift (gcm-demo-server). Copiamos este último proyecto a nuestro workspace.

Hecho esto abrimos una consola para ejecutar comandos de GIT, por ejemplo yo en Windows uso el GIT Bash que viene con la distribución de GIT, y ejecutamos la siguiente sucesión de comandos:

git init
git add .
git commit -m "initial import"
git remote add openshift URL_DEL_REPOSITORIO (pej svn://8923840923809823409....git)
git pull openshift master

Esto hará un merge de lo que hay subido en el repositorio remoto de OpenShift con nuestro proyecto, que es lo que queremos, pero creará un conflicto al hacer el merge en el fichero .gitignore que debemos resolver.

Ya sincronizado ahora lo importamos en nuestro IDE , en mi caso uso Eclipse y con Import -> Maven -> Existing Maven Projects, y realizamos las siguientes modificaciones:

  • Movemos el paquete src/com/* a src/main/java
  • Movemos la carpeta WebContent/WEB-INF/lib a src/main/webapp/WEB-INF/lib
  • Movemos el archivo WebContent/WEB-INF/web.xml a src/main/webapp/WEB-INF
  • Movemos los archivos archivo WebContent/index.jsp y favicon.png a src/main/webapp
  • Borramos el archivo src/main/webapp/index.html

Alta en Google APIs y activación del servicio GCM


Ahora mismo el proyecto ya esta sincronizado con nuestro repositorio y lo hemos convertido en un “proyecto OpenShift”. Lo último que faltaría ya sería añadir nuestra API Key de Google. Para obtener el API Key hay que entrar Google APIs, crear un proyecto (si no está creado), y despues activar el servicio Google Cloud Messaging for Android

gcm_service_google

Activado este servicio, el API Key lo podemos obtener en el menú API Access

En este punto el proyecto nos provee un archivo llamado api.key que yo he intentado utilizar sin éxito así que como el servidor es de prueba he optado por poner el API Key directamente en el código, concretamente en la clase ApiKeyInitializer

public void contextInitialized(ServletContextEvent event) {
    logger.info("Reading " + PATH + " from resources (probably from " +
        "WEB-INF/classes");
    //String key = getKey();
    String key = "NUESTRO_API_KEY";
    event.getServletContext().setAttribute(ATTRIBUTE_ACCESS_KEY, key);
  }

Para que el servidor de OpenShift encuentre la librería gcm-server.jar, la cual no está en los repositorios de Maven, tenemos que modificar el archivo pom.xml del proyecto e incluir lo siguiente

<dependency>
<groupId>com.google.android.gcm</groupId>
<artifactId>gcm-server</artifactId>
<version>3</version>
<type>jar</type>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/gcm-server.jar</systemPath>
</dependency>

También para no tener mayores problemas añadí la dependencia hacia json-simple que tenía el proyecto

<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>

Modificado esto, lo ultimo que hacemos es un commit de todos los cambios realizados.

git add .
git add -u
git commit -m "ready to go"
git push openshift master

Al ejecutar el comando push provocará que al terminar despliegue esta nueva versión. Si todo ha ido bien ya tendremos nuestro servidor funcionando en la dirección que configuramos al principio, en mi caso http://push-thefrutos.rhcloud.com/

Si habéis llegado hasta aquí os merecéis un premio jejeje. Espero vuestro feedback para mejorar el artículo si fuera necesario :)

  • sabadow

    Donde indicas WebContent/WEB-INF/lib/* a src/main/webapp/WEB-INF a mí me ha inducido a error, puesto que se ha de mover a src/main/webapp/WEB-INF/lib (como indicas en la dependencia de maven).
    Por lo demás un artículo genial y muy práctico.

    • Ethervoid

      Actualizado :-)

      Gracias por el apunte y me alegra que te resulte práctico :-)

Visit Our Friends!

A few highly recommended friends...

Pages List

General info about this blog...