Automatizacion: Diario de Lecherito

Lecherito

#60 Si, pero disfruto como un enano. Todo empezo porque queria hacer un scrobber de estos para plex y mira donde he terminado xdddddd.

Cuando empece con la liberria de configuracion fue porque lo necesitaba para un juego que estaba haciendo y al final termine sin hacer el juego y 1 a;o y pico trabajando en la libreria.

La cosa es que necesito hacer las cosas eficientes o no las hago. No puedo empezar a hacer basuras que me van a dar sida verlas en 6 meses. Literalmente me es imposible, pero bueno, ahora me es sencillito crear nuevos proyectos etc etc. Me falta que sea sencillo hacerles deploy.

Tambien creo que habra gente que aprenda algo con este diario, ni puta idea xdd

2
Lecherito

Poca cosa ultimamente, he estado trasteando un monton con SSL y HTTPS. Ahora tengo todos mis subdominios a full seguridad!

Cosas que he descubierto:

  1. Odio TOML, que asco de sintaxis macho.
  2. Dns challenge >>>>>> http challenge. Que comodo es el de dns.
  3. Al actualizar Synology DSM va a sobreescribir algunos ficheros de configuracion (por ejemplo redirecciones en el puerto 80/443) y hay que volver a cambiarlo.

La verdad es que como ahora estoy haciendo varias cosas a la vez, no me canso por asi decirlo. Cuando me canso de una cosa me voy a otra y ya volvere a lo otro. Las ultimas veces que hacia algo siempre estaba con una sola cosa de la que me acababa quemando y en este caso es un alivio bastante grande poder simplemente hacer otra cosa en vez de dejarlo todo por completo y seguir jugando a cualquier cosa random.

1
Lecherito

Pues estos dias me he dedicado a investigar lo de los bancos (lo teneis en el otro hilo) y visto que se puede hacer de una manera mas o menos sencilla me he puesto a hacerle deploy al servicio que tendre para insertar las transacciones.

He tenido algunos problemas ya que tengo un repositorio de artefactos maven privado pero por lo demas bastante normalito!

Al final todo se reduce al fichero de ci de gitlab (.gitlab-ci.yml) y asi es como me ha quedado:

stages:
  - release
  - build-image
  - deploy

release:
  when: on_success
  stage: release
  image: gradle:6.5
  script:
    - gradle release
  artifacts:
    paths:
      - build/libs/

build-image:
  stage: build-image
  when: on_success
  script:
    - docker stop BankerService || true
    - docker build -t bankerservice .

deploy:
  when: on_success
  stage: deploy
  script:
    - docker run --name BankerService -d -p 17500:8080 bankerservice

El dockerfile no es mas que un COPY el jar y RUN. Es la primera vez que lo hago, seguramente queden muchas esquinas que pulir pero bueno por ahora estoy mas o menos contento, estas cosas las estoy metiendo al template privado que tengo para cuando creo un servicio.

