martes, 24 de junio de 2014

Integración de Jenkins con BitBucket

El asunto del titulo parece bastante simple y de hecho lo es. Pero al intentar realizar un fetch de una aplicación alojada en bitbucket a través de autenticación basada en HTTPS, obtuve los siguientes errores:

Error 1

Started by user Juan mauricio Giraldo parra
Building remotely on 262ce1a4 in workspace /scratch/jenkins/workspace/AtlasTeam
 > git rev-parse --is-inside-work-tree
Fetching changes from the remote Git repository
 > git config remote.origin.url https://yuytyutury:ggyutyutryut@bitbucket.org/danielbustamante/atlasteam.git
Fetching upstream changes from https://bjgjhghghjgh@bitbucket.org/danielbustamante/atlasteam.git
 > git --version
 > git fetch --tags --progress https://kjhjkhkjhkjh@bitbucket.org/danielbustamante/atlasteam.git +refs/heads/*:refs/remotes/origin/*
FATAL: Failed to fetch from https://mhjjkhjkhkjhkj@bitbucket.org/danielbustamante/atlasteam.git
hudson.plugins.git.GitException: Failed to fetch from https://nmbhgjhghghjghj@bitbucket.org/danielbustamante/atlasteam.git
 at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:622)
 at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:854)
 at hudson.plugins.git.GitSCM.checkout(GitSCM.java:879)
 at hudson.model.AbstractProject.checkout(AbstractProject.java:1411)
 at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:662)
 at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
 at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:571)
 at hudson.model.Run.execute(Run.java:1665)
 at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
 at hudson.model.ResourceController.execute(ResourceController.java:88)
 at hudson.model.Executor.run(Executor.java:246)
Caused by: hudson.plugins.git.GitException: Command "git fetch --tags --progress https://nhjghjgjhgjgjhg@bitbucket.org/danielbustamante/atlasteam.git +refs/heads/*:refs/remotes/origin/*" returned status code 128:
stdout: 
stderr: fatal: Authentication failed

 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1325)
 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:1186)
 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$200(CliGitAPIImpl.java:87)
 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:257)
 at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$1.call(RemoteGitImpl.java:153)
 at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$1.call(RemoteGitImpl.java:146)
 at hudson.remoting.UserRequest.perform(UserRequest.java:118)
 at hudson.remoting.UserRequest.perform(UserRequest.java:48)
 at hudson.remoting.Request$2.run(Request.java:328)
 at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
 at java.util.concurrent.FutureTask.run(FutureTask.java:262)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 at java.lang.Thread.run(Thread.java:744)


Error 2

Started by user anonymous
[EnvInject] - Loading node environment variables.
Building on master in workspace /var/lib/jenkins/workspace/TccWebServices_BS
 > git rev-parse --is-inside-work-tree
Fetching changes from the remote Git repository
 > git config remote.origin.url https://sfsfdsdf:sdadasdads@bitbucket.org/danielbustamante/atlasteam.git
Fetching upstream changes from https://mauriciogiraldo@bitbucket.org/danielbustamante/atlasteam.git
 > git --version
 > git fetch --tags --progress https://nghjghjghjgfhg@bitbucket.org/danielbustamante/atlasteam.git +refs/heads/*:refs/remotes/origin/*
FATAL: Failed to fetch from https://mnghjghjghjgjfhj@bitbucket.org/danielbustamante/atlasteam.git
hudson.plugins.git.GitException: Failed to fetch from https://jhghjghjgfhjhjg@bitbucket.org/danielbustamante/atlasteam.git
 at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:623)
 at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:855)
 at hudson.plugins.git.GitSCM.checkout(GitSCM.java:880)
 at hudson.model.AbstractProject.checkout(AbstractProject.java:1414)
 at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:652)
 at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
 at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:561)
 at hudson.model.Run.execute(Run.java:1678)
 at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
 at hudson.model.ResourceController.execute(ResourceController.java:88)
 at hudson.model.Executor.run(Executor.java:231)
Caused by: hudson.plugins.git.GitException: Command "git fetch --tags --progress https://hgfghfhgfghfgh@bitbucket.org/danielbustamante/atlasteam.git +refs/heads/*:refs/remotes/origin/*" returned status code 128:
stdout: 
stderr: error: The requested URL returned error: 401 while accessing https://khkhkjhjkhkjkjh@bitbucket.org/danielbustamante/atlasteam.git/info/refs

fatal: HTTP request failed

 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1325)
 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:1186)
 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$200(CliGitAPIImpl.java:87)
 at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:257)
 at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:621)
 ... 10 more

En los foros de internet la respuesta a este error era siempre la misma. Desde la versión 1.4.0 el issue fué solucionado. Nosotros teníamos instalada la versión 2.2.2 y aún así no funcionaba. Intentamos muchas cosas hasta que decidimos bajar la versión del plug-in Git de Jenkins a la versión 1.4.0 y se hizo la luz. Al parecer la ultima versión del plug-in tiene un problema con la autenticación HTTPS.

