Refactoring .Net applications: How-to NuGet

 

Let’s say you have two .Net applications: A and B and a shared component C. From a source code versioning point of view you could have:

  1. RepoFor(A, B, C)
  2. RepoFor(A, B) and OtherRepoFor(C)
  3. RepoFor(A, C) and OtherRepoFor(B)
  4. RepoFor(B, C) and OtherRepoFor(C)
  5. RepoFor(A)  and RepoFor(B) and RepoFor(C)

Except for scenario (1), all the other scenarios would require to clone more than repo, and at the same you could have additional issues when dependencies AC and BC are established at source code level.

The «elegant way» of solving this situations is to establish the dependency at binary level, that is: A and B should depend on C.dll not on C source code. So to do that you need NuGet.

NuGet is a package manager for .Net that will allow to publish packages containing .dlls (and some other stuff too).

The following diagram illustrates the suggested solution:

nuget

Here are 2 short videos I recorded to show how to create and publish NuGet packages.

 

Refactoring .Net applications Series

The main project I am currently working on, is composed of hundred of C# projects, all of them grouped into 3 git repositories: user-facing apps, background-apps and commons. The main webapp project in placen on the user-facing repo but depends on other projects that are placed in the other repositories. Because of this, to build the main webapp you have to clone then 3 repositories.

This situation has some drawbacks:

  • It is uncomfortable for developers working on the webapp
  • The high coupling between repositories/projects brings a big complexity when you have several teams working in parallel
  • The maintenance/evolution of the system gets too complex

To deal with this situation we decided to «cut» the system in several dimensions: functional, technical and SCM. So in the upcoming post I will share the different strategies we are using.

La pesada herencia

La pesada herencia

La pesada herencia es una frase que ha sonado bastante en el terreno político en Argentina en los últimos meses, pero no voy a hablar de política. Sino del código legacy que he heredado en el proyecto que estoy trabajando.

Esta semana completamos la tercera iteración del proyecto, todo en orden hasta el momento. Pero en esta cuarta iteración comenzamos a integrar el módulo que veníamos desarrollando con el resto del sistema, el cual es un sistema legacy: sin pruebas, con muy alto acoplamiento, baja cohesión, código oscuro, etc. El cliente es consciente de esto y por ello no se sorprendió cuando le dijimos que la fecha de salida a producción que habíamos hablado no sería factible. En cierto modo entendió «la pesada herencia». Ok, bien, es la realidad y no es fácil pero debemos afrontarla.

Pero de aquí a un año ya no podremos culpar a «la pesada herencia» porque si dentro de un año el sistema sigue siendo legacy, entonces no será «la pesada herencia» sino nuestra triste incompetencia.

NetConfUY 2016, pensamientos finales

Mi balance de la conferencia es muy positivo, llevé más de lo que esperaba. La organización estuvo impecable y el contenido fue de primer nivel.

Por otro lado, hacía bastante que no asistía a un evento «Microsoft-related», en general en los últimos años me he inclinado más por eventos/conferencias más relacionadas a «ingeniería de software» (xpconf, uqbar, socrates, etc) que a tecnologías específicas. Un patrón que noto en los eventos/conferencias centrados en tecnología es que casi todos el contenidos (o al menos la mayoría) está centrado en mostrar nuevas tecnologías, algunas de las cuales están aún en estado «beta» sin prestar mayor atención a «buenas prácticas». Un ejemplo concreto: en ninguna de las sesiones que asistí en la NetConf se hizo mención a como testear software construido con las tecnologías presentadas. Obviamente alguien podrá decir con toda razón que esas cuestiones estaban fuera del alcance de la conferencia, pero personalmente son cosas sobre las que me hubiera gustado escuchar.

NetConfUY 2016, día 3

NetConfUY 2016, día 3

La jornada comenzó con una charla no tan técnica de Alvaro Lame (un referente de la industria uruguaya de software) quien habló sobre la actualidad y los desafíos de la economía digital en Uruguay. La exposición fue muy buena y con un montón de datos interesantes.

A continuación Diego González y Lucas Pallarés dieron una sesión de programación sobre Hologens y codearon un juego en 40 minutos, impresionante. La sesión fue interesante y arriesgada pero todo salió impecable.

En el siguiente bloque escuché a Mariano Vazquez hablando sobre micro-servicios. Comenzó explicando los fundamentos y luego compartió varias de sus lecciones aprendidas en el día a día con este tema.

