{"id":28222807,"url":"https://github.com/warlock/test-devops","last_synced_at":"2026-02-11T14:02:56.601Z","repository":{"id":147848067,"uuid":"295802390","full_name":"warlock/test-devops","owner":"warlock","description":null,"archived":false,"fork":false,"pushed_at":"2020-09-20T10:40:03.000Z","size":8,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-07T04:37:55.553Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/warlock.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-09-15T17:32:00.000Z","updated_at":"2020-09-20T10:40:06.000Z","dependencies_parsed_at":"2023-05-27T17:00:09.707Z","dependency_job_id":null,"html_url":"https://github.com/warlock/test-devops","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/warlock/test-devops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warlock%2Ftest-devops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warlock%2Ftest-devops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warlock%2Ftest-devops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warlock%2Ftest-devops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/warlock","download_url":"https://codeload.github.com/warlock/test-devops/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warlock%2Ftest-devops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29333917,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T12:42:24.625Z","status":"ssl_error","status_checked_at":"2026-02-11T12:41:23.344Z","response_time":97,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-18T07:14:03.497Z","updated_at":"2026-02-11T14:02:56.584Z","avatar_url":"https://github.com/warlock.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Test DevOps\n\n## Parte 1 / Parte 2 : Servicios\n\nHe creado un cluster de kubernetes en Google Cloud.\n\nDescargando llaves para \"kubectl\":\n\n```sh\ngcloud container clusters get-credentials {NOMBRE_DEL_CLUSTER} --zone {ZONA} --project {NOMBRE_DEL_PROYECTO}\n```\n\nInstalación de Homebrew para gestionar software en Mac\n\n```sh\n/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)\"\n```\n\nInstalacion de Helm para simplificar el despliegue.\n\n```sh\nbrew install helm\n```\n\n#### Creando un StorageClass \"custom\"\n\n```sh\nkubectl patch storageclass gitlab-st -p '{\"metadata\": {\"annotations\":{\"storageclass.kubernetes.io/is-default-class\":\"true\"}}}'\n```\n\n#### Almacenamiento óptimo para hacer pruebas:\n\nDocumento gitlab-storage.yml\n\n```yaml\ngitlab:\n  gitaly:\n    persistence:\n      storageClass: gitlab-st\n      size: 10Gi\npostgresql:\n  persistence:\n    storageClass: gitlab-st\n    size: 10Gi\nminio:\n  persistence:\n    storageClass: gitlab-st\n    size: 10Gi\nredis:\n  master:\n    persistence:\n      storageClass: gitlab-st\n      size: 5Gi\n```\n\n#### Creando los \"namespace\" de GitLab y Jenkins\n\n```sh\nkubectl create namespace gitlab\nkubectl create namespace jenkins\n```\n\n#### Creando nodo de GitLab\n\n```sh\nhelm repo add gitlab https://charts.gitlab.io/\nhelm repo update\nhelm upgrade --namespace gitlab \\\n  --install gitlab gitlab/gitlab \\\n  --timeout 600s \\\n  --set global.edition=ce \\\n  --set global.hosts.domain=git.girona.dev \\\n  --set certmanager-issuer.email=josep@girona.dev \\\n  --set gitlab-runner.runners.privileged=true \\\n  -f gitlab-storage.yml\n```\n\n#### Instalación de Jenkins\n\n```sh\nhelm repo add bitnami https://charts.bitnami.com/bitnami\nhelm repo update\nhelm install jenkins \"bitnami/jenkins\" \\\n  --namespace jenkins \\\n  --set jenkinsUser=admin \\\n  --set jenkinsPassword=password \\\n  --set persistence.size=\"2Gi\" \\\n  --set metrics.service.type=LoadBalancer\n```\n\n#### Permisos para que Jenkins pueda gestionar Kubernetes (Es mejor hacer un rol a medida)\n\n```sh\nkubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:default\n```\n\n#### Creando un LoadBalancer para el acceso remoto:\n\n```yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: jenkins-svc\n  namespace: jenkins\nspec:\n  type: LoadBalancer\n  ports:\n    - protocol: TCP\n      port: 80\n      targetPort: 8080\n  selector:\n    app.kubernetes.io/component: jenkins-master\n    app.kubernetes.io/instance: jenkins\n```\n\n#### Configuración de Jenkins\n\nLa instalación y configuración es el siguiente:\n\n1. Configuración de Jenkins\n2. Entramos en \"Manage Plugins\"\n3. Instalamos los plugin de \"Docker\" y \"Kubernetes\".\n4. Volvemos a la configuración de Jenkins.\n5. En \"Configure System\".\n\n   - Aquí podemos fijar la \"URL Location\" y el correo del usuario administrador.\n   - Si inhalásemos el plugin de \"GitLab\" podemos configurar los datos de acceso con Token.\n   - En Docker podemos configurar las credenciales de nuestro \"registry\".\n\n6. Volvemos a la configuración de Jenkins\n7. Vamos a \"Manage Nodes and Cloud\"\n8. Vamos a \"Configure Cloud\".\n9. Creamos un cloud de Kubernetes.\n\n   - La dirección de nuestro cluster desde dentro es https://kubernetes.default\n   - Fijar el namespace \"jenkins\" para que se creen los contenedores ahí.\n   - La opción \"WebSocket\" tiene que estar activa.\n\n#### Pequeña web en Go con un healthcheck y con un test:\n\n[https://github.com/warlock/jenkins-golang-play](https://github.com/warlock/jenkins-golang-play)\n\nEsta es una pipeline de gitlab que ya hace el despliegue en kubernetes\n\n[https://github.com/warlock/jenkins-golang-play/blob/master/.gitlab-ci.yml](https://github.com/warlock/jenkins-golang-play/blob/master/.gitlab-ci.yml)\n\nEn la pipeline de Jenkins aun no he echo el despliegue pero si funciona los test creando pod de kubernetes dinamicamente, el build y el push:\n\n[https://github.com/warlock/jenkins-golang-play/blob/master/Jenkinsfile](https://github.com/warlock/jenkins-golang-play/blob/master/Jenkinsfile)\n\n#### Script en Node.js para hacer pipeline en Jenkins a traves de la API:\n\n[https://github.com/warlock/make-jenkins-pipeline](https://github.com/warlock/make-jenkins-pipeline)\n\nEl archivo del job está en \"job.xml\".\n\nEl script es \"createpipeline.js\":\n\n```sh\nnpm i\nnode createpipeline.js\n```\n\n#### Instalación y análisis de Fiddler\n\nFiddler es un proxy para filtrar y depurar conexiones entrantes/salientes de servicios HTTP.\nEs una clase de sniffer orientado a los servicios HTTP con una interfaz visual cómoda que muestra los datos del \"request\" y del \"response\" de forma legible.\nTambién da la posibilidad de documentar API y probar \"request\".\nEstá disponible para Windows, Linux y Mac.\n\n## Parte 3 : Startup de videos\n\nDependiendo de los miembros del equipo existentes en la empresa mi estrategia seria hacer los servicios en Rust/Go para mejor velocidad/consumo de recursos o en Javascript/Typescript para tener un equipo que hable un solo lenguaje tanto para el backend/frontend/móvil.\n\n### Versión cómoda/rápida aprovechando al máximo los servicios de AWS(Aplicable a Azure/Google Cloud).\n\n1. Sistemas de archivos:\n\n   - Sistema de archivos para la entrega:\n     Escogería AWS Elastic Block Storage y poco a poco refrescaría los archivos con menos éxito moviéndolos a S3 con distintos niveles de enfriamiento.\n\n   - Sistema de archivos S3:\n\n     - Procesamiento de videos.\n     - Alojamiento para estáticos como el dashboard privado de la empresa\n     - Alojamiento imágenes como pueden ser avatares o fotos de video.\n\n2. Motor de búsqueda Elastic Search(AWS)\n   Contraria el servicio de AWS. Ahí guardaría los \"títulos/textos/usuarios\" del video publicado para facilitar la búsqueda.\n\n3. Base de datos DynamoDB:\n\n   - Almacenaje de los datos variables de los videos como visitas, likes.\n   - Almacenaje de la parte la lógica de negocio.\n\n4. Lambda (Yo usaría serverless framework para organizar las lambda)\n   En esta situación usaría prácticamente todas las combinaciones:\n\n   - Colas:\n\n     - Preparación del archivo adaptando la resolución/resoluciones en s3 para ser colocados posteriormente en el sistema de archivos.\n     - Archivos de imagen como son avatares de distintos tamaños.\n     - Envío de correos.\n\n   - Tareas Cron:\n\n     - Bajada o Subida de nivel de los sistemas de archivos según su uso.\n     - Limpieza de cuentas viejas o cerradas de forma progresiva.\n\n   - API Lambda con Cloudfront para respuestas más inmediatas y distribuidas.\n\n   - Front de la web: Next.js con despliegue del framework Serverless(Lambda+Cloudfront+S3):\n     Permite hacer estáticos de todo lo que no es dinámico, mantiene el SEO transformando las secciones que requieren de server side rendering en Lambdas autónomas. Posteriormente publica los lambda y assets en CloudFront.\n\n5. Dashbird: Monitorización externa de servicios Lambda.\n\n### Versión manual.\n\n- Hadoop HDFS como sistema de archivos distribuido/escalable.\n  Crería varios cluster dependiendo de la tipología de datos.\n\n- Cluster Kubernetes(Evidentemente cada proceso con su ReplicaSet adaptado a la necesidad):\n\n  - Ingress NGINX para Balancear la carga.\n  - CronJob de kubernetes para gestionar las tareas: Limpieza de cuentas, mover archivos, compilación de Next.js estilo JAMSTACK de las zonas de la pagina menos dinámicas...\n  - RabbitMQ para las colas de procesamiento.\n  - Procesamiento de colas y CronJob en servicios GO/Rust para mejor aprovechamiento de recursos.\n  - API en servicios GO/Rust para mejor aprovechamiento de recursos y para evitar al máximo los request perdidos.\n  - ElaticSearch almacenando los datos en volúmenes rápidos (Dependiendo de la situación quizá lo separaría en otro cluster solo para el)\n  - API/Tareas en Go/Rust para minimizar el consumo de hardware CPU/RAM. (Servicios de monitorización estilo Jaeger para visualizar el comportamiento de sistemas críticos).\n  - Redis cache de web Next.js compilada previamente con JAMSTACK.\n  - Next.js para recibir las peticiones mas dinámicas que requieren de SSR y SEO.\n\n- Fuera del cluster\n  - Kit de monitorización Grafana/Prometheus\n  - NewRelic como proveedor externo\n\n## Parte 4: Entender el código(C#) y comentarios sobre que mejoraríamos.\n\n- El código busca tiendas que estén situadas en una distancia inferior a 0.05.\n\n- Mejoras:\n  - Aislaría la conexión a la base de datos en otro documento.\n  - Agregaría la configuración con variables de entorno.\n  - Aislaría las operaciones que se están usando en los operadores de comparación en una \"función\" para posteriormente comparar el resultado con \"\u003c 0.05\".\n  - Contenido de la función:\n    - La función devolvería double.\n    - Información sobre que tipo de operación es y si hace falta agregaría información o una URL con los recursos que la explican.\n    - Separaría las operaciones que se devolvieran los resultados en distintas variables con nombres que se entendieran con sus comentarios.\n    - Agregaría comentarios en cada paso de la operación explicando que se está haciendo.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwarlock%2Ftest-devops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwarlock%2Ftest-devops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwarlock%2Ftest-devops/lists"}