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

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

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

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

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

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

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

Comment