SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
Earthly
Dockerfile con esteroides
by @mario21ic
Me presento
● Mario Inga C.
● Miembro de comunidades: DevOps Perú,
Docker Lima y Cloud Native Perú.
● Software Development, Cloud, SysAdmin,
Security.
● Trabajo en Voltron Data
● Metal m/
● Twitter: @mario21ic
Docker: Build once, Run Anywhere
Code + Dockerfile = Docker Image
Docker Hub
Quay.io
Cloud Repositories
Other solutions
On premise
Local + CI + CD
● CI: “fail Fast & fail First” -> app & tests
● Si no falla, hace deploy a un environment como Dev, QA,
Stage, etc para pruebas manuales.
● Y Local?
Local CI CD
Local
● Code
● Tasks:
○ Lint
○ Unit tests
○ Integration tests
○ Build
● Tools:
○ Bash Scripts
○ Makefile
○ Dockerfile multistage (lint, tests, build)
● Probar manualmente el app
CI Server
● Configuracion (url, users,
permissions, etc)
● Credenciales (tokens, ssh
keys, etc)
● Plugins (docker, k8s, sonar,
etc)
● Pipeline steps:
○ Scripts
○ Jenkinsfile
○ Yaml
● Se genera una fuerte
dependencia del CI Server.
Y cuando aparece un issue SOLO en CI?
● Contexto:
○ Teniamos los build steps en el CI server (no repositorio).
○ Definimos todos los build steps en el formato del CI tool
(Jenkinsfile, yaml files).
○ Abusar del uso de Jenkins plugins, generando una fuerte
dependencia con Jenkins.
● Cómo replicar el issue en Local?
○ Levantan un Jenkins en local? Y los plugins, configs,
credentials, etc?
○ Interpretar el yaml file y crean un script? Eso es redundar
no?
● Descargar Docker images y poner el code?
● Prueba y Error? Enviar commits tras commits.
●
Antes de Docker
●
Ahora con Docker
Algunas reflexiones
● Docker: Build once, Run anywhere.
● Enpaquetamos en App en Docker pero y los
steps de CI/CD?
● Desarrollamos en Local: build, run unit &
integration tests, etc sin Containers.
● Esperamos que recién falle en CI (donde se
ejecutan en Containers)
Y si usamos los Containers en Local?
● Containers para:
○ Lint
○ Unit Tests
○ Integration Tests
○ Build
● Mantenimiento de: Dockerfiles,
Makefiles, Bash Scripts, etc.
● Primero los Steps del CI usando
Containers en Local.
● Al final Empaquetamos el App en un
Docker Image.
usando Containers en Local:
● Building:
○ Dockerfile: gcc, g++, go, rustc, jdk, etc
● Runtime:
○ Dockerfile: java runtime (jre), scratch, ubuntu, centos, etc
● Orquestacion:
○ docker-compose.integration-tests.yml
○ docker-compose.tasks.yml
● Bash scripts usan binarios que no son iguales en
todos los SOs, ejem grep, find, etc.
● Scripts para: docker build de image, docker run para
tareas (deps, run unit & integration tests, build, etc).
● Makefile para orquestar los scripts, ejem: clean &&
build && tests.
Problemas: Orientado a ejecutar en CI.
Propuesta: Orientado a ejecutarse en cualquier lugar.
Why Earthly?
● 🐳 Build anything via containers
● 🛠 Programming language agnostic
● 🔁 Repeatable builds
● ⛓ Parallelism that just works
● 🏘 Mono and Poly-repo friendly
● 💾 Shared caching
● 🔀 Multi-platform
● Open source https://github.com/earthly/earthly
● Web https://earthly.dev/
❤ Makefile + Dockerfile = Earthfile
● What if Dockerfiles and
Makefiles had a Baby
● Repeatable builds
● A familiar syntax
● Cache for more speed.
● Targets:
$ earthly ls
Demo time sin Earthly
● Golang app calculator
● Docker + Makefile + Scripts
● Tasks:
a. Lint
b. Unit Tests
c. Build
d. Docker (image)
● Jenkins:
a. Sin Docker requiere: go, gcc,
makefile, etc
b. Con Docker usando Multistage (no
son jenkins build stages) o sino Bash
Scripts.
1) CI Pipeline con Plugins
● Ventajas:
○ Diferentes stages: Deps, Lint, Unit Tests, Build, Docker Image
○ Solo defines un agent con docker image “golang:1.17-alpine”
● Desventajas:
○ Requiere Docker Plugin y Docker Pipeline Plugin
○ Todos los steps estan en el Jenkinsfile_plugins. Dificil mantener y replicar.
2) CI Pipeline con Dockerfile Multistage
● Ventajas:
○ Todo en Uno.
● Desventajas:
○ Un solo stage: Deps, Lint, Unit Tests, Build todo dentro del Dockerfile.
○ Reiniciar desde un punto
○ Jenkinsfile no usa “make docker”, llama directo al script ./docker-build.sh.
3) CI Pipeline con Containers
● Ventajas:
○ Buena visibilidad.
● Desventajas:
○ Jenkinsfile_containers tuvo que crear el docker Image Build (base).
○ Muchos scripts: los que Automatizan en local y los que ejecutan estos en Containers.
○ El script ./build-con-docker.sh solo para Local, porque el entregable es Docker Image.
Demo time con Earthly
● Golang app calculator
● Earthly
● Tasks:
○ Lint
○ Unit Tests
○ Build
○ Docker (image)
● Jenkins:
○ Requiere Earthly
Demo: Deps & Lint
● Deps:
$ earthly +deps
● Lint:
$ earthly +lint
# Corregir y probar (cache)
$ earthly +lint
$ earthly --no-cache +lint
Demo: Build & Docker
● Build:
$ earthly +build
$ file build/go-example
● Docker:
$ earthly +docker
$ docker run go-example
● All in one:
$ earthly +all
CI Pipeline con Earthly
● Cada Stage refleja el trabajo en Local.
● Visibilidad
● Altamente Replicables.
● Puede mejorar con Stages en paralelo.
Extra: Build for Multi Architecture.
● Build:
$ earthly --platform=linux/amd64 +build
$ file build/go-example
$ docker run --platform=linux/amd64 -v $PWD/build:/tmp ubuntu:20.04 /tmp/go-example
● Docker:
$ earthly --platform=linux/amd64 +docker
$ docker run go-example:latest_linux_amd64
Mas info https://docs.earthly.dev/docs/guides/multi-platform
https://docs.docker.com/desktop/multi-arch/
1. DRY => Don’t Repeat Yourself
2. KISS => Keep It Simple Stupid
3. RTFM => Read the fu**ing manual.
4. Earthly Docs https://docs.earthly.dev/basics
5. Poner nombres autodescriptivos para todo.
6. Enamorarse del problema y NO de la solución.
7. Evitar Obsession tool (mucho acoplamiento)
8. No existen las balas de plata.
Algunas recomendaciones
Preguntas?
Pueden encontrarme
en Twitter
@mario21ic

