Jon Arild leverer kontinuerlig med ConDep [Luke 11, 2012]


tirsdag 11. desember 2012 Julekalender DevOps

Jeg ble kjent med Jon Arild Tørresdal i første klasse på barneskolen. Siden det har vi mer eller mindre holdt sammen – vi har til og med jobbet sammen to ganger, først i New Technology Consulting og deretter i CMA Contiki. Jon Arild har alltid vært en sånn fyr som bare fikser ting, og det er en god egenskap. Han løftet NNUG Bergen til nye høyder for noen år tilbake, og nå er han akkurat ferdig med en periode som landsfader for NNUG nasjonalt.

MeWithHat2_lowres

Hvem er du?
Utvikler fra Haugesund med den spede start på gutterommet sammen med Torbjørn, Sharp MZ-700, Amiga 500, Basic, Amos, Cola og Chips :-)

Hva er jobben din?
IT-Arkitekt i Frende Forsikring

Hva kan du?
I tillegg til utvikling – en over norm interesse for OS, nettverk, infrastruktur og automatisering/deployment av disse.

Hva liker du best med yrket ditt?
Variasjon og fleksibilitet – digger å ta tak i ting som ikke er optimalt


ConDep (kort for Continuous Deployment) er en open source DSL (Domene Spesifikt Språk) i C#, som jeg har utviklet pga. lite smidighet rundt automatisering av programvarepublisering i Windows. Hovedfokuset mitt har vært publisering av webapplikasjoner og tilhørende infrastruktur på Windows Servere, men er ikke begrenset til dette.

ConDep er i skrivende stund noen få dager unna RTM, men har vært i pre-release og tilgjengelig på NuGet siden september. I Frende hvor jeg jobber har ConDep vært brukt i nesten 1 år for å publisere våre applikasjoner internt og til produksjon.

I denne artikkelen vil jeg gi en kort introduksjon til bruk av ConDep med et praktisk eksempel. Koden er basert på den nye versjonen som blir tilgjengelig de nærmeste dagene.

Enkelt eksempel – Publisere en web applikasjon til 4 servere uten nedetid

Koden (SomeWebApplication.cs):

using ConDep.Dsl;
using ConDep.Dsl.Builders;
using ConDep.Dsl.Config;

namespace MyDeployment
{
  public class SomeWebApplication : 
    ApplicationArtifact, 
    IDependOnInfrastructure<MyServerInfrastructure>
  {
    public override void Configure(IOfferLocalOperations local, ConDepConfig config)
    {
      local.ToEachServer(server =>
      {
        server.Deploy
          .Directory(@"C:\SomeWebApp", @"E:\WebApps\SomeWebApp");
      });
    }
  }

  public class MyServerInfrastructure : InfrastructureArtifact
  {
    protected override void Configure(IOfferInfrastructure require)
    {
      require.IIS();
      require.MSMQ();
    }
  }
}

C# koden over kan leses som følger:

Klassen SomeWebApplication arver fra ApplicationArtifact og er avhengig av infrastrukturen som definert i MyServerInfrastructure. Denne infrastrukturen er IIS og MSMQ. Videre konfigureres ConDep fra lokal maskin til å kopiere folderen C:\SomeWebApp til alle servere som er konfigurert(se under).

Konfigurasjonen (prod.env.json):

{
  "LoadBalancer": 
  {
    "Name": "jat-nlb01",
    "Provider": "ConDep.Dsl.LoadBalancer.Ace"
  },
  "Servers" :
  [
    {
      "Name" : "jat-web01"
    },
    {
      "Name" : "jat-web02"
    },
    {
      "Name" : "jat-web03"
    },
    {
      "Name" : "jat-web04"
    }
  ]
}

Kommandolinjen:

ConDep.exe MyDeployment.dll Prod

ConDep.exe kommandoen over gjør følgende:

  1. Finner dll’en MyDeployment.dll på disk (det er i denne dll’en C# koden ligger)
  2. Finner konfigurasjonen for Prod (json filen – prod.env.json)
  3. Går til lastbalansereren definert i json-konfigurasjonen og tar den første serveren (jat-web01) offline fra klusteret
  4. Sørger for at riktig infrastruktur finnes på server (jat-web01):
    1. Sjekker at IIS er installert, hvis ikke installeres IIS
    2. Sjekker at MSMQ er installert, hvis ikke installeres MSMQ
  5. Kopierer C:\SomeWebApp til jat-web01 under E:\WebApps\SomeWebApp
  6. Tar jat-web01 online igjen i lastbalanserer
  7. Repeterer steg 3-6 for resterende servere som definert i prod.env.json

Generelt om ConDep

Under panseret bruker ConDep Microsoft WebDeploy for sikkert og smidig kunne kopiere filer og utføre andre operasjoner mellom “klient” og server over http. Dette gjør bl.a. at du slipper å slite med brannmurproblemer o.l.

Alle operasjoner i ConDep er “idempotent”  – dvs. uansett hvor mange ganger du kjører en operasjon, vil du få samme resultat. Dette betyr også at ConDep kun endrer konfigurasjon og innhold dersom de har blitt endret eller ikke eksiterer.

Om du vil at ConDep skal kjøre mot flere miljøer, er det bare å konfigurere opp dette i nye json filer. Mange har f.eks. et test, preprod og prod miljø, som da legges i tre json filer: test.env.json, preprod.env.json og prod.env.json. Sender du inn Test til ConDep.exe er det konfigurasjonen for testmiljøet som vil være gjeldende.

I eksempelet over brukes en provider for lastbalansering mot Cisco ACE, men ConDep har også andre mekanismer for å unngå nedetid under publisering, men som blir utenfor området til denne artikkelen.

www.con-dep.net er det litt mer informasjon om hva ConDep kan gjøre, og mye mer vil dukke om de nærmeste dagene og ukene.

Konklusjon

Tanken bak ConDep er at du skal kunne starte med en helt ren installasjon av en Windows Server, kjøre ConDep mot den, og applikasjonene dine skal bare fungere. Ved å beskrive til ConDep hva som trengs for at applikasjonene dine skal kunne kjøre på en server, samt hvordan ConDep skal flytte applikasjoner fra utviklingsmiljøet ditt (f.eks. en CI server), har du en fullautomatisert prosess som gir deg mye fleksibilitet. Integrert med en CI server gir ConDep deg det du trenger for å implementere Continous Deployment eller Continuous Delivery om du vil.


comments powered by Disqus