Sobre cosas menores:

  1. Estaba registrando los gitlab-runners a un proyecto en concreto, he tenido que resetear la contrase;a de admin para poder usar el token de los shared runners y ahora ya funciona en todos los proyectos (esto mola)
  2. Se puede gener el gitlab-runner en local para no tener que debugear en remoto haciendo un commit cada vez (esto me va a ahorrar algo de tiempo xD)
  3. Tenia un monton de endpoints en http y menudo co;azo cambiarlos todos, como consejo empezad con HTTPS cuanto antes :D
  4. En IntelliJ existe una manera de importar proyectos (cada uno con su propio repositorio) y el IDE va a sustituir las dependencias en Gradle por las locales haciendo asi el desarrollo bastante mas sencillo. De esta manera puedo a;adir varios proyectos como diferentes modulos en el mismo entorno y el IDE se encarga de lo demas. Si quereis leer un poco mas, aqui esta el post donde lo encontre (https://intellij-support.jetbrains.com/hc/en-us/community/posts/360005958400-Resolve-dependencies-in-project-with-Gradle-Modules-) esta bastante ocultado ya que parece que por ahora no es 100% fiable pero por lo que yo he visto va de lujo. Todo esto viene porque tengo cada proyecto en su propio repositorio en vez de un solo repositorio y que sea multiproyecto)

Tooling

He estado mejorando el OceanLibPlugin (el plugin de gradle que uso para manejar mis dependencias de una manera mas comoda) y le he a;adido override de versiones. Me parece un co;azo tener versiones del tipo 0.5.33, y prefiero tener un simple 1.0 (aunque esto tambien es un poco costumbre), y las versiones las puedo actualizar en el plugin y se actualizaran automaticamente en todos los proyectos donde use ese override. Ahora las dependencias me quedan asi:

Y me mola mucho porque esta super claro y ordenadito ademas de no necesitar cual es el fqmi de cada artefacto, de esa basura se encarga el plugin.

Bancos

Sobre los bancos, ya tengo un PoC de como pillar las transacciones aunque no se porque pero el token que me viene del banco parece solo durar 24 horas aunque lo refresques, es algo bastante curioso pero bueno, sigo testeando y aprendiendo sobre tink.

Los siguientes pasos en este frente son:

  1. Revisar los campos del servicio y la base de datos para tener todos los campos que necesito
  2. Usar el cliente BankerClient para insertar las transacciones
  3. Hacer deploy del servicio que recibe e inserta las transacciones cada X horas
  4. Mover grafana hacia la nueva base de datos
  5. Opcional (por ahora): A;adir algun tipo de autenticacion, aunque sea un simple user y pass random (aunque no es demasiado urgente, todo esta dentro de la VPN)
  6. Opcional: Investigar a ver como puedo traer las transacciones de hace X tiempo solamente, ahora mismo las trae absolutamente todas (y no hay mas huevos) y tendria que checkear yo mismo las cosas.

Extra:

  1. Tengo pensado hacer un dibujito sobre como estan montadas las cosas, a ver si ma;ana me acuerdo de ello y lo pongo por aqui.

Seguro que me dejo algo en el tintero pero vamos, esto es en lo que he estado dedicando el tiempo estos ultimos dias.

1
Lecherito

Pues este seria el diagrama de los repositorios y contenedores de docker que estoy usando para el sistema bancario

Es mas o menos lo que tengo, la leyenda seria:

  • Lo rojo es un contenedor docker (ya hecho o creado desde el jar)
  • Lo azul es una libreria
  • Lo que tiene un borde mas gordito es un repositorio en gitlab

Las dependencias van con el plugin de gradle (que es un wrapper de un mavencentral) y lo que me queda de hacer es el Fetcher que pilla transacciones y las envia al BankerService. Y los clients/model/services estan importados en el IDE como modulos asi que es easy el desarrollo.

1 1 respuesta
danao

#64 tienes pensado hacer análisis de datos en tiempo real?

Lo digo por si no conoces influxdb, es una base de datos para ese tipo de cosas.

Buen curro 👏👏👏

2 respuestas
Unrack

#65 A colación yo estoy testeando timescale. Aún no es muy escalable pero tiene mayor rendimiento que influx en un solo nodo y está basada en postgre (lo que beneficia en casi todo a la hora de consulta)

1 respuesta
danao

#66 entiendo que el tema de alta disponibilidad lo resolverán con postgre no?
La verdad que influxdb está bien pero depende para qué proyecto, he leido sobre ella no muy a fondo pero si que hablan de las limitaciones que tiene, para proyectos peques bien, para proyectos de plataforma y tal, no tanto.

Gracias por la info, siempre está bien conocer techs nuevas

Lecherito

#65 Pues teniendo en cuenta que hago una media de 1 transaccion diaria en mis bancos, no creo que haga falta saber nada en tiempo real. Lo que mas me interesa es el analisis que haga con esos datos (pero claro, para ello tengo que tener esos datos xD.

InfluxDB o Prometheus es lo que tengo pensado para almacenar las metricas aunque a esto todavia le tengo que dar una vuelta sobre como lo quiero. Aunque tambien tengo que investigar sobre Open Telemetry ya que estoy 99% seguro que eso va a ser el futuro (mayormente porque he trabajado de eso xDDD), supongo que sera algo parecido a sql y las implementaciones que hay detras.

A ver si hoy me pongo un rato y hago el fetcher, que no deberia ser nada dificil. El problema es que si no tienes la cuenta "premium", de los 35 centimos mensuales cuando haces login a una cuenta bancaria se borran a las 24 horas asi que tendria que cambiar el codigo cada 24 horas y eso es un co;azo. Les tengo ya un ticket para que me cambien al modelo premium y ya tenerlo todo preparado. De todas maneras me queda limpiar mucho codigo y cosas hardcoded asi que tengo trabajo para un rato xD

1
Lecherito

Un poco full vago hoy :D, me he dedicado a mejorar el plugin de Gradle para que sea incluso mas easy el crear nuevos proyectitos. El template usando el plugin se queda asi:

import ocean.ocean
import ocean.dependencies.*

plugins {
    java
    kotlin("jvm") version "1.3.70"
    id("com.github.johnrengelman.shadow") version "4.0.4"
}

ocean {
    this.name = "{{name|classname}}"
    this.version = 1.0
}

dependencies {
    implementation(kotlin("stdlib"))

    src {

    }

    tst {
        MockK[1.0]
    }
}

Y luego ya se le pueden poner mas dependencias ez clap!

PD: Los de Tink todavia no me han cambiado a premium asi que lo dejare un pelin de lado hasta que me lo cambien (no creo que tarden mas de 1 o dos dias mas)

Lecherito

Pues esta ma;ana me he dedicado a actualizar el NAS y configurar los backups que todavia no los tenia. He usado Hyper Backup y esta bien guardadito en S3 Infrequent Access.

Ayer tambien descubri "jib" una herramienta de gradle para crear imagenes de un contenedor desde la aplicacion en vez de hacerlo yo manualmente asi que es algo que le echare un vistazo. Si alguien esta interesado: https://github.com/GoogleContainerTools/jib

Lecherito

Hoy me he dedicado a hacer algo mas tranquilito, a;adir grupos de repositorios para hacer operaciones como build, clean y esas cosas. Todavia no tiene en cuenta las dependencias asi que tienen que estar en el orden correcto pero eso seria uno de los planes para el futuro

  "groups": [
    {
      "name": "ProjectBanker",
      "repositories": [
        "BankerModel",
        "Banker"
      ]
    }
  ],

Ejemplo: publish ProjectBanker

La verdad es que me mola tener tanta libertad de cosas para hacer, creia que iba a ser mas abrumador pero al final esta significado que no me aburro al estar haciendo siempre lo mismo.

Los malditos de Tink todavia no me han puesto premium y me da pereza que se reseteen los datos cada dia :(

Lecherito

Bueno, he a;adido el comando gitp que ejecuta un comando git en un proyecto, que viene a ser un repositorio o un conjunto de repositorios, bastante guay porque puedo ver el estado de un grupo instantaneamente.

Ademas he limpiado los repositorios de OpenBanking, e implementado mucho mejor el cliente de Banker, ya puedo hacer get y post de transacciones, estos proximos dos dias deberia tenerlo funcionando a falta de que me hagan premium jodeeeeeeeeeeeeeeer.

Por lo demas 10/10 sigue yendo bien la cosa

9 días después
Lecherito

Bueno, despues de la mudanza he podido seguir avanzando un poco. Ya tengo el premium de Tink y he de actualizar un poco la infrastructura para ir guardando los tokens en caso de que pase algo (algun crash) y no tener que ponerlos yo otra vez manualmente. Hice una prueba a ver como funcionaria el enviar los datos con el fetcher y esta funcionando con Revolut, pero hay muchas preguntas todavia en el aire, como por ejemplo:

  1. Como lidiar con transacciones repetidas?
  2. Como a;adir otro banco sin que sea hardcoded?

Tambien me dedique a probar jib y me dio casi mas problemas que soluciones pero al final lo deje mas o menos limpio (rescatando el diagrama de #64), ahora hay un repositorio nuevo "BankerDocker" que es un proyecto vacio que contiene una dependencia al servicio que quieres meter en docker y la peque;a configuracion de gradle para que genere un tar que luego se importa en docker.

plugins {
    java
    kotlin("jvm") version "1.3.70"
    id("com.google.cloud.tools.jib") version "2.4.0"
}

ocean {
    this.name = "BankerServiceDocker"
    this.version = 1.0
}

dependencies {
    src {
        Banker[1.0]
    }
}

jib {
    container {
        mainClass = "banker.service.Banker"
    }

    to {
        image = "bankerservice"
    }
}

De esta manera, tengo separado lo que es el deploy del servicio, asimismo configure gitlab para que cada vez que haga un push al servicio, se haga build del servicio y llame a la pipeline del repositorio de docker para que haga el deploy:

stages:
  - release
  - deploy

release:
  when: on_success
  stage: release
  image: gradle:6.5
  script:
    - gradle release

deploy:
  image: curlimages/curl
  when: on_success
  stage: deploy
  script:
    - "curl -X POST -F token=$TOKEN -F ref=master https://mygitlab.local/api/v4/projects/17/trigger/pipeline"

Asi que ahora se ha quedado de buena manera otra vez. Estuve mirando como hacer un webhook global (que es algo que hare tarde o temprano), para no tener que hacer todas estas cosas y poder hacerlo desde el webhook e incluso sin tener el repositorio de Docker, si no marcarlo de alguna manera (como por ejemplo en el plugin).

Fetcher

Respecto al fetcher, es bastante directo:

fun main() = runBlocking {
    val bankerClient = BankerClient("banker.local")

    val apiClientId = ApiClientId(
            id,
            secret
    )

    val httpClient = HttpClient(Apache) {
        install(JsonFeature) {
            serializer = GsonSerializer()
        }
    }
    val openBankingClient = OpenBankingTinkerClient(httpClient).also {
        it.auth(Gson().fromJson(File("test.txt").reader(), AccessTokenResponse::class.java))
    }

    val transactions = openBankingClient.transactions()
    println(transactions)

    transactions
            .map { it.toBankerTransaction(Bank.Revolut) }
            .forEach {
                bankerClient.transactions += it
            }
}

No es en paralelo ni nada por el estilo (tarda un minutico en transformar en insertar todas las transacciones (unas 2000) de Revolut, asi que no me importa. Lo siguiente aqui seria ponerlo en un scheduler para que cada 12 horas llame a los bancos configurados e inserte las nuevas transacciones.

1
9 días después
Lecherito

Pues estoy de vacaciones en la playa, pero he podido avanzar algunas cosas:

Bancos

Por ahora en este aspecto estoy algo bloqueado porque parecen tener un error en su backend (o yo estoy haciendo algo mal), pero no me dan todas las transacciones. Tengo dos cosas pendientes:

  1. Revolut solo me da 1.9 a;os de transacciones
  2. CaixaBank solo me da 3 a;os de transacciones (al menos estos tienen un numero concreto)
  3. No soportan bancos irlandeses

Asi que no me vale mucho para lo que me gustaria hacer, aunque seria posible empezar con estas y luego se podrian insertar las demas (lo tengo hecho para que da igual si se hace drop de la base de datos). Asi que eso no seria ningun problema

Deployments

He dejado todo bastante sencillo para los deployments y solo me queda una cosa por hacer relacionada con docker. Nada raro pero ahora con las vacaciones tampoco estoy demasiado en el pc

Rust

He estado jugando de nuevo con Rust (hace tiempo estuve con ello y no me llego a gustar demasiado), pero ahora no lo he notado tan asqueroso. Creo que empece demasiado fuerte con lo anterior que queria hacer.

En este caso me he puesto a traducir mi aplicacion de workspaces (https://www.mediavida.com/foro/dev/automatizacion-workspace-655572#1) a la que llame ocean en su dia. Asi que si me da la vena, la traduzco entera, la saco del workspace que ya no me haria falta al usar brew y cambio el binario entero.

En velocidad no se nota mucho ya que es algo super peque;o lo que estoy haciendo y que practicamente solo ejecuta otros programas (como gradle o git), pero el ejecutable (a falta de algunas cosas), ha bajado de 2.1 megas a 1.0:

-rwxr-xr-x  2 lecherito  staff   1.0M 14 Aug 17:05 target/release/ocean
-r-xr-xr-x  1 lecherito  staff   2.1M 26 Jul 14:40 /usr/local/Cellar/ocean/0.7/bin/ocean

Sobre el desarrollo, he empezado esta ma;ana y en 3 horas lo he tenido leyendo del json (hardcoded por ahora) y haciendo gradle build del proyecto dependiendo del alias (o del grupo de proyectos), aunque quiza aprovecho para cambiar un poco como quiero hacer las cosas de las observaciones de estos meses pero me ha molado bastante.

Si se me da bien, quiza cambio laguna tambien a Rust dado que seria muchisimo mas sencillo (por lo que estoy viendo) el multiplataforma. Pero bueno, esto ya seria un poco el futuro.

PD: 105 lineas y 4 dependencias (cli, json, y una chorrada para colorear outputs :D) pero seguro que se puede hacer mucho mejor y mas organizado.

1 respuesta
S

#74 Por curiosidad, podrías poner las especificaciones del NAS que tienes ? modelo, HDD y RAM...

Muy buen post por cierto, con este y el de las ideas de automatización me estan entrando ganas de pillar uno para montar algo .

Saludos.

1 respuesta
Lecherito

#75 Tengo un Synology DS718+ con un extra de 4Gb de ram

Kaledros

He leído por ahí que lo usas para programar en remoto (igual no era el NAS, creo que sí era). ¿Cómo lo haces? ¿Le pones un desktop, le instalas IDE/editor y te conectas por remote desktop? Estaba pensando en algo parecido y me interesa saber cómo lo tienes.

1 respuesta
Lecherito

#77 No, todo el desarrollo se hace en local, luego se copian de dos formas posibles (una con unison y otra con git push/pull desde gitlab pipelines).

Pero hay cosas como docker y todo eso que se maneja enteramente desde la parte servidor pero vamos, puedes hacer un mix and match de las cosas que necesites. Si quieres tener un escritorio pues habra formas de ello pero no es lo que busco. Donde trabajaba antes habia gente trabajando asi y a mi no me ha llegado a gustar demasiado, pero tener un sitio donde tienes backups de tu codigo y eso, mola mucho.

1
Lecherito

Bueno, pues una vez de vuelta de vacaciones ya puedo hacer algunas mas cosas xDD

Bancos

He decidido seguir adelante asi que ya lo tengo insertando transacciones en el BankingService y en los proximos dias me empezare a montar el dashboard de Grafana con los gastos y los ingresos. Despues de eso, los gastos y los ingresos saldran abultados dado que uso Revolut como banco principal (con Auto Top-Up) asi que "gastaria 100 euros" en mi banco principal y "ganaria 100 euros" en Revolut. Esto es algo que quiero solucionar en el futuro pero bueno, son males menores.

Deployments

Ya he arreglado lo de los deployments, al estar importando una imagen tenia que borrarla antes de nada, pero bueno, eso ya esta solucionado por ahora.

Rust

Sigo aprendiendo cosas del lenguaje y la verdad es que cada vez me esta gustando mas. He cambiado unos cuantos comandos de ocean y he a;adido otros sistemas de build como cargo y gradle. Ahora mismo me encuentro traduciendo todo desde Kotlin Native a Rust. De entre medias, seguramente lo ponga en github y lo haga publico.

Tambien he estado investigando un poquito sobre laguna y seguramente lo traduzca a Rust dado que tiene ya su implementacion de git (Estan git2 y gitoxide) y no tendria que implementar (como lo he hecho) los bindings de libgit2 en Kotlin, ya que parece que todo esta demasiado verde.

1 respuesta
bLaKnI

#79 Seguramente, seas el dev mas poco ortodoxo que he visto en mi vida tu...
Usas todo lo que no usa ni el tato!

2 respuestas
Lecherito

#80 A que te refieres?

  1. Grafana
  2. Rust
  3. Kotlin(/Native)
  4. Librerias como libgit2
  5. Docker

Es super conocido eh xDDD

1 respuesta
HeXaN

#80 Hay que salir más de las cárnicas, eh xD

1 respuesta
bLaKnI

#81 Dicho así, quizás sí... Pero siempre que te leo del tirón, acaba dandome dolor de cabeza por la profundidad del asunto... xD

#82 No empieces... :D

Lecherito

Rust

Pues he decidido poner ocean en github, asi que poco a poco ire a;adiendo todas las cosas (y cambiando algunas otras). Tened en cuenta que es mi primer proyecto asi que paciencia si veis algo que es absurdo, aunque lo ideal seria que lo comentarais para yo tambien poder aprender.

1
1 año después
Lecherito

Hemos vuelto un a;o y pico despues, y en forma de chapa!

Parece mentira que haya pasado tanto tiempo, me cago en la puta que rapido se me ha hecho xDDD. Mayormente empece el trabajo nuevo y ya tengo mi hogar al que me mude un poquito antes de navidad. Asi que el development lo deje un poquito de lado pero ahora que estoy mucho mas asentado puedo escribir un poco mas sobre mis mierdas por aqui y a que me estoy dedicando ultimamente.

Bancos

Pues la verdad es que el sistema de bancos lleva corriendo ya casi 2 a;os y sigue como el primer dia, he tenido algunos problemas como mencione en su dia en el hilo de automatizacion de bancos con las IDs pero todos solucionados y ahora lleva meses sin pararse nada mas que para refrescar los credenciales que es cada 3 meses (debido a la PSD2, no se puede hacer cada mas).

Asi que, queda todo un poco como en las imagenes que puse por ahi, la verdad es que bastante contento con el resultado! Y he podido estar triste viendo bajar los ahorros con la casa lmao.

Tambien arregle lo que ponia de cambios de dinero entre cuentas que se contaba como gasto y como ingreso, ya no se cuenta de ninguna de las dos maneras.

Deployments

Aqui no ha cambiado tampoco absolutamente nada, los deployments siguen funcionando de puta madre de la misma manera que los updates de los container que se sigue haciendo una vez a la semana, en ese aspecto 10/10.

Rust

Pues he seguido aprendiendo sobre ello, con la sintaxis ya no tengo ningun problema aunque con el borrow checker me sigo peleando de vez en cuando ya no son las mismas peleas que cuando empece xDDD.

Una de las cosas que hice en Rust, fue traducir la herramienta de ocean y tambien el templater (que lo bautice como laguna), a dia de hoy sigo utilizando los templates y de hecho tengo muy pendiente seguir mejorandolos en ese aspecto (asi como el templater). Aunque de esto hablare un poquito mas adelante.

El ultimo proyecto es una especie de randomizer de reglas para cuando juego al ajedrez con un colega que me llevo un par de horas hacer y fue todo bastante fluido!

Development workflow

Aqui es donde creo que mas ha cambiado/esta cambiando en este momento, si recordais el plugin de Gradle que hice hace tiempo (OceanLib, aunque he de renombrarlo joder), me dejaba definir las librerias de una manera mucho mas comoda pero todavia le faltaba algo. Las librerias las tenia que meter en tiempo de compilacion en la libreria para que pudiesen ser autocompletadas, al final lo que he terminado haciendo es un servicio con el que habla el plugin para poder resolver las dependencias (basicamente un traductor de String -> maven) y a;adirle la posibilidad de tener workspaces (ahora los repositorios no usan el .m2/repositories si no el del workspace).

De esta manera, la estructura de directorios quedaria mas o menos asi:

WorkspaceName
---- definition.json
---- src
-------- Package1
-------- Package2
---- .repository
-------- dep1... etc

Y ahi ya podria ejecutar los comandos de hacer building etc (recordad que esto esta en proceso todavia), y las dependencias ahora se cachean por workspace en vez de globales (aunque en esto tambien me gustaria hacer algo).

Asi que ahora con el plugin de Gradle para mis aplicaciones internas actualizado y el resolver de dependencias queda algo bastante guay en general, aunque me quedan por pulir muchas cosas, cosa que ire haciendo poco a poco conforme me vaya encontrando las mierdas, he quedado relativamente contento con el resultado.

Librerias

Como veo que cada vez estoy haciendo mas servicios para cosas internas (ahora estoy haciendo uno para visualizar gastos en las compras de supermercado), me he hecho una libreria para manejar la authenticacion, logging, monitoring y toda esta parafernalia. El core es literalmente 3 interfaces pero que he creado bindings para 2 librerias rest (Spring y Ktor por ahora) para ver como funcionaria y la ire evolucionando poco a poco.

El core es algo asi:

interface Request {
    val operation: String

    fun getHeader(name: String): String?

    operator fun <T> set(key: String, value: T)
    operator fun <T> get(key: String): T
}

interface Response {
    var statusCode: Int

    fun getHeader(name: String): String?
    fun setHeader(name: String, value: String)
}

interface RequestInterceptor {
    fun preRequest(request: Request, response: Response): Boolean {
        return true
    }

    fun postRequest(request: Request, response: Response) {}
}

Por lo que luego puedo crear los Interceptors que quiera (ejemplo para a;adir la request ID)

class RequestIdInterceptor: RequestInterceptor {
    override fun preRequest(request: Request, response: Response): Boolean {
        val requestId = UUID.randomUUID().toString()
        request["X-Request-Id"] = requestId
        MDC.put("X-Request-Id", requestId)

        return true
    }
}

Y el adapter de Spring en este caso queda algo por el estilo:

class SpringResponse(private val response: HttpServletResponse): Response {
    override val statusCode = response.status
    override fun getHeader(name: String) = response.getHeader(name)

    override fun setHeader(name: String, value: String) = response.setHeader(name, value)

}

class SpringMillyAdapter(private val interceptor: RequestInterceptor): HandlerInterceptor {
    override fun preHandle(
        request: HttpServletRequest,
        response: HttpServletResponse,
        handler: Any
    ): Boolean {
        val adaptedRequest = SpringRequest(request)
        val adaptedResponse = SpringResponse(response)

        return interceptor.preRequest(adaptedRequest, adaptedResponse)
    }

    override fun postHandle(
        request: HttpServletRequest,
        response: HttpServletResponse,
        handler: Any,
        modelAndView: ModelAndView?
    ) {
        val adaptedRequest = SpringRequest(request)
        val adaptedResponse = SpringResponse(response)

        return interceptor.postRequest(adaptedRequest, adaptedResponse)
    }
}

Aunque al adapter este le he puesto alguna que otra cosa mas, pero al final lo unico que tengo que hacer es ponerle una anotacion a la clase principal y a empezar con la logica de negocio! Una cosa que me paso en un proyecto el a;o pasado (de ahi que haya hecho esto), es que me pase mas tiempo haciendo monitoring, logging etc que con la logica de negocio y no quiero que me pase de nuevo xDDD

Ideas futuras

Debido a que estoy creando muchos servicios, tambien me toca crear muchos clientes (e incluso las interfaces de los servicios), quiero crearlos automaticamente. He visto que para este tipo de cosas esta OpenAPI/Swagger (creo recordar, he de mirarlo), pero no se yo si me van a gustar sus soluciones, estoy casi seguro de que al final acabare haciendo mis mierdas (ya que me lo paso muy bien en el proceso).

La segunda es que quiero mejorar Ocean para poder leer el fichero de dependencias y poder hacer building del workspace entero sin preocuparme del orden y que se haga de manera atomica (poder cambiar varios repositorios a la vez).

La tercera es que me gustaria poder crear varias reviews pero hacer building de todas a la vez, para esto debo crear un servicio que se baje el codigo de varias reviews y ejecute Ocean. Esto me gustaria que fuese mas o menos agnostico ya que existen muchos host (Jetbrains Space, Github, Gitlab, Bitbucket) y luego poder crear los adapters de cada uno. Esta es la idea mas lejana pero que es a lo que mas me gustaria llegar porque estoy hasta las pelotas de que en los hosts de codigo solo te dejen crear una review de un repositorio en vez de varios y es algo que me parece increible que no se haya hecho todavia. Si en el futuro algun host ofrece eso pue sseria bastante sencillo cambiar el adapter.

5 3 respuestas
hda

#85 Ole ole, vaya update :)

JuAn4k4

#85 Con OpenAPI tienes un json con la definición de la API y esta muy bien, los clientes autogenerados son un cáncer pero funcionan, de hacer algo te recomiendo generar los clientes a partir del OpenAPI spec

1 respuesta
LLoid

#85 genial, esperamos más actualizaciones!

Lecherito

Development workflow

He estado puliendo un poquito mas lo de los repos de maven/workspaces y creo que me ha quedado mas o menos bien aunque todavia no me gusta al 100% porque he de declarar los repositorios en vez de tener algo facilmente customizable (estoy investigando un poquito mas sobre esto y Gradle, si se quiere saber mas pues preguntad).

Me he hecho un peque;o ejecutable por ahora para clonar los proyectos:

fn main() {
    let json_string = std::fs::read_to_string("Projects").expect("Invalid workspace, Projects file is missing");
    let workspace: Workspace = serde_json::from_str(&json_string).expect("Invalid json file");

    if !Path::new("src").exists() {
        std::fs::create_dir("src");
    }

    for project in &workspace.projects {
        if !Path::new("src").join(&project).exists() {
            let command = format!("git -C src clone ssh://my.git/{}.git", &project);
            println!("Executing command: {}", &command);
            execute_command(&command);
        } else {
            println!("{} already exists, skipping.", &project);
        }
    }
}

Y el siguiente paso es algo para crear/inicializar un workspace (aunque es basicamente crear un fichero con un Json)

Ahora, el orden de como las dependencias se resuelven, hay 4 sitios de donde se pueden pillar

  1. mavenLocal -> Esto esta en la carpeta .localdeps y donde se cachean
  2. versionName -> s3://versions/$name, esto es un repositorio maven custom donde solo las dependencias de todos los proyectos que esten relacionados estaran
  3. glovalVersion -> s3://version/default, es lo mismo que el anterior pero que todos lo van a tener, aparte del mas especifico
  4. mavenCentral -> el tipico xdd

3 y 4 en un futuro se van a ir al carajo casi seguro porque quiero que los versionNames tengan un padre, y mavencentral una vez que empiece yo a importar dependencias a los repositorios.

.
├── Projects
└── src
    ├── Milly
    ├── MillyCore
    └── MillySpring

Hoy me voy a dedicar a traducir las dependencias desde el Gradle kts al fichero externo y poder hacer building en orden. Y lo proximo es una forma sencilla de recrear un workspace en un momento concreto y hacer build.

Dudas/cosas que investigar:

  1. No se si mover la configuracion (de las dependencias y de proyecto) a Hocon, supongo que para el futuro puede ser algo deseable.
  2. Investigar dependencias custom de Gradle
  3. Plugin para IntelliJ que puedas importar un workspace directamente en vez de importar un proyecto -> new module with existing sources

#87 Si, eso es lo que tengo pendiente, pero he de tener primero una base mejor con workspaces y una manera mas guay de hacer las cosas

1
Lecherito

Me acabo de emocionar macho, por dos cosas.

Lo primero es que OceanLibPlugin lo acabo de compilar usandose a si mismo (supongo que esto es cuando compilas tu lenguage en el nuevo compilador escrito en ese lenguaje) y me ha molado mucho que funcionase a la perfeccion.

Como ahora esta por workspaces, es SUPER sencillo simplemente a;adir otro repositorio al workspace y empezar a hacer pruebas con el. Tenia un bug en OceanLibPlugin y lo he a;adido al fichero de Projects, he invocado el CLI para el clone, he hecho los cambios, ./gradlew release y a continuacion todos los proyectos de ese workspace ya iban a usar la version nightly instantaneamente y he podido probar que todo funciona perfe.

Ademas lo he simplificado/limpiado mucho la distribucion de Gradle con los .init para aplicar el plugin y ya no necesito ni el buildSrc. Esto simplifica un cojon todo!

2