Más contenido relacionado

Similar a Earthly, Dockerfile con esteroides

Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Micael Gallego
 
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Restorando
 
DockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfDockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfAngel Borroy López
 
¨Servermore or serverless.¨: Introducción a CI/CD desde dos filosofías de inf...
¨Servermore or serverless.¨: Introducción a CI/CD desde dos filosofías de inf...¨Servermore or serverless.¨: Introducción a CI/CD desde dos filosofías de inf...
¨Servermore or serverless.¨: Introducción a CI/CD desde dos filosofías de inf...Marco Bellido
 
Humanizacion de java script con typescript para d365
Humanizacion de java script con typescript para d365Humanizacion de java script con typescript para d365
Humanizacion de java script con typescript para d365Demian Raschkovan
 
PHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPPHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPRolando Caldas
 
Workshop docker: Iniciando en el Mundo de los Contenedores
Workshop docker: Iniciando en el Mundo de los ContenedoresWorkshop docker: Iniciando en el Mundo de los Contenedores
Workshop docker: Iniciando en el Mundo de los ContenedoresJesús A. Rodríguez B.
 
Docker_K8S_lecciones_netcoreconf_2022.pdf
Docker_K8S_lecciones_netcoreconf_2022.pdfDocker_K8S_lecciones_netcoreconf_2022.pdf
Docker_K8S_lecciones_netcoreconf_2022.pdfLeonardo Micheloni
 
Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Gustavo Andres Brey
 
Docker Birthday Peru #dockerbday
Docker Birthday Peru #dockerbdayDocker Birthday Peru #dockerbday
Docker Birthday Peru #dockerbdayMario IC
 
Desarrollando una Extensión para Docker
Desarrollando una Extensión para DockerDesarrollando una Extensión para Docker
Desarrollando una Extensión para DockerAngel Borroy López
 
