Pipeline en Jenkins 2.0 como Código para iOS 10 y XCode 8.

Publicado el 26/12/2016

Introducción

Ya puedes definir tus procesos de Integración Continua y Despliegue Continuo (CI/CD) como si fuera código fuente con Jenkins 2.0 para tus proyectos en iOS 10. Compilar, realizar pruebas, analizar cobertura y estilo de código, reportes y notificaciones son actividades descritas en un solo fichero.

Explicar cómo funciona

Una de las metas de DevOps es poder definir nuestros procesos de Integración Continua y Despliegue Continuo de manera tal que puedan ser documentados, descritos y modificados fácilmente.

Jenkins a apoyado esta filosofía de trabajo al incluir el fichero Jenkinsfile junto al grupo de módulos Pipeline. El fichero Jenkinsfile se utiliza para describir la secuencia de pasos que va a realizar el sistema a través de los módulos Pipeline. La información existente en el sitio Jenkins.io puede ser consultada para profundizar los detalles.

Time Table: Un proyecto de ejemplo

Time Table es un proyecto de ejemplo para mostrar cómo podemos estructurar nuestro proceso de CI/CD para un proyecto en iOS 10.

Código fuente

El código fuente puede ser descargado o clonado desde Github.

Entorno

La configuración del entorno donde fue desarrollado el artículo es la siguiente:

### Sistema de integración continua ###
             SO: Ubuntu 14.04
        Jenkins: 2.19.3

### Nodo de Jenkins ###
             SO: Mac OS 10.12.2
          XCode: 8.1

### Proyecto iOS 10.1 ###
       Lengueje: Swift 3

Configurando Jenkinsfile

A continuación le mostramos el código que usted necesita incluir en su proyecto para configurar su pipeline completamente. Cree un fichero en la raíz de su proyecto llamado Jenkinsfile y copie - pegue el código que aparece a continuación. Si esto es lo que usted necesitaba, aquí va:

node('iOS Node') {

    stage('Checkout/Build/Test') {

        // Checkout files.
        checkout([
            $class: 'GitSCM',
            branches: [[name: 'master']],
            doGenerateSubmoduleConfigurations: false,
            extensions: [], submoduleCfg: [],
            userRemoteConfigs: [[
                name: 'github',
                url: 'https://github.com/mmorejon/time-table.git'
            ]]
        ])

        // Build and Test
        sh 'xcodebuild -scheme "TimeTable" -configuration "Debug" build test -destination "platform=iOS Simulator,name=iPhone 6,OS=10.1" -enableCodeCoverage YES | /usr/local/bin/xcpretty -r junit'

        // Publish test restults.
        step([$class: 'JUnitResultArchiver', allowEmptyResults: true, testResults: 'build/reports/junit.xml'])
    }

    stage('Analytics') {
        
        parallel Coverage: {
            // Generate Code Coverage report
            sh '/usr/local/bin/slather coverage --jenkins --html --scheme TimeTable TimeTable.xcodeproj/'
    
            // Publish coverage results
            publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'html', reportFiles: 'index.html', reportName: 'Coverage Report'])
        
            
        }, Checkstyle: {

            // Generate Checkstyle report
            sh '/usr/local/bin/swiftlint lint --reporter checkstyle > checkstyle.xml || true'
    
            // Publish checkstyle result
            step([$class: 'CheckStylePublisher', canComputeNew: false, defaultEncoding: '', healthy: '', pattern: 'checkstyle.xml', unHealthy: ''])
        }, failFast: true|false   
    }
}

Comprendiendo Jenkinsfile

Veamos paso a paso lo que significa cada sección del fichero Jenkinsfile.

Especificar el nodo

node('iOS Node') {	
	......
}

El nodo de Jenkins tiene que tener sistema operativo Mac OS 10 con XCode 8.

Definición de trabajos

Tareas realizadas de manera secuencia: obtener código, compilarlo y reliazarle pruebas.

stage('Checkout/Build/Test') {
	......
}

Tareas a realizase en paralelo: análisis de pruebas y estilo de código.

stage('Analytics') {

	parallel Coverage: {
		......
	}, Checkstyle: {
		......
	}, failFast: true|false

}

Jenkins agrupa las tareas en stage. Las tareas pueden ser ejecutadas de manera secuencial o en paralelo según sea el caso. El fichero Jenkinsfile muestra ambos ejemplos.

Obtener código fuente

// Checkout files.
checkout([
    $class: 'GitSCM',
    branches: [[name: 'master']],
    doGenerateSubmoduleConfigurations: false,
    extensions: [], submoduleCfg: [],
    userRemoteConfigs: [[
        name: 'github',
        url: 'https://github.com/mmorejon/time-table.git'
    ]]
])

El Pipeline SCM Step Plugin es el encargado de obtener el código fuente del repositorio de GitHub.

Compilar y hacer pruebas

// Build and Test
sh 'xcodebuild -scheme "TimeTable" -configuration "Debug" build test -destination "platform=iOS Simulator,name=iPhone 6,OS=10.1" -enableCodeCoverage YES | /usr/local/bin/xcpretty -r junit'

Para compilar el proyecto se utiliza la herramienta xcodebuild. El resto de los parámetros son ajustado según los datos del proyecto.

Durante la ejecución de los test xcpretty se responsabiliza de transformarlos a un fichero estándar de JUnit para ser consultados posteriormente. El fichero se genera en la dirección build/reports/junit.xml.

Necesita tener instalado Xcpretty para poder obtener los reportes de pruebas.

Publicar resultados de las pruebas

// Publish test restults.
step([$class: 'JUnitResultArchiver', allowEmptyResults: true, testResults: 'build/reports/junit.xml'])

El Plugin JUnit es el responsable de mostrar los resultados de las pruebas.

Necesita tener instalado el Plugin JUnit para poder publicar los reportes de pruebas.

Cobertura de código

// Generate Code Coverage report
sh '/usr/local/bin/slather coverage --jenkins --html --scheme TimeTable TimeTable.xcodeproj/'

Para generar el reporte de cobertura del código se utiliza Slather. Slather puede ser parametrizado para obtener el reporte en formato html en la ubicación ./html/index.html

Necesita tener instalado Slather para poder generar este reporte.

Publicar reporte de cobertura de código

// Publish coverage results
publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'html', reportFiles: 'index.html', reportName: 'Coverage Report'])

El Plugin HTML Publisher se utiliza para publicar el reporte de cobertura del código.

Necesita tener instalado el Plugin HTML Publisher para utilizar esta funcionalidad.

Generar reporte de estilo de código

// Generate Checkstyle report
sh '/usr/local/bin/swiftlint lint --reporter checkstyle > checkstyle.xml || true'

SwiftLint se ha utilizado para evaluar el estilo de código. El reporte es generado utilizando el formato checkstyle y se almacena el el fichero checkstyle.xml.

Necesita tener instalado SwiftLint para utilizar esta funcionalidad.

Publicar reporte de estilo de código

// Publish checkstyle result
step([$class: 'CheckStylePublisher', canComputeNew: false, defaultEncoding: '', healthy: '', pattern: 'checkstyle.xml', unHealthy: ''])

El Plugin Checkstyle se ha utilizado para mostrar los reportes de estilo de código. Se utiliza el fichero checkstyle.xml generado por SwiftLint.

Enviar notificación de Slack

// Send slack notification
slackSend channel: '#my-team', message: 'Time Table - Successfully', teamDomain: 'my-team', token: 'my-token'

El Plugin Slack Notification se ha utilizado para enviar notificaciones al canal del equipo. El plugin debe ser configurado según los datos de la cuenta de Slack que utilice el equipo. Los valores que deben ser modificados son: channel, message, teamDomain y token.

Necesita tener instalado el Plugin Slack Notification para enviar las notificaciones.

Configurar el trabajo en Jenkins

Crear nuevo trabajo

Crea un nuevo trabajo en Jenkins. Coloque el nombre de time-table, seleccione la opción Pipeline y de clic en el botón OK.

Configure los datos del Pipeline

Los datos relacionados con el módulo Pipeline deben quedar como muestra la imagen.

      Definition: Pipeline script from SCM
             SCM: Git
    Repositories: https://github.com/mmorejon/time-table.git
Branch Specifier: master
     Script Path: Jenkinsfile

Ejecutar el trabajo en Jenkins

Ejecute el trabajo en Jenkins y podrá obtener resultados similares a las imágenes que se muestran a continuación.

Vista tradicional de Jenkins

Vista Blue Ocean UI de Jenkins

Conclusiones

Ahora usted sabe cómo escribir sus propios procesos de CI/CD utilizando el módulo Pipeline de Jenkins 2.0. Es su turno de construir el fichero Jenkinsfile que necesita su equipo.

Publicado el 26/12/2016