Skip to content

Este microservicio proporcionará imágenes que compartan un tag de Instagram. Estará basado en goinsta. Los datos se almacenarán en una base de datos SQL. Se usará papertrails para logs y tecnología REST.

License

Notifications You must be signed in to change notification settings

Jesus-Sheriff/go-InstaCrawler

Repository files navigation

go-InstaCrawler

Build Status Run Status CircleCI License: GPL v3

Microservicio que proporciona la URL de la última imagen publicada en Instagram de un hashtag dado.

Para otra información puedes ver el antiguo README

Índice

Pre-requisitos 📋

Se recomienda instalar en primer lugar un gestor de versiones como g para poder probar el mismo programa en diferentes versiones del lenguaje.

curl -sSL https://git.io/g-install | sh -s

Nos situamos en nuestra carpeta de trabajo y procedemos a instalar la versión que queramos de go. Podemos instalar la última versión así:

g install latest
g run latest

O consultar las versiones disponibles así:

g list-all

Nota sobre versiones:

  • go actualmente tiene la versión estable 1.13.4 (released 2019/10/31) y da soporte hasta a dos versiones "major" anteriores (1.11 en este caso)
  • Más información en los comentarios del archivo .travis.yml y en la información de versiones oficial de go.

Instalación y uso 🔧

Clonamos repositorio

git clone https://github.com/Jesus-Sheriff/go-InstaCrawler
cd go-InstaCrawler

Debemos definir unas variables de entorno. Estas variables pueden hacerse permanentes si se añaden al archivo $HOME/.bash_profile y se ejecuta source $HOME/.bash_profile. (NOTA: $PATH y $GOPATH deben definirse donde se desee trabajar, estos son los valores por defecto recomendados en la documentación).

export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin
export INSTAGRAM_USERNAME=_tu_nombre_de_usuario_
export INSTAGRAM_PASSWORD=_tu_contraseña_

Para usar las órdenes del makefile se requiere también del programa pmgo.

Este programa es un gestor de procesos escrito en go básico pero funcional.

go get github.com/struCoder/pmgo
mv $GOPATH/bin/pmgo /usr/local/bin

Por último, en el archivo .env se define el puerto del servicio, por defecto es el 8080.

Uso del microservicio

Para ejecutar el servicio podemos hacer:

  • Ejecución completa de tests+servicio
make

Por defecto al hacer make ejecuta la orden del makefile all: test run que, después de descargar y actualizar dependencias, ejecuta el test y si es correcto compila y ejecuta el programa.

  • Ejecución solo del servicio
make deps
make run

make deps descarga dependencias. La orden make run en el makefile es esta:

go run goinsta.v2/examples/show-latest-image/main.go

Compila el código y ejecuta.

Por defecto al ejecutarlo, muestra la última imagen con el hashtag #golang.

Un ejemplo de salida es:

2019/10/09 12:03:22 ultima foto:  https://scontent-mad1-1.cdninstagram.com/vp/7c8004a33e8ef83675e7c62a62c821d7/5E39388E/t51.2885-15/e35/70513351_167187977761265_1918517610523590583_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=105&se=8&ig_cache_key=MjE1MDc2MzEwMzMzMTk0ODE0Mw%3D%3D.2

Una vez arrancado podemos hacer las siguientes llamadas:

  • /status

    Devuelve el status del servicio.

  • /latest

    Devuelve el estado de la llamada y el URI de la última imagen almacenada.

  • /latest/{id}

    Devuelve el estado de la llamada y el URI de la imagen número id. Tanto si el número especificado es correcto o no, se obtiene una respuesta.

Ejecutando las pruebas (tests) ⚙️

Nota: el archivo de test de la clase principal con comentarios linea a linea está aquí.

Actualmente están todos los tests en un solo fichero.

En él están los tests funcionales que chequean las llamadas al microservicio (/status, /latest y /latest/{id}) y los tests unitarios.

Para ejecutar todos los tests:

make test

Y debería dar como salida algo similar a:

go test -v ./...
?   	go-InstaCrawler/goinsta.v2/examples/show-latest-image	[no test files]
=== RUN   TestGetStatus
--- PASS: TestGetStatus (0.00s)
    latest_image_test.go:49: getStatus correcto: '{Status: "OK", URI: ""}'
=== RUN   TestGetImage
--- PASS: TestGetImage (0.00s)
    latest_image_test.go:66: getImage correcto: '{Status: "OK", URI: "https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/e35/74533385_166361284555809_7727768850258146020_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=109&bc=1571337657&oh=121bcbbc0ebee792f067f0d9cfcd5549&oe=5E2D09EB&ig_cache_key=MjE1ODI0Mjc3ODE0MDUwNjc2Mg%3D%3D.2"}'
=== RUN   TestGetImageNumber
--- PASS: TestGetImageNumber (0.00s)
    latest_image_test.go:83: getImageNumber correcto: '{Status: "OK", URI: "https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/e35/74533385_166361284555809_7727768850258146020_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=109&bc=1571337657&oh=121bcbbc0ebee792f067f0d9cfcd5549&oe=5E2D09EB&ig_cache_key=MjE1ODI0Mjc3ODE0MDUwNjc2Mg%3D%3D.2"}'
=== RUN   TestNotFound
--- PASS: TestNotFound (0.00s)
    latest_image_test.go:101: notFound correcto: '{Status: "NOT - OK: 404", URI: ""}'
=== RUN   TestImportAccount
--- PASS: TestImportAccount (6.13s)
    latest_image_test.go:139: URL is: https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/e35/73287971_786782621780776_5746821102179489882_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=104&bc=1571337657&oh=3af3acad6bd6b04d0e1ec0ef53260dd5&oe=5E63B29C&ig_cache_key=MjE2Njc0NDk2Mzk4Mzg0Mjg4OQ%3D%3D.2
    latest_image_test.go:141: logged into Instagram as user 'apuntabienminombre'
PASS
ok  	go-InstaCrawler/goinsta.v2/tests	6.144s

La orden make test en el makefile es:

test: deps
    $(GOTEST) -v ./...

Nuevamente requiere de las dependencias y después ejecuta los test en modo verbose -v. El modo verbose muestra tanto los posibles fallos como las líneas de log que haya.

Integración Continua 📦

Los detalles de Integración Continua y su explicación para evaluación aquí

Actualmente están configurados y en funcionamiento:

Travis-CI para los tests y ejecución.

En el archivo de configuración de Travis ( .travis.yml ) están las distintas versiones usadas para testeo de la aplicación y su justificación.

Circle-CI para test y ejecución en la versión 1.13.1 de Go.

Shippable para tests.

Construido con 🛠️

  • gvm - Manejador de versiones de GO
  • make - Para la gestión de dependencias, variables de entorno, ejecución de test y compilación y ejecución.
  • godep - Manejador de dependencias. (Necesario para tener archivo go.mod para Heroku)
  • g - Como leemos en su documentación: "Simple go version manager, gluten-free."

buildtool: Makefile

El archivo de Makefile actualmente funciona correctamente para los tests, ejecución y resolución de dependencias.

Deployment 📦

Despliegue: https://goinstacrawler.herokuapp.com/

El despliegue se ha hecho en Heroku y se está trabajando en hacerlo en Google Cloud también.

Como se ha indicado en la sección "Uso del microservicio" tenemos las siguientes llamadas disponibles a la API:

  • /status

  • /latest

  • /latest/{id}

Más información sobre el despliegue para su corrección aquí.

Contenedor del microservicio 🐳

Contenedor: https://goinstacrawler.herokuapp.com/

Contenedor alternativo: https://goinstacrawler.azurewebsites.net/


Detalles adicionales para corrección, documentación extendida y decisiones de diseño en este enlace: docs/contenedorDocker.md