Docker: la revolución en virtualización
Docker: la revolución en virtualizaciónDocker: la revolución en virtualización
Docker: la revolución en virtualizaciónMarcelo Ochoa
 
De desarrollo a producción usando docker
De desarrollo a producción usando dockerDe desarrollo a producción usando docker
De desarrollo a producción usando dockerChristian Rodriguez
 
Docker orientado al desarrollo de aplicaciones con NodeJS
Docker orientado al desarrollo de aplicaciones con NodeJSDocker orientado al desarrollo de aplicaciones con NodeJS
Docker orientado al desarrollo de aplicaciones con NodeJSJan Sanchez
 
Despliegue de aplicaciones Java con Docker y Kubernetes
Despliegue de aplicaciones Java con Docker y KubernetesDespliegue de aplicaciones Java con Docker y Kubernetes
Despliegue de aplicaciones Java con Docker y KubernetesJaime Perera Merino
 
Lo que tienes que saber de Dart para Backend, frontend y Mobile..pptx
Lo que tienes que saber de Dart para Backend, frontend y Mobile..pptxLo que tienes que saber de Dart para Backend, frontend y Mobile..pptx
Lo que tienes que saber de Dart para Backend, frontend y Mobile..pptxSergio Antonio Ochoa Martinez
 

Similar a Earthly, Dockerfile con esteroides (20)

01 - Introducción al lenguaje C
01 - Introducción al lenguaje C01 - Introducción al lenguaje C
01 - Introducción al lenguaje C
 
Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019
 
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
 
DockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfDockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdf
 
¨Servermore or serverless.¨: Introducción a CI/CD desde dos filosofías de inf...
¨Servermore or serverless.¨: Introducción a CI/CD desde dos filosofías de inf...¨Servermore or serverless.¨: Introducción a CI/CD desde dos filosofías de inf...
¨Servermore or serverless.¨: Introducción a CI/CD desde dos filosofías de inf...
 
Humanizacion de java script con typescript para d365
Humanizacion de java script con typescript para d365Humanizacion de java script con typescript para d365
Humanizacion de java script con typescript para d365
 
PHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHPPHPVigo #23 - Taller de Docker para PHP
PHPVigo #23 - Taller de Docker para PHP
 
Workshop docker: Iniciando en el Mundo de los Contenedores
Workshop docker: Iniciando en el Mundo de los ContenedoresWorkshop docker: Iniciando en el Mundo de los Contenedores
Workshop docker: Iniciando en el Mundo de los Contenedores
 
Docker_K8S_lecciones_netcoreconf_2022.pdf
Docker_K8S_lecciones_netcoreconf_2022.pdfDocker_K8S_lecciones_netcoreconf_2022.pdf
Docker_K8S_lecciones_netcoreconf_2022.pdf
 
Pipelines as code with Drone
Pipelines as code with DronePipelines as code with Drone
Pipelines as code with Drone
 
Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015
 
Android
AndroidAndroid
Android
 
Docker Birthday Peru #dockerbday
Docker Birthday Peru #dockerbdayDocker Birthday Peru #dockerbday
Docker Birthday Peru #dockerbday
 
Desarrollando una Extensión para Docker
Desarrollando una Extensión para DockerDesarrollando una Extensión para Docker
Desarrollando una Extensión para Docker
 
Docker: la revolución en virtualización
Docker: la revolución en virtualizaciónDocker: la revolución en virtualización
Docker: la revolución en virtualización
 
De desarrollo a producción usando docker
De desarrollo a producción usando dockerDe desarrollo a producción usando docker
De desarrollo a producción usando docker
 
Docker orientado al desarrollo de aplicaciones con NodeJS
Docker orientado al desarrollo de aplicaciones con NodeJSDocker orientado al desarrollo de aplicaciones con NodeJS
Docker orientado al desarrollo de aplicaciones con NodeJS
 
Despliegue de aplicaciones Java con Docker y Kubernetes
Despliegue de aplicaciones Java con Docker y KubernetesDespliegue de aplicaciones Java con Docker y Kubernetes
Despliegue de aplicaciones Java con Docker y Kubernetes
 
Introducción a CoffeeScript
Introducción a CoffeeScriptIntroducción a CoffeeScript
Introducción a CoffeeScript
 
Lo que tienes que saber de Dart para Backend, frontend y Mobile..pptx
Lo que tienes que saber de Dart para Backend, frontend y Mobile..pptxLo que tienes que saber de Dart para Backend, frontend y Mobile..pptx
Lo que tienes que saber de Dart para Backend, frontend y Mobile..pptx
 

