SlideShare una empresa de Scribd logo
1 de 68
Descargar para leer sin conexión
Integración continua
con Gitlab + Fastlane
Jesús Martín Alonso
#AltConfMadrid
Índice
1. ¿Qué es Integración y Entrega Continua?
2. ¿Por qué utilizarla?
3. Configuración básica de Gitlab y fastlane
4. Ejemplo de configuración CI en un proyecto iOS
#AltConfMadrid
¿Quién soy?
Jesús Martín Alonso
• Graduado y máster en Ingeniería Informática
por la UCM
• Desarrollador iOS en Aiwin
@JMartinAlonso92
linkedin.com/in/jesus-martin-alonso/
#AltConfMadrid
¿Dónde trabajo?
Soluciones disponibles para:
- Web
- iOS
- Android
Crear soluciones que combinan arte, juego y tecnología para
emocionar y motivar personas y producir cambios.
www.aiwin.es
#AltConfMadrid
Integración Continua (CI)
Cada integración conlleva una serie de pruebas y verificaciones
automáticas. Ejemplo:
• Compilar app
• Ejecutar tests
• ….
Práctica de desarrollo donde los miembros de un equipo integran su
código frecuentemente en un repositorio.
#AltConfMadrid
Entrega continua (CD)
• Automatizada
• Sencilla:
– Pulsar botón -> ¡A producción!
Añade la posibilidad de lanzar una nueva versión a producción
(AppStore), de manera rápida y segura
¿Por qué utilizar CI/CD?
#AltConfMadrid
¿Por qué usar CI/CD?
Integraciones más
sencillas al ser más
frecuentes
#AltConfMadrid
¿Por qué usar CI/CD?
Despliegues más
rápidos y seguros
#AltConfMadrid
¿Por qué usar CI/CD?
Detectar fallos en una etapa
temprana del desarrollo
¿Cómo lo hacemos?
#AltConfMadrid
¿Cómo lo hacemos?
Herramientas
#AltConfMadrid
¿Cómo lo hacemos?
Herramientas
Servicio de alojamiento de repositorios Git
Además ofrece…
• Herramienta de seguimiento de errores
• Alojamiento de wikis
• Merge requests / Code reviews….
• Ejecución de pipelines de CI/CD
#AltConfMadrid
¿Cómo lo hacemos?
Herramientas
Permite automatizar la gran mayoría de tareas repetitivas del flujo de
desarrollo y despliegue de nuestras apps
Plataforma open source destinada a simplificar el despliegue de apps
Android e iOS
#AltConfMadrid
¿Cómo lo hacemos?
Herramientas
¿Qué tipo de tareas?
• Incrementar número de versión
• Gestión de certificados y provisioning profiles
• Generar .ipa
• Realizar capturas de pantalla para la ficha del App Store
• Subir versión a App Store
• …. y muchas más
#AltConfMadrid
¿Cómo lo hacemos?
Herramientas
¿Cómo?
• Se integra con la mayoría de servicios de CI/CD
Configuración Gitlab y Fastlane
#AltConfMadrid
La integración continua de Gitlab se basa en dos cosas:
1. .gitlab-ci.yml: Fichero en la raiz del proyecto que
contiene la especificación de los pipelines con todas las
acciones de integración continua
2. Gitlab runner: Encargado de ejecutar los pipelines
Configuración CI
Gitlab
#AltConfMadrid
Configuración CI
Gitlab - 1. Configuración gitlab-ci
job1
job3
job2
Stage 1 Stage 2
#AltConfMadrid
Configuración CI
Gitlab - 1. Configuración gitlab-ci
stages:
- first-stage
- second-stage
...
job-of-second-stage:
stage: second-stage
...
job-2-of-second-stage:
stage: first-stage
...
.gitlab-ci.yml
Job
Job
stage
#AltConfMadrid
Configuración CI
Gitlab - 1. Configuración gitlab-ci
job-of-first-stage:
stage: first-stage
#Shell script
script:
- first-command
- second-command
.gitlab-ci.yml
#AltConfMadrid
Configuración CI
Gitlab - 2. Configuración Gitlab Runner
Proyecto Open Source que permite la ejecución de jobs y
enviar los resultados de vuelta a Gitlab
#AltConfMadrid
Configuración CI
Gitlab - 2. Configuración Gitlab Runner
Gitlab ofrece runners compartidos como SaaS
Inconvenientes:
- Minutos limitados (2000/mes)
- Solo runners tipo Linux
Necesidad de instalar el runner en una máquina propia
#AltConfMadrid
#AltConfMadrid
Configuración CI
Gitlab - 2. Configuración Gitlab Runner
#AltConfMadrid
Configuración CI
Fastlane
#Install fastlane
brew cask install fastlane
#Init fastlane in the project
fastlane init
MyiOSProject
├ MyiOSProject.xcodeproj
├ fastlane
├ Fastfile
#AltConfMadrid
Configuración CI
Fastlane
default_platform :ios
platform :ios do
desc "Description of the lane"
lane :build do
action1()
action2()
end
...
...
desc "Description"
lane :test do
action3()
end
end
Fastfile
Let’s automate
#AltConfMadrid
Ejemplo: Altconf CI app
• Cocoapods como gestor de dependencias
• Un único entorno
• Tests unitarios con XCTest
• Tests de interfaz con KIF
• 3 “schemes”:
– AltconfCI
– AltconfCITests
– AltconfCIUITests
#AltConfMadrid
Ejemplo: Altconf CI app
Cada vez que hacemos commit a
una feature
(feature/my-feature-branch)
1. Comprobar que compila
2. Ejecución de tests unitarios
Pipeline “feature”
Cada vez que integramos:
(master)
1. Ejecución de tests de interfaz
2. Calidad del código
3. Incrementar version
4. Subir a testflight
Pipeline “master”
Pipeline ramas “feature”
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
Creación de lane para compilar la app:
fastlane gym
Wrapper de xcodebuild y xcpretty que permite la compilación y
generación de IPAs de manera user-friendly
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
Creación de lane para compilar la app:
lane :build do
cocoapods(try_repo_update_on_error: true)
gym(
skip_archive: true,
skip_package_ipa: true,
scheme: "AltconfCI"
)
end Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
Creación de lane para ejecutar los tests unitarios
fastlane scan
Permite la ejecución de tests y la generación de informes de manera
sencilla
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
Creación de lane para ejecutar los tests unitarios:
lane :unit_tests do
cocoapods(try_repo_update_on_error: true)
scan( scheme: "AltconfCITests",
clean: true,
code_coverage: true,
output_directory: "sonar-reports",
derived_data_path: "DerivedData")
end
Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
compile unit-test
compile test
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
stages:
- compile
- test
compile:
stage: compile
script:
- ...
...
...
unit-test:
stage: test
script:
- ...
.gitlab-ci.yml
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
compile:
stage: compile
script:
- bundle exec fastlane build
tags:
- altconf
.gitlab-ci.yml
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
unit-test:
stage: test
artifacts:
expire_in: 1 week
paths:
- sonar-reports/*
- DerivedData/Build/ProfileData/*/*.profdata
- DerivedData/Build/ProfileData/*/*.profraw
- DerivedData/Build/Products/*/AltconfCI.app
script:
- bundle exec fastlane unit_tests
tags:
- altconf
.gitlab-ci.yml
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “feature”
Al hacer un commit en la rama feature/my-feature ...
Pipeline rama “master”
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Además de las comprobaciones anteriores queremos hacer:
• Ejecución de tests de interfaz
• Calidad del código
• Incrementar version
• Subir a testflight
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Creación de lane para ejecutar los tests de interfaz:
lane :ui_tests do
cocoapods(try_repo_update_on_error: true)
scan(scheme: "AltconfCIUITests",
device: "iPhone XS",
clean: true,
code_coverage: true,
output_directory: "sonar-reports",
derived_data_path: "DerivedData")
end Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Creación de lane para comprobar la calidad del código
• Cobertura: Fastlane Slather
• Complejidad código: Lizard
• Convenciones y estilos: Swiftlint
• Subida a sonar: Sonar
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Creación de lane para comprobar calidad del código:
lane :sonarAnalysis do
...
end
Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
lane :sonarAnalysis do
...
#Generate code coverage
slather(
cobertura_xml: true,
output_directory: "sonar-reports",
proj: "AltconfCI.xcodeproj",
workspace: "AltconfCI.xcworkspace",
use_bundle_exec: true,
scheme: "AltconfCI",
build_directory: "DerivedData",
ignore: []
) ...
end
Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
lane :sonarAnalysis do
...
#Generate code complexity report
lizard(
source_folder: 'AltconfCI',
language: 'swift',
export_type: 'xml',
report_file: './sonar-reports/lizard-report.xml'
)
...
end
Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
lane :sonarAnalysis do
...
#Swift linter
swiftlint(
output_file: "./sonar-reports/swiftlint.txt",
ignore_exit_status: true,
path: "AltconfCI"
)
...
end
Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
lane :sonarAnalysis do
...
version = get_version_number(xcodeproj: "AltconfCI.xcodeproj")
sonar(
sonar_login: ENV['SONAR_TOKEN'],
sonar_runner_args: "-Dsonar.host.url=#{ENV['SONAR_HOST_URL']}",
project_version: version
)
...
end Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
sonar.swift.lizard.report=sonar-reports/lizard-report.xml
sonar.swift.coverage.reportPattern=sonar-reports/cobertura.xml
sonar.swift.swiftlint.report=sonar-reports/*swiftlint.txt
sonar-project.properties
#AltConfMadrid
Creación de lane para incrementar la versión:
Antes de subir a TestFlight necesitaremos incrementar la versión:
• Incrementar el version number
• Incrementar el build number
• Hacer commit
• Hacer push
Ejemplo: Altconf CI app
Pipeline “master”
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
lane :bump_version do
increment_version_number_in_plist(target: 'AltconfCI')
increment_build_number
git_commit(
message: "[skip ci] Bump version number",
path: ["./*.plist", "./*.pbxproj"]
)
push_to_git_remote
end
Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Creación de lane para subir a “TestFlight”
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Herramienta para la compartir los certificados y provisioning profiles
de manera segura usando git:
• Los certificados y provisioning se guardan cifrados en un
repositorio .git
• Una única code sign identity para todo el equipo
• No hace falta que los desarrolladores tengan acceso a la cuenta
de Apple Developer para firmar la app
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Generación del Ipa para subir a TestFlight
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Acción que permite subir a testflight de manera sencilla
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
desc "Push a new beta build to TestFlight"
lane :beta do
cocoapods(try_repo_update_on_error: true)
match(type: "appstore")
gym(export_method: "app-store",
scheme: "AltconfCI")
pilot(
apple_id: "1466253609",
skip_waiting_for_build_processing: true
)
end Fastfile
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
compile
unit-test
compile test qa release
ui-test
qa deploy
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
stages:
- compile
- test
- qa
- release
ui_tests:
stage: test
script:
- ...
...
qa:
stage: qa
script:
- ...
deploy:
stage: release
script:
- ...
.gitlab-ci.yml
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
ui-test:
stage: test
artifacts:
...
script:
- bundle exec fastlane ui_tests
tags:
- altconf
only:
- master
.gitlab-ci.yml
Solo se ejecuta en la rama “master”
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
qa:
dependencies:
- unit-test
- ui-test
stage: qa
script:
- bundle exec fastlane sonarAnalysis
- $HOME/scripts/sonar/check_build.sh
tags:
- altconf
only:
- master
.gitlab-ci.yml
Necesitamos descargar los artifacts
Comprobar resultado
ejecución sonar
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
deploy:
stage: release
script:
- bundle exec fastlane increment_build_number
- bundle exec fastlane beta
tags:
- altconf
only:
- master
.gitlab-ci.yml
#AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
#AltConfMadrid
Ejemplo: Altconf CI app
Conclusiones
#AltConfMadrid
Conclusiones
Aspectos positivos:
• Multitud opciones para utilizar CI en nuestros proyectos iOS
– Bitrise, Gitlab, Travis, Jenkins, Fastlane...
• “Obliga” al equipo a mantener unos estándares de calidad
• Ahorra mucho tiempo en tareas repetitivas:
– Configurar profiles y certificates
– Ejecutar tests
– Generar ipa
– Subir testflight...
#AltConfMadrid
Conclusiones
Aspectos negativos:
• Tiempo de setup del entorno de CI
• Mantenimiento de lanes, pipelines….
• Fallos inexplicables. Ej: “Los tests fallan en el servidor de CI,
pero en local funcionan”
Preguntas
@JMartinAlonso92
linkedin.com/in/jesus-martin-alonso/
#AltConfMadrid

Más contenido relacionado

La actualidad más candente

Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18Young Suk Ahn Park
 
Introducción a DevOps workshop
Introducción a DevOps workshopIntroducción a DevOps workshop
Introducción a DevOps workshopMarco Avendaño
 
Introduction to Github Actions
Introduction to Github ActionsIntroduction to Github Actions
Introduction to Github ActionsKnoldus Inc.
 
DevOps with GitHub Actions
DevOps with GitHub ActionsDevOps with GitHub Actions
DevOps with GitHub ActionsNilesh Gule
 
Git - An Introduction
Git - An IntroductionGit - An Introduction
Git - An IntroductionBehzad Altaf
 
SonarQube - The leading platform for Continuous Code Quality
SonarQube - The leading platform for Continuous Code QualitySonarQube - The leading platform for Continuous Code Quality
SonarQube - The leading platform for Continuous Code QualityLarry Nung
 
Azure DevOps Presentation
Azure DevOps PresentationAzure DevOps Presentation
Azure DevOps PresentationInCycleSoftware
 
Getting Started with Spring Authorization Server
Getting Started with Spring Authorization ServerGetting Started with Spring Authorization Server
Getting Started with Spring Authorization ServerVMware Tanzu
 
DevOps Tutorial For Beginners | DevOps Tutorial | DevOps Tools | DevOps Train...
DevOps Tutorial For Beginners | DevOps Tutorial | DevOps Tools | DevOps Train...DevOps Tutorial For Beginners | DevOps Tutorial | DevOps Tools | DevOps Train...
DevOps Tutorial For Beginners | DevOps Tutorial | DevOps Tools | DevOps Train...Simplilearn
 
Git y Github basico.pptx
Git y Github basico.pptxGit y Github basico.pptx
Git y Github basico.pptxssuser36d4d3
 
Jenkins Shared Libraries Workshop
Jenkins Shared Libraries WorkshopJenkins Shared Libraries Workshop
Jenkins Shared Libraries WorkshopJulien Pivotto
 
Code Security with GitHub Advanced Security
Code Security with GitHub Advanced SecurityCode Security with GitHub Advanced Security
Code Security with GitHub Advanced SecurityLuis Fraile
 

La actualidad más candente (20)

Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18
 
Introducción a DevOps workshop
Introducción a DevOps workshopIntroducción a DevOps workshop
Introducción a DevOps workshop
 
Introduction to devops
Introduction to devopsIntroduction to devops
Introduction to devops
 
An introduction to DevOps
An introduction to DevOpsAn introduction to DevOps
An introduction to DevOps
 
DevOps - TechNights
DevOps - TechNightsDevOps - TechNights
DevOps - TechNights
 
Git
GitGit
Git
 
Introduction to Github Actions
Introduction to Github ActionsIntroduction to Github Actions
Introduction to Github Actions
 
DevOps with GitHub Actions
DevOps with GitHub ActionsDevOps with GitHub Actions
DevOps with GitHub Actions
 
Git - An Introduction
Git - An IntroductionGit - An Introduction
Git - An Introduction
 
Git Pull Requests
Git Pull RequestsGit Pull Requests
Git Pull Requests
 
SonarQube - The leading platform for Continuous Code Quality
SonarQube - The leading platform for Continuous Code QualitySonarQube - The leading platform for Continuous Code Quality
SonarQube - The leading platform for Continuous Code Quality
 
Azure DevOps Presentation
Azure DevOps PresentationAzure DevOps Presentation
Azure DevOps Presentation
 
DevOps intro
DevOps introDevOps intro
DevOps intro
 
Git & GitLab
Git & GitLabGit & GitLab
Git & GitLab
 
DevOps introduction
DevOps introductionDevOps introduction
DevOps introduction
 
Getting Started with Spring Authorization Server
Getting Started with Spring Authorization ServerGetting Started with Spring Authorization Server
Getting Started with Spring Authorization Server
 
DevOps Tutorial For Beginners | DevOps Tutorial | DevOps Tools | DevOps Train...
DevOps Tutorial For Beginners | DevOps Tutorial | DevOps Tools | DevOps Train...DevOps Tutorial For Beginners | DevOps Tutorial | DevOps Tools | DevOps Train...
DevOps Tutorial For Beginners | DevOps Tutorial | DevOps Tools | DevOps Train...
 
Git y Github basico.pptx
Git y Github basico.pptxGit y Github basico.pptx
Git y Github basico.pptx
 
Jenkins Shared Libraries Workshop
Jenkins Shared Libraries WorkshopJenkins Shared Libraries Workshop
Jenkins Shared Libraries Workshop
 
Code Security with GitHub Advanced Security
Code Security with GitHub Advanced SecurityCode Security with GitHub Advanced Security
Code Security with GitHub Advanced Security
 

Similar a Integración Continua con Gitlab + Fastlane

Automatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAutomatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAmazon Web Services LATAM
 
Desarrollo de Aplicaciones Metro en Windows 8
Desarrollo de Aplicaciones Metro en Windows 8Desarrollo de Aplicaciones Metro en Windows 8
Desarrollo de Aplicaciones Metro en Windows 8Rodolfo Finochietti
 
Commit 2018 - Integrando Microservicios y Machine Learning
Commit 2018 - Integrando Microservicios y Machine LearningCommit 2018 - Integrando Microservicios y Machine Learning
Commit 2018 - Integrando Microservicios y Machine LearningRafa Hidalgo
 
Técnicas para implementación de Continuous Delivery en AWS
Técnicas para implementación de Continuous Delivery en AWSTécnicas para implementación de Continuous Delivery en AWS
Técnicas para implementación de Continuous Delivery en AWSAmazon Web Services LATAM
 
Técnicas para la Implementación de Desarrollo Continuo en AWS
Técnicas para la Implementación de Desarrollo Continuo en AWSTécnicas para la Implementación de Desarrollo Continuo en AWS
Técnicas para la Implementación de Desarrollo Continuo en AWSAmazon Web Services LATAM
 
Meetup TestingUy 2019 - Plataforma de integración y testing continuo
Meetup TestingUy 2019 - Plataforma de integración y testing continuoMeetup TestingUy 2019 - Plataforma de integración y testing continuo
Meetup TestingUy 2019 - Plataforma de integración y testing continuoTestingUy
 
App engine
App engineApp engine
App engineThirdWay
 
.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0Luis Ruiz Pavón
 
Taller IoT: desarrollo visual en Sofia2 con Raspberry Pi, Node-RED y dashboards
Taller IoT: desarrollo visual en Sofia2 con Raspberry Pi, Node-RED y dashboardsTaller IoT: desarrollo visual en Sofia2 con Raspberry Pi, Node-RED y dashboards
Taller IoT: desarrollo visual en Sofia2 con Raspberry Pi, Node-RED y dashboardsSofia2 Smart Platform
 
Desarrollo de aplicaciones multiplataforma 1/2
Desarrollo de aplicaciones multiplataforma 1/2Desarrollo de aplicaciones multiplataforma 1/2
Desarrollo de aplicaciones multiplataforma 1/2Ignacio Muñoz Vicente
 
MuleSoftMeetupValencia #08 -Código más limpio que una patena.pptx
MuleSoftMeetupValencia #08 -Código más limpio que una patena.pptxMuleSoftMeetupValencia #08 -Código más limpio que una patena.pptx
MuleSoftMeetupValencia #08 -Código más limpio que una patena.pptxAntonio Martínez Peiró
 
ALM con Visual Studio y TFS 2013
ALM con Visual Studio y TFS 2013ALM con Visual Studio y TFS 2013
ALM con Visual Studio y TFS 2013Rodolfo Finochietti
 

Similar a Integración Continua con Gitlab + Fastlane (20)

Automatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWSAutomatice el proceso de entrega con CI/CD en AWS
Automatice el proceso de entrega con CI/CD en AWS
 
Desarrollo de Aplicaciones Metro en Windows 8
Desarrollo de Aplicaciones Metro en Windows 8Desarrollo de Aplicaciones Metro en Windows 8
Desarrollo de Aplicaciones Metro en Windows 8
 
Commit 2018 - Integrando Microservicios y Machine Learning
Commit 2018 - Integrando Microservicios y Machine LearningCommit 2018 - Integrando Microservicios y Machine Learning
Commit 2018 - Integrando Microservicios y Machine Learning
 
Técnicas para implementación de Continuous Delivery en AWS
Técnicas para implementación de Continuous Delivery en AWSTécnicas para implementación de Continuous Delivery en AWS
Técnicas para implementación de Continuous Delivery en AWS
 
Técnicas para la Implementación de Desarrollo Continuo en AWS
Técnicas para la Implementación de Desarrollo Continuo en AWSTécnicas para la Implementación de Desarrollo Continuo en AWS
Técnicas para la Implementación de Desarrollo Continuo en AWS
 
Meetup TestingUy 2019 - Plataforma de integración y testing continuo
Meetup TestingUy 2019 - Plataforma de integración y testing continuoMeetup TestingUy 2019 - Plataforma de integración y testing continuo
Meetup TestingUy 2019 - Plataforma de integración y testing continuo
 
Desarrollando filtros para Kurento
Desarrollando filtros para KurentoDesarrollando filtros para Kurento
Desarrollando filtros para Kurento
 
Pucela testingdays testing_en_php
Pucela testingdays testing_en_phpPucela testingdays testing_en_php
Pucela testingdays testing_en_php
 
App engine
App engineApp engine
App engine
 
.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0
 
Taller IoT: desarrollo visual en Sofia2 con Raspberry Pi, Node-RED y dashboards
Taller IoT: desarrollo visual en Sofia2 con Raspberry Pi, Node-RED y dashboardsTaller IoT: desarrollo visual en Sofia2 con Raspberry Pi, Node-RED y dashboards
Taller IoT: desarrollo visual en Sofia2 con Raspberry Pi, Node-RED y dashboards
 
Comenzando a usar el Continuous Delivery
 Comenzando a usar el Continuous Delivery Comenzando a usar el Continuous Delivery
Comenzando a usar el Continuous Delivery
 
Desarrollo de aplicaciones multiplataforma 1/2
Desarrollo de aplicaciones multiplataforma 1/2Desarrollo de aplicaciones multiplataforma 1/2
Desarrollo de aplicaciones multiplataforma 1/2
 
Labview & pic
Labview & picLabview & pic
Labview & pic
 
Gestión Remota de Equipos con Python
Gestión Remota de Equipos con PythonGestión Remota de Equipos con Python
Gestión Remota de Equipos con Python
 
Ccs c compiler v4
Ccs c compiler v4Ccs c compiler v4
Ccs c compiler v4
 
Pipelines as code with Drone
Pipelines as code with DronePipelines as code with Drone
Pipelines as code with Drone
 
Backbeam
BackbeamBackbeam
Backbeam
 
MuleSoftMeetupValencia #08 -Código más limpio que una patena.pptx
MuleSoftMeetupValencia #08 -Código más limpio que una patena.pptxMuleSoftMeetupValencia #08 -Código más limpio que una patena.pptx
MuleSoftMeetupValencia #08 -Código más limpio que una patena.pptx
 
ALM con Visual Studio y TFS 2013
ALM con Visual Studio y TFS 2013ALM con Visual Studio y TFS 2013
ALM con Visual Studio y TFS 2013
 

Integración Continua con Gitlab + Fastlane