Se ha hecho el despliegue del contenedor Docker en Heroku y en Azure.

El contenedor sincronizado con los cambios de este repositorio está en Docker Hub y puedes hacerle pull a tu local aquí: jesussheriff/goinstacrawler

Una vez que lo tienes en tu máquina local, ejecuta los siguientes comandos.

docker build  -t my-golang-app .
docker run -p 5000:5000 my-golang-app

El microservicio estará accesible desde tu navegador en http://localhost:5000/

Provisionamiento 🇻🅰️

provision: provision/playbook.yml


Detalles adicionales para corrección, documentación extendida y decisiones de diseño en este enlace: docs/provisionamiento.md


El provisionamiento tiene dos fases: creación de la máquina virtual (con Vagrant 🇻) y provisionamiento de esta máquina con lo necesario (con Ansible 🅰️ en nuestro caso).

Tienes dos formas de comprobar el funcionamiento en local:

1. Si NO tienes este repositorio clonado localmente

Para usar la máquina creada se ejecutan los siguientes comandos:

vagrant init jesus-sheriff/go-InstaCrawler --box-version 1.0
vagrant up

El primero descarga la imagen (box) y el segundo la inicia.

2. Si tienes este repositorio clonado localmente

Solo necesitas hacer la siguiente orden que iniciará el proceso de provisionado completo (VM + Provisionado):

make vm

Una vez hecha alguna de las opciones anteriores, puedes conectarte por ssh a la máquina:

vagrant ssh

Despliegue final

Despliegue final: 104.214.228.152:5000

Documentación adicional para corrección en docs/Iaas.md

Enlaces de interés y guías de ayuda

godep - Documentación de godep

go modules - Aquí explica la documentación oficial del blog de Go cómo crear un archivo go.mod de dependencias.

Heroku con Go - Documentación de Heroku para empezar con tu proyecto de go.

Heroku con Go explicado de otra forma - Explica cómo crear el archivo Godeps de dependencias y cómo configurar el puerto (extreadamente útil).

Error de Heroku: (Web process failed to bind to $PORT within 60 seconds of launch) - Pregunta de StackOverflow con la que entendí por qué me daba ese fallo Heroku.

Deploy an app in Google Cloud - Documentación oficial

Deploy an app in Google Cloud - Medium

Exponer puerto para contenedor en local

Crear imágenes light de go para Docker y compilar el ejecutable sin linkeo dinámico

Esta pregunta de stackoverflow solucionó mis problemas de linkeo estático. Error: standard_init_linux.go:211: exec user process caused "no such file or directory"

Flags de compilación

Aquí empecé a ver cómo se provisionaba con Ansible

De aquí aprendí a coger las dependencias en Ansible (OJO! Tiene mucha información útil muy bien explicada)

De aquí vi cómo instalar Go, pero al ser un fichero de script (nosotros usamos Ansible) me daba problemas. En concreto con las órdenes export.

Cómo clonar un repositorio en tu máquina virtual con Ansible

Instalar git en Ansible

Conexión ssh con Vagrant

Cómo copiar, mover o renombrar con mv en Ansible

CLI de Azure para Linux Cómo instalar el CLI de Azure.

Azure Github Documentación oficial en el GitHub de Azure para configurar Vagrant. (Recomendado como primera lectura.)

Uso de Vagrant con Azure Esta guía está más o menos actualizada y me ha servido mucho.

Invocar make en Ansible En la documentación oficial de Ansible explica bien cómo invocar una orden de Makefile desde el playbook.

Licencia 📄

Este proyecto está bajo la Licencia GPLv3 - mira el archivo LICENSE para detalles

Gracias a... 🎁


⌨️ Plantilla adaptada de Villanuevand 😊

About

Este microservicio proporcionará imágenes que compartan un tag de Instagram. Estará basado en goinsta. Los datos se almacenarán en una base de datos SQL. Se usará papertrails para logs y tecnología REST.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published