Ya cerrando la mañana Victor Silva habló sobre DevOps, PowerShell y Windows Containers. Esta fue una de las sesiones que me resultó más útil, ya que no estaba al tanto de varias de las cuestiones mencionadas y al mismo tiempo resultan ser todas cosas aplicables a mi proyecto actual. No voy a entrar en mayor detalle sobre la sesión pero les dejo algunas «keywords» para googlear: Windows Nano Server y PowerShell DSC.

Luego del almuerzo estuve rondando de un lado a otro haciendo sociales. En ese contexto estuve hablando con Dalmiro Granias, un desarrollador del equipo de Octopus y con Kevin Pilch, del equipo de C# en Microsoft.

Ya en el último bloque de la tarde escuché a Hernán Guzmán hablando sobre Serverless Computing usando Azure Functions (un análogo a Webtask de Auth0). Como la sesión terminó un poco antes de lo planeado, llegué a ver el cierre de la sesión de RodolfoF sobre Asp.Net Core, un tema con el cual vengo experimentando desde hace un tiempo y que sin dudas es uno de los temas calientes en la actualidad del mundo .Net.

La jornada finalizó con un after en el que compartimos empanadas, cerveza y música con la compañía de un mago que nos entretuvo con muy buenos trucos con cartas y sogas.

NetConfUY 2016, día 2

El día comenzó con el Keynote de Edu Mangarelli, como siempre, un excelente orador. Su keynote rondó alrededor de 3 temas calientes: Machine Learning, Bots

A continuación Gabriel Cor habló sobre Hologens, entre anécdotas y chistes contó un algunos casos del uso de Hologens en proyectos reales. Muy interesante.

El siguiente bloque de charlas estuvo dedicado a servicios cloud: primero MatiasQ habló sobre Azure Search y luego Tony Poza habló sobre Cognitive Services. Dos temas interesante que habilitan (o facilitan muchísimo) la resolución de ciertas situaciones.

Ya por la tarde Mariano Sanchez habló sobre TypeScript, la charla comenzó bien, pero me fui antes del final porque para mi gusto TypeScript intenta «mejorar JavaScript» pero paradójicamente «le quita a JavaScript» las cuestiones que más me gustan. En fin, más allá de esta cuestión de gustos, la sesión de Mariano estuvo muy bien (al menos la parte que escuché). La siguiente sesión fue muy útil e interesante: Kevin Pilch habló sobre el futuro de C#. Mi evaluación de los futuros cambios de C# tiene resultado «neutro» en el sentido que la mitad de las cosas me gustaron mucho mientras que la otra mitad me parecieron «aterradoras».

En el siguiente bloque estuve «saltando» de una sala a otra y la verdad no puedo opinar sobre las sesiones.

Ya en el último turno estuve en la sesión de Azure Stream Analytics de Leo Micheloni. Me gustó mucho que además de explicar el producto, Leo compartió varias recomendaciones consecuencia de su experiencia real con el producto.

Y así se fue el día 2.

NetConfUY 2016, día 1

NetConfUY 2016, día 1

El primer día de la conferencia estuvo dedicado por completo a workshops, dos tracks en paralelo, con sesiones de 2 horas para poner manos en la masa. Dado que las sesiones tenían un cupo de 40 asistentes la cantidad total de gente de este primer día estuvo acotada. Resumo brevemente las sesiones a las que yo asistí.

La primera sesión fue Prototipado de aplicaciones Moviles con Xamarin Forms y estuvo a cargo de Sorey García. Este es uno de los temas con los que me sentía en deuda y por ello decidí asistir. El contenido no fue muy profundo pero para mi que estaba totalmente en cero, me vino de muy bien. Con lo que vi creo que ya tengo una idea suficientemente para imaginar los casos específicos en los que Xamarin podría resultar la opción apropiada.

Mi segunda sesión del día fue IoT para principiantes: Mis primeros pasos con Arduino y fue facilitada por Leo Micheloni. Este es otro de los temas que tenía pendiente hace muchísimo tiempo. La sesión estuvo excelente, los asistentes nos repartimos en varias mesas (entre 4 y 6 por mesa) y Leo nos repartió un kit de Arduino y unos pendrives con el SDK para instalar. Inicialmente hizo una explicación general y luego pusimos manos a la obra armando distintas configuraciones sobre la plaqueta y programando distintas «lógicas» usando: leds, pulsadores, sensores de proximidad, etc, etc. El modelo de programación y «ensamble» de Arduino es realmente muy simple.