Más de Mario IC

Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...Mario IC
 
Aws Security Latam - Criptografia con KMS
Aws Security Latam - Criptografia con KMSAws Security Latam - Criptografia con KMS
Aws Security Latam - Criptografia con KMSMario IC
 
Aws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMSAws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMSMario IC
 
Testing Ansible Playbook con Molecule + TestInfra
Testing Ansible Playbook con Molecule + TestInfraTesting Ansible Playbook con Molecule + TestInfra
Testing Ansible Playbook con Molecule + TestInfraMario IC
 
Automatización de tareas con Ansible
Automatización de tareas con AnsibleAutomatización de tareas con Ansible
Automatización de tareas con AnsibleMario IC
 
Infraestructura como Codigo para Developers
Infraestructura como Codigo para DevelopersInfraestructura como Codigo para Developers
Infraestructura como Codigo para DevelopersMario IC
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkMario IC
 
Manejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmManejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmMario IC
 
Cloud native Computing Perú Octubre
Cloud native Computing Perú OctubreCloud native Computing Perú Octubre
Cloud native Computing Perú OctubreMario IC
 
Agiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeAgiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeMario IC
 
Workshop Infrastructure as Code - Suestra
Workshop Infrastructure as Code - SuestraWorkshop Infrastructure as Code - Suestra
Workshop Infrastructure as Code - SuestraMario IC
 
Docker Compose to Production with Docker Swarm
Docker Compose to Production with Docker SwarmDocker Compose to Production with Docker Swarm
Docker Compose to Production with Docker SwarmMario IC
 
GDG Lima - Docker Compose
GDG Lima - Docker ComposeGDG Lima - Docker Compose
GDG Lima - Docker ComposeMario IC
 
Docker Lima meetup - 22 de junio
Docker Lima meetup - 22 de junioDocker Lima meetup - 22 de junio
Docker Lima meetup - 22 de junioMario IC
 
Docker Compose para el Docker Lima Meetup Mayo
Docker Compose para el Docker Lima Meetup MayoDocker Compose para el Docker Lima Meetup Mayo
Docker Compose para el Docker Lima Meetup MayoMario IC
 
Testing en BDD con Python y Behave
Testing en BDD con Python y BehaveTesting en BDD con Python y Behave
Testing en BDD con Python y BehaveMario IC
 
Infrastructure as Code with Terraform
Infrastructure as Code with TerraformInfrastructure as Code with Terraform
Infrastructure as Code with TerraformMario IC
 
Modelado de API con RAML
Modelado de API con RAMLModelado de API con RAML
Modelado de API con RAMLMario IC
 
Docker Ecosystem: Part V - Docker Registry
Docker Ecosystem: Part V - Docker RegistryDocker Ecosystem: Part V - Docker Registry
Docker Ecosystem: Part V - Docker RegistryMario IC
 
Docker Ecosystem: Part IV - Swarm
Docker Ecosystem: Part IV - SwarmDocker Ecosystem: Part IV - Swarm
Docker Ecosystem: Part IV - SwarmMario IC
 

Más de Mario IC (20)

Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
Dominando AWS KMS desde cifrado básico hasta firma avanzada - aws community d...
 
Aws Security Latam - Criptografia con KMS
Aws Security Latam - Criptografia con KMSAws Security Latam - Criptografia con KMS
Aws Security Latam - Criptografia con KMS
 
Aws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMSAws Community Day Guatemala Criptografia con AWS KMS
Aws Community Day Guatemala Criptografia con AWS KMS
 
Testing Ansible Playbook con Molecule + TestInfra
Testing Ansible Playbook con Molecule + TestInfraTesting Ansible Playbook con Molecule + TestInfra
Testing Ansible Playbook con Molecule + TestInfra
 
Automatización de tareas con Ansible
Automatización de tareas con AnsibleAutomatización de tareas con Ansible
Automatización de tareas con Ansible
 
Infraestructura como Codigo para Developers
Infraestructura como Codigo para DevelopersInfraestructura como Codigo para Developers
Infraestructura como Codigo para Developers
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform framework
 
Manejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con HelmManejo de packages en Kubernetes con Helm
Manejo de packages en Kubernetes con Helm
 
Cloud native Computing Perú Octubre
Cloud native Computing Perú OctubreCloud native Computing Perú Octubre
Cloud native Computing Perú Octubre
 
Agiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeAgiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As Code
 
Workshop Infrastructure as Code - Suestra
Workshop Infrastructure as Code - SuestraWorkshop Infrastructure as Code - Suestra
Workshop Infrastructure as Code - Suestra
 
Docker Compose to Production with Docker Swarm
Docker Compose to Production with Docker SwarmDocker Compose to Production with Docker Swarm
Docker Compose to Production with Docker Swarm
 
GDG Lima - Docker Compose
GDG Lima - Docker ComposeGDG Lima - Docker Compose
GDG Lima - Docker Compose
 
Docker Lima meetup - 22 de junio
Docker Lima meetup - 22 de junioDocker Lima meetup - 22 de junio
Docker Lima meetup - 22 de junio
 
Docker Compose para el Docker Lima Meetup Mayo
Docker Compose para el Docker Lima Meetup MayoDocker Compose para el Docker Lima Meetup Mayo
Docker Compose para el Docker Lima Meetup Mayo
 
Testing en BDD con Python y Behave
Testing en BDD con Python y BehaveTesting en BDD con Python y Behave
Testing en BDD con Python y Behave
 
Infrastructure as Code with Terraform
Infrastructure as Code with TerraformInfrastructure as Code with Terraform
Infrastructure as Code with Terraform
 
Modelado de API con RAML
Modelado de API con RAMLModelado de API con RAML
Modelado de API con RAML
 
Docker Ecosystem: Part V - Docker Registry
Docker Ecosystem: Part V - Docker RegistryDocker Ecosystem: Part V - Docker Registry
Docker Ecosystem: Part V - Docker Registry
 
Docker Ecosystem: Part IV - Swarm
Docker Ecosystem: Part IV - SwarmDocker Ecosystem: Part IV - Swarm
Docker Ecosystem: Part IV - Swarm
 

Earthly, Dockerfile con esteroides

  • 2. Me presento ● Mario Inga C. ● Miembro de comunidades: DevOps Perú, Docker Lima y Cloud Native Perú. ● Software Development, Cloud, SysAdmin, Security. ● Trabajo en Voltron Data ● Metal m/ ● Twitter: @mario21ic
  • 3. Docker: Build once, Run Anywhere Code + Dockerfile = Docker Image Docker Hub Quay.io Cloud Repositories Other solutions On premise
  • 4. Local + CI + CD ● CI: “fail Fast & fail First” -> app & tests ● Si no falla, hace deploy a un environment como Dev, QA, Stage, etc para pruebas manuales. ● Y Local? Local CI CD
  • 5. Local ● Code ● Tasks: ○ Lint ○ Unit tests ○ Integration tests ○ Build ● Tools: ○ Bash Scripts ○ Makefile ○ Dockerfile multistage (lint, tests, build) ● Probar manualmente el app
  • 6. CI Server ● Configuracion (url, users, permissions, etc) ● Credenciales (tokens, ssh keys, etc) ● Plugins (docker, k8s, sonar, etc) ● Pipeline steps: ○ Scripts ○ Jenkinsfile ○ Yaml ● Se genera una fuerte dependencia del CI Server.
  • 7. Y cuando aparece un issue SOLO en CI? ● Contexto: ○ Teniamos los build steps en el CI server (no repositorio). ○ Definimos todos los build steps en el formato del CI tool (Jenkinsfile, yaml files). ○ Abusar del uso de Jenkins plugins, generando una fuerte dependencia con Jenkins. ● Cómo replicar el issue en Local? ○ Levantan un Jenkins en local? Y los plugins, configs, credentials, etc? ○ Interpretar el yaml file y crean un script? Eso es redundar no? ● Descargar Docker images y poner el code? ● Prueba y Error? Enviar commits tras commits.
  • 10. Algunas reflexiones ● Docker: Build once, Run anywhere. ● Enpaquetamos en App en Docker pero y los steps de CI/CD? ● Desarrollamos en Local: build, run unit & integration tests, etc sin Containers. ● Esperamos que recién falle en CI (donde se ejecutan en Containers)
  • 11. Y si usamos los Containers en Local? ● Containers para: ○ Lint ○ Unit Tests ○ Integration Tests ○ Build ● Mantenimiento de: Dockerfiles, Makefiles, Bash Scripts, etc. ● Primero los Steps del CI usando Containers en Local. ● Al final Empaquetamos el App en un Docker Image.
  • 12. usando Containers en Local: ● Building: ○ Dockerfile: gcc, g++, go, rustc, jdk, etc ● Runtime: ○ Dockerfile: java runtime (jre), scratch, ubuntu, centos, etc ● Orquestacion: ○ docker-compose.integration-tests.yml ○ docker-compose.tasks.yml ● Bash scripts usan binarios que no son iguales en todos los SOs, ejem grep, find, etc. ● Scripts para: docker build de image, docker run para tareas (deps, run unit & integration tests, build, etc). ● Makefile para orquestar los scripts, ejem: clean && build && tests.
  • 13. Problemas: Orientado a ejecutar en CI.
  • 14. Propuesta: Orientado a ejecutarse en cualquier lugar.
  • 15. Why Earthly? ● 🐳 Build anything via containers ● 🛠 Programming language agnostic ● 🔁 Repeatable builds ● ⛓ Parallelism that just works ● 🏘 Mono and Poly-repo friendly ● 💾 Shared caching ● 🔀 Multi-platform ● Open source https://github.com/earthly/earthly ● Web https://earthly.dev/
  • 16. ❤ Makefile + Dockerfile = Earthfile ● What if Dockerfiles and Makefiles had a Baby ● Repeatable builds ● A familiar syntax ● Cache for more speed. ● Targets: $ earthly ls
  • 17. Demo time sin Earthly ● Golang app calculator ● Docker + Makefile + Scripts ● Tasks: a. Lint b. Unit Tests c. Build d. Docker (image) ● Jenkins: a. Sin Docker requiere: go, gcc, makefile, etc b. Con Docker usando Multistage (no son jenkins build stages) o sino Bash Scripts.
  • 18. 1) CI Pipeline con Plugins ● Ventajas: ○ Diferentes stages: Deps, Lint, Unit Tests, Build, Docker Image ○ Solo defines un agent con docker image “golang:1.17-alpine” ● Desventajas: ○ Requiere Docker Plugin y Docker Pipeline Plugin ○ Todos los steps estan en el Jenkinsfile_plugins. Dificil mantener y replicar.
  • 19. 2) CI Pipeline con Dockerfile Multistage ● Ventajas: ○ Todo en Uno. ● Desventajas: ○ Un solo stage: Deps, Lint, Unit Tests, Build todo dentro del Dockerfile. ○ Reiniciar desde un punto ○ Jenkinsfile no usa “make docker”, llama directo al script ./docker-build.sh.
  • 20. 3) CI Pipeline con Containers ● Ventajas: ○ Buena visibilidad. ● Desventajas: ○ Jenkinsfile_containers tuvo que crear el docker Image Build (base). ○ Muchos scripts: los que Automatizan en local y los que ejecutan estos en Containers. ○ El script ./build-con-docker.sh solo para Local, porque el entregable es Docker Image.
  • 21. Demo time con Earthly ● Golang app calculator ● Earthly ● Tasks: ○ Lint ○ Unit Tests ○ Build ○ Docker (image) ● Jenkins: ○ Requiere Earthly
  • 22. Demo: Deps & Lint ● Deps: $ earthly +deps ● Lint: $ earthly +lint # Corregir y probar (cache) $ earthly +lint $ earthly --no-cache +lint
  • 23. Demo: Build & Docker ● Build: $ earthly +build $ file build/go-example ● Docker: $ earthly +docker $ docker run go-example ● All in one: $ earthly +all
  • 24. CI Pipeline con Earthly ● Cada Stage refleja el trabajo en Local. ● Visibilidad ● Altamente Replicables. ● Puede mejorar con Stages en paralelo.
  • 25. Extra: Build for Multi Architecture. ● Build: $ earthly --platform=linux/amd64 +build $ file build/go-example $ docker run --platform=linux/amd64 -v $PWD/build:/tmp ubuntu:20.04 /tmp/go-example ● Docker: $ earthly --platform=linux/amd64 +docker $ docker run go-example:latest_linux_amd64 Mas info https://docs.earthly.dev/docs/guides/multi-platform https://docs.docker.com/desktop/multi-arch/
  • 26. 1. DRY => Don’t Repeat Yourself 2. KISS => Keep It Simple Stupid 3. RTFM => Read the fu**ing manual. 4. Earthly Docs https://docs.earthly.dev/basics 5. Poner nombres autodescriptivos para todo. 6. Enamorarse del problema y NO de la solución. 7. Evitar Obsession tool (mucho acoplamiento) 8. No existen las balas de plata. Algunas recomendaciones