Los desarrolladores no consideramos el mal que podemos causar al entregar liberaciones de producto a producción sin asegurar adecuadamente la calidad. Fué 1 semana de trabajo que nos retrasó en cierta medida el proyecto. :-(




viernes, 20 de junio de 2014

De construcción de software a Desarrollo de Producto

Los procesos de desarrollo de software han cambiado en el tiempo. Aprendimos que a diferencia de una cadena productiva, nuestro trabajo no es mecánico y repetitivo sino en gran parte producto de la creatividad y la colaboración de equipo. Esta es la razón por la cual las metodologías ágiles han tenido tanta aceptación en el medio pues se enfocan radicalmente en estos conceptos.

SCRUM como proceso base para implementar software, plantea algunas ceremonias, se orienta al valor haciendo primero lo mas importante y asumiendo el alcance como un ente variable, pero cuando la responsabilidad del diseño del producto se deja solo en manos del Product Owner, llevamos a los equipos de desarrollo nuevamente a la construcción de funcionalidades, preocupándose por mantener una velocidad estable en el tiempo y por cumplir los compromisos establecidos en las ceremonias.

Tradicionalmente hemos separado las fases de análisis y de diseño del software, percibiendo el análisis como la definición funcional o el comportamiento que el software tendrá en ejecución, y pensamos en el diseño como la estrategia tecnológica que nos permitirá implementar dichas funcionalidades. Muchas veces el Product Owner se dedica al análisis en conjunto con el negocio y el equipo de desarrollo al diseño y la implementación. Ha cambiado la forma como nos comunicamos pero seguimos estando separados.

La verdad es que el diseño de un producto va mas allá de la forma como se estructura el código fuente o de los servidores y maquinas donde será desplegado para servir las peticiones de los usuarios. Un software es un generador de capacidades de negocio y en este orden de ideas el diseño del producto incluye las funcionalidades que deberán ser implementadas en torno a conseguir el impacto que se requiere.

Un equipo de desarrollo de software podría ser mucho mas efectivo si trabaja de forma conjunta con el Product Owner, teniendo una clara visión de lo que se quiere lograr y apoyando al negocio en su definición. La verdad es que las personas del negocio no saben diseñar soluciones, ellos conocen a la perfección lo que hacen y lo que quieren lograr y a partir de estos deseos definen una serie de funcionalidades que en su opinión les permitirán conseguir eso que desean. Pero esas definiciones corren el riesgo de quedarse en simples funcionalidades que no articulen un verdadero producto.

Si nuestra posición como desarrolladores se centra en la codificación, en conocer mucho sobre lenguajes de programación, patrones de diseño, arquitectura y tecnología, entonces será suficiente recibir como insumos un conjunto de cosas por hacer. Pero si nuestro objetivo es la generación de nuevas capacidades de negocio, e impactar la calidad de vida de las personas haciendo su trabajo mas fácil a través de la adopción tecnológica, entonces debemos ir mucho mas allá, conocer los objetivos que quiere lograr nuestro cliente (Persona o empresa) y velar porque los productos que entreguemos sean de la calidad mas alta e impacten de la forma mas positiva en estos.

Para llegar a este punto debemos cambiar la forma como medimos el resultado de lo que hacemos. Normalmente el trabajo creativo no tiene un resultado tangible e inmediato como si lo puede ser la construcción de código fuente, pantallas y funcionalidades. El análisis creativo que conlleva a diseñar productos que impacten a los clientes incluso mas allá de lo que ellos mismos esperan, requiere dejar de producir de forma constante, a grandes cantidades y pasar a producir menos con mayor efectividad. Es decir el foco del equipo deja de ser la productividad y pasa a ser la efectividad en la generación de impacto. 
Construir mas funcionalidades no se traduce en generar mas impacto, al contrario: Mayor cantidad de funcionalidades conlleva a tener mas código fuente, este a su vez incrementa la complejidad, lo que aumenta los tiempos de mantenimiento, reduciendo de esta manera la rapidez con la que se generan mas capacidades al software existente, llevando finalmente a tener negocios menos competitivos.

Mary y Tom Poppendieck en su libro The Lean Mind Set, hablan de esto en detalle y plantean lo siguiente: "Asking software developers to write more code is like asking authors to put more words in their books or to teachers to put more children in their class rooms. When creativity and learning are important, focusing on quantity makes none sense" Mary y Tom Poppendieck

En este orden de ideas preguntarse como las metodologías ágiles incrementarán la productividad de los desarrolladores puede ser absurdo, pues nuestro objetivo es desarrollar las funcionalidades esenciales que los usuarios amarán y no mas que eso.

La pregunta ahora es ¿Como las metodologías ágiles me ayudan a lograr equipos mas efectivos?