Las sesiones 3 y 4 fueron como «hermanas»: primero Asp.Net & ReactJS y luego Asp.Net Core & Angular 2. Estas sesiones estuvieron a cargo de Mariano Vazquez y Nico Bello respectivamente (dos miembros de la familia FIUBA, ¡que chico parece el mundo a veces!).  Desde el punto de vista del contenido y la dinámica, ambas sesiones estuvieron muy bien.

Ya cerrando el día participé de la sesión de MauroG y RodolfoF sobre Asp.Net Core en Linux. La sesión estuvo bien pues el ejemplo sobre el que se trabajó cubrió la un caso web típico de punta a punta: UI-Controllers-Models-DB.

Al finalizar la última sesión, ya eran más de las 21, ¡upa! vaya que fue un día intenso y aún quedan dos días más  😉

Semana de NetConfUY y otros en Uruguay

Esta semana estaré en Uruguay con motivo de la NetConfUY, el evento de tecnología .Net más importante de la región. La agenda pinta muy interesante, va desde: .Net Core, a IoT pasando por contenedores, la nube, big data y Xamarin. Me llevé una agradable sorpresa al ver entre los oradores a varios ex-compañeros de trabajo como Nico Bello, Mariano Vazquez y Edu Mangnarelli y algunos otros viejos conocidos del medio local como Leo Micheloni y Diego Gonzalez.

Aprovechando el viaje voy a realizar algunas otras actividades: por un lado voy a dictar mi Taller de Prácticas DevOps junto con mi amigo @PabloLis y voy estar hablando sobre Continuous Delivery a gran escala en el Meet up de AgilesUY.

meetup_uy

Oportunidad laboral para programadores .Net

El proyecto en el que estoy trabajando viene bien. Nuestro cliente está contento y tiene una gran proyección de negocio, por ello ha decido expandir el equipo. Es por ello que estamos buscando Desarrolladores con experiencia en .NET.

El contexto del proyecto es:

  • Dinámica de trabajo XP-like
    • iteraciones cortas
    • tdd
    • integración continua
    • deploy frecuente y automatizado
    • alto involucramiento del cliente
    • test automatizados
  • Stack .Net 4.5
    • WebApi
    • NHibernate
    • Fluent Migrator
    • Log4Net
    • Swagger
  • Herramientas de soporte
    • Git
    • Jenkins
    • NuGet
    • Nexus
    • MSBuild
    • Jira

Más detalles en privado. Interesados contactarme.

Configuring Jenkins Authentication with Auth0

The procedure described here is based on Jenkins 2.7.4 but I think it should also work with other (not so distant) versions.

First of all, log into your Auth0 account.

Then create a new client applicationClients» item in left-hand menu).

auth0_1

In  the «Create Client» dialog set the name of your client application (for example «MyJenkins«) and choose the application type «Regular Web Applications«, finally click «Create«.

auth0_2

Once the application is created, go to «Settings» and set the value of the «Allowed Callback URLs» to «http://YOUR_JENKINS_URL/securityRealm/finishLogin«. Click «Save Changes«.

auth0_4

Scroll down to the «Advanced Settings» section, click on «Endpoints«. Take the SAML Metadata URL and save the content in that URL into a file (remember this file because we will use it later when configuring Jenkins).

auth0_9

Go to the «Addons» tab and enable «SAML2» option.

auth0_5

In the Addon configuration dialog edit the settings to set the «audience» and «recipient» values to «http://%5BYOUR_JENKINS_URL%5D/securityRealm/finishLogin«.

auth0_6

Click «Save» and close de dialog. Now you should see the SAML2 option is enabled.

auth0_7

 

That’s all on Auth0 size, now let’s work on Jenkins.

To perform the following steps, you need to be logged in with a user with administrator profile. I assume the reader is already familiar with Jenkins so the instructions won’t be so detailed.

First of all we need to install the «SAML Plugin«.

auth0_8

Once the installation is ready go to «Manage Jenkins > Configure Global Security«. In the «Security Realm» pick «SAML 2.0» and in the «IdP Metadata» box paste the content of metadata file you saved on before.

Scroll down to the «Authorization» section and ensure the option «Logged-in users can do anything» is selected (authorization  is something we will work on later). Scroll down to the bottom of the page and click «Save«.

That’s all.  Close the browser [*] and the next time you try to log in you will be redirected to Auth0. Now every user enabled in your Auth0 account will be able to log into Jenkins.

In the next article I will explain how to configure authorization.

[*] at the moment of this writing there is bug in the SAML plugin that affect a logout feature https://issues.jenkins-ci.org/browse/JENKINS-37311.