En esta charla se explicará cómo realizar implementar integración continua usando Gitlab y fastlane para que de forma automatizada haga:
- Ejecución de tests unitarios
- Ejecución de tests de interfaz con KIF
- Análisis de código en Sonar
- Despliegue de la app a TestFlight
2. #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
3. #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/
5. #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.
6. #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
13. #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
14. #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
15. #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
18. #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
22. #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
23. #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
29. #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
30. #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”
32. #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
33. #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
34. #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
35. #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
42. #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
43. #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
44. #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
45. #AltConfMadrid
Ejemplo: Altconf CI app
Pipeline “master”
Creación de lane para comprobar calidad del código:
lane :sonarAnalysis do
...
end
Fastfile
46. #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
47. #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
48. #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
49. #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
51. #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”
52. #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
54. #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
57. #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
66. #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...