Bild:
Hej alla! Vi Àr automationsingenjörer frÄn företaget och vi stödjer utvecklingen av företagets produkter: vi stödjer hela monteringspipelinen frÄn att utvecklare utför en kodrad till publicering av fÀrdiga produkter och licenser pÄ uppdateringsservrar. Informellt kallas vi DevOps-ingenjörer. I den hÀr artikeln vill vi prata om de tekniska stadierna i mjukvaruproduktionsprocessen, hur vi ser dem och hur vi klassificerar dem.
FrÄn materialet kommer du att lÀra dig om komplexiteten i att koordinera multiproduktutveckling, om vad en teknisk karta Àr och hur den hjÀlper till att effektivisera och replikera lösningar, vilka Àr de viktigaste stegen och stegen i utvecklingsprocessen, hur Àr ansvarsomrÄdena mellan DevOps och team i vÄrt företag.
Om Chaos och DevOps
Kortfattat inkluderar konceptet DevOps utvecklingsverktyg och tjÀnster, sÄvÀl som metoder och bÀsta praxis för deras anvÀndning. LÄt oss peka ut det globala mÄl frÄn implementeringen av DevOps-idéer i vÄrt företag: detta Àr en konsekvent minskning av kostnaden för produktion och underhÄll av produkter i kvantitativa termer (mantimmar eller maskintimmar, CPU, RAM, disk, etc.). Det enklaste och mest uppenbara sÀttet att minska den totala kostnaden för utveckling pÄ hela företagets nivÄ Àr minimera kostnaden för att utföra typiska serieuppgifter i alla produktionsled. Men vilka Àr dessa stadier, hur skiljer man dem frÄn den allmÀnna processen, vilka steg bestÄr de av?
NÀr ett företag utvecklar en produkt Àr allt mer eller mindre klart: det finns vanligtvis en gemensam fÀrdplan och utvecklingsschema. Men vad ska man göra nÀr produktsortimentet utökas och det finns fler produkter? Vid första anblicken har de liknande processer och monteringslinjer, och spelet "hitta X skillnader" i loggar och skript börjar. Men vad hÀnder om det redan finns 5+ projekt i aktiv utveckling och det krÀvs stöd för flera versioner utvecklade under flera Är? Vill vi ÄteranvÀnda sÄ mÄnga lösningar som möjligt i produktpipelines eller Àr vi redo att spendera pengar pÄ en unik utveckling för var och en?
Hur hittar man en balans mellan unikhet och serielösningar?
Dessa frÄgor började dyka upp framför oss allt oftare sedan 2015. Antalet produkter vÀxte och vi försökte utöka vÄr automationsavdelning (DevOps), som stödde monteringslinjerna för dessa produkter, till ett minimum. Samtidigt ville vi replikera sÄ mÄnga lösningar som möjligt mellan produkter. NÀr allt kommer omkring, varför göra samma sak i tio produkter pÄ olika sÀtt?
Utvecklingsdirektör: "Killar, kan vi pÄ nÄgot sÀtt utvÀrdera vad DevOps gör för produkter?"
Vi: "Vi vet inte, vi stÀllde inte en sÄdan frÄga, men vilka indikatorer bör övervÀgas?"
Utvecklingsdirektör: "Vem vet! TrorâŠ"
Som i den dÀr berömda filmen: "I'm in a hotel! .." - "Eh ... Kan du visa mig vÀgen?" Vid nÀrmare eftertanke kom vi fram till att vi först mÄste besluta om produkternas sluttillstÄnd; detta blev vÄrt första mÄl.
SÄ, hur analyserar du ett dussin produkter med ganska stora team frÄn 10 till 200 personer och bestÀmmer mÀtbara mÀtvÀrden nÀr du replikerar lösningar?
1:0 till förmÄn för Chaos, eller DevOps pÄ skulderbladen
Vi började med ett försök att tillÀmpa IDEF0-diagram och olika affÀrsprocessdiagram frÄn BPwin-serien. Förvirringen började efter den femte rutan i nÀsta steg i nÀsta projekt, och dessa rutor för varje projekt kan ritas i svansen av en lÄng pyton under 50+ steg. Jag kÀnde mig ledsen och ville yla mot mÄnen - det passade inte i allmÀnhet.
Typiska produktionsuppgifter
Att modellera produktionsprocesser Àr ett mycket komplext och mödosamt jobb: du behöver samla in, bearbeta och analysera mycket data frÄn olika avdelningar och produktionskedjor. Du kan lÀsa mer om detta i artikeln "".
NÀr vi började modellera vÄr produktionsprocess hade vi ett specifikt mÄl - att förmedla till alla anstÀllda som Àr involverade i utvecklingen av vÄrt företags produkter och till projektledare:
- hur produkter och deras komponenter, utgÄende frÄn en kodrad, nÄr kunden i form av installatörer och uppdateringar,
- vilka resurser som tillhandahÄlls för varje steg i produktionen av produkter,
- vilka tjÀnster Àr involverade i varje steg,
- hur ansvarsomrÄdena för varje steg Àr avgrÀnsade,
- vilka kontrakt som finns vid ingÄngen och utgÄngen av varje etapp.
Genom att klicka pÄ bilden öppnas den i full storlek
VÄrt arbete i företaget Àr uppdelat i flera funktionsomrÄden. Infrastrukturens riktning Àr engagerad i optimeringen av driften av alla "jÀrn"-resurser pÄ avdelningen, sÄvÀl som automatisering av utplaceringen av virtuella maskiner och miljön pÄ dem. Riktningen för övervakningen ger 24/7 serviceprestandakontroll; vi tillhandahÄller Àven övervakning som en tjÀnst för utvecklare. Arbetsflödesriktningen förser team med verktyg för att hantera utvecklings- och testprocesser, analysera kodens tillstÄnd och fÄ analyser av projekt. Och slutligen tillhandahÄller webdev-riktningen publicering av utgÄvor pÄ GUS- och FLUS-uppdateringsservrarna, sÄvÀl som licensiering av produkter som anvÀnder LicenseLab-tjÀnsten. För att stödja produktionspipelinen stÀller vi upp och underhÄller mÄnga olika supporttjÀnster för utvecklare (du kan lyssna pÄ berÀttelser om nÄgra av dem pÄ gamla möten: О). Vi utvecklar Àven interna automationsverktyg, bl.a .
Under de senaste fem Ären har vÄrt arbete samlat pÄ sig mycket av samma typ och rutinverksamhet och vÄra utvecklare frÄn andra avdelningar kommer frÀmst frÄn s.k. typiska uppgifter, vars lösning Àr helt eller delvis automatiserad, orsakar inte svÄrigheter för utförare och krÀver inte betydande mÀngder arbete. Tillsammans med de ledande omrÄdena analyserade vi sÄdana uppgifter och kunde identifiera enskilda arbetskategorier, eller produktionssteg, stadierna var indelade i odelbara steg, och flera stadier lÀggs ihop produktionsprocesskedja.

Det enklaste exemplet pÄ en teknisk kedja Àr stegen för montering, driftsÀttning och testning av var och en av vÄra produkter inom företaget. I sin tur, till exempel, bestÄr byggstadiet av mÄnga separata typiska steg: ladda ner kÀllor frÄn GitLab, förbereda beroenden och tredjepartsbibliotek, enhetstestning och statisk kodanalys, exekvera ett byggskript pÄ GitLab CI, publicera artefakter i förvaret pÄ Artifactory och generering av release notes genom vÄrt interna ChangelogBuilder-verktyg.
Du kan lÀsa om typiska DevOps-uppgifter i vÄra andra artiklar om Habré: ""Och"".
MÄnga typiska produktionskedjor bildas tillverkningsprocess. Standardmetoden för att beskriva processer Àr att anvÀnda funktionella IDEF0-modeller.
Ett exempel pÄ modellering av en CI-tillverkningsprocess
Vi Àgnade sÀrskild uppmÀrksamhet Ät utvecklingen av standardprojekt för ett kontinuerligt integrationssystem. Detta gjorde det möjligt att uppnÄ enande av projekt, vilket belyser den sÄ kallade slÀpp byggsystem med kampanjer.

SÄ hÀr fungerar det. Alla projekt ser typiska ut: de inkluderar konfigurationen av sammansÀttningar som faller in i ögonblicksbildförvaret pÄ Artifactory, varefter de distribueras och testas pÄ testbÀnkar och sedan flyttas upp till releaseförvaret. Artifactory-tjÀnsten Àr en enda distributionspunkt för alla byggartefakter mellan team och andra tjÀnster.
Om vi ââavsevĂ€rt förenklar och generaliserar vĂ„rt releaseschema inkluderar det följande steg:
- plattformsoberoende produktmontering,
- utplacering för att testa bÀnkar,
- köra funktionella och andra tester,
- frÀmja testade konstruktioner för att slÀppa arkiv pÄ Artifactory,
- publicering av utgÄvor pÄ uppdateringsservrar,
- leverans av sammansÀttningar och uppdateringar till produktion,
- lansering av installation och uppdatering av produkten.
TÀnk till exempel pÄ den tekniska modellen för detta typiska releaseschema (nedan helt enkelt modell) i form av en funktionell IDEF0-modell. Det Äterspeglar huvudstadierna i vÄr CI-process. IDEF0-modeller anvÀnder den sk ICOM-notation (Input-Control-Output-Mechanism) för att beskriva vilka resurser som anvÀnds i varje steg, baserat pÄ vilka regler och kravarbete som utförs, vad som Àr resultatet och vilka mekanismer, tjÀnster eller personer som implementerar ett visst steg.
Genom att klicka pÄ bilden öppnas den i full storlek
Som regel Àr det lÀttare att dekomponera och detaljera beskrivningen av processer i funktionella modeller. Men i takt med att antalet element vÀxer blir det svÄrare och svÄrare att förstÄ nÄgot i dem. Men i verklig utveckling finns det ocksÄ hjÀlpsteg: övervakning, produktcertifiering, automatisering av arbetsflöden och andra. Det Àr pÄ grund av skalningsproblemet som vi övergav den hÀr beskrivningen.
Hoppets födelse
I en bok stötte vi pÄ gamla sovjetiska kartor som beskriver tekniska processer (som för övrigt fortfarande anvÀnds idag pÄ mÄnga statligt Àgda företag och universitet). VÀnta, vÀnta, för vi har ocksÄ ett arbetsflöde!.. Det finns stadier, resultat, mÄtt, krav, indikatorer och sÄ vidare och sÄ vidare... Varför inte försöka tillÀmpa flödesscheman pÄ vÄra produktpipelines ocksÄ? Det fanns en kÀnsla: "Det hÀr Àr det! Vi har hittat rÀtt trÄd, det Àr dags att dra den ordentligt!
I en enkel tabell bestÀmde vi oss för att registrera produkter efter kolumner, och tekniska stadier och produktpipeline steg för rader. Milstolpar Àr nÄgot stort, till exempel ett produktbyggande steg. Och steg Àr nÄgot mindre och mer detaljerat, som steget att ladda ner kÀllkoden till byggservern eller steget att kompilera koden.
I skÀrningspunkterna mellan raderna och kolumnerna pÄ kartan lÀgger vi ner status för en specifik etapp och produkt. För statusar definierades en uppsÀttning tillstÄnd:
- Ingen information - eller olÀmpligt. Det Àr nödvÀndigt att analysera efterfrÄgan pÄ ett stadium i produkten. Antingen har analysen redan genomförts, men stadiet behövs för nÀrvarande inte eller Àr inte ekonomiskt motiverat.
- Uppskjuten - eller inte relevant för tillfÀllet. Det behövs ett skede i pipelinen, men det finns inga krafter för genomförandet i Är.
- Planerad. Etappen Àr planerad att genomföras i Är.
- Genomfört. Stadiet i pipelinen implementeras i den erforderliga volymen.
Att fylla i tabellen började projekt för projekt. Först klassificerades stadierna och stegen i ett projekt och deras status registrerades. Sedan tog de nÀsta projekt, fixade statusen i det och lade till de stadier och steg som saknades i tidigare projekt. Som ett resultat fick vi stadierna och stegen i hela vÄr produktionspipeline och deras status i ett specifikt projekt. Det visade sig nÄgot liknande produktpipeline-kompetensmatrisen. Vi kallade en sÄdan matris för en teknisk karta.
Med hjÀlp av den tekniska kartan samordnar vi mÀttekniskt rimligt med teamen de arbetsplaner för Äret och de mÄl som vi tillsammans vill uppnÄ: vilka etapper vi lÀgger till projektet i Är, och vilka vi lÀmnar för senare. Under arbetets gÄng kan vi ocksÄ ha förbÀttringar i de stadier som vi har genomfört för endast en produkt. Sedan utökar vi vÄr karta och introducerar denna förbÀttring som ett steg eller ett nytt steg, sedan analyserar vi för varje produkt och tar reda pÄ möjligheten att replikera förbÀttringen.
De kan invÀnda mot oss: "Detta Àr naturligtvis bra, bara med tiden kommer antalet steg och etapper att bli oöverkomligt stort. Hur man Àr?
Vi har infört standardiserade och ganska fullstÀndiga beskrivningar av kraven för varje steg och steg, sÄ att de förstÄs av alla inom företaget pÄ samma sÀtt. Med tiden, nÀr förbÀttringar införs, kan ett steg tas upp i ett annat steg eller steg, och sedan kommer de att "kollaps". Samtidigt passar alla krav och tekniska nyanser in i kraven för generaliseringsstadiet eller steget.
Hur utvÀrderar man effekten av att replikera lösningar? Vi anvÀnder ett extremt enkelt tillvÀgagÄngssÀtt: vi tillskriver de initiala kapitalkostnaderna för implementeringen av ett nytt steg till Ärliga allmÀnna produktkostnader och dividerar sedan med alla vid replikering.
Delar av utvecklingen visas redan som milstolpar och steg pÄ kartan. Vi kan pÄverka minskningen av kostnaden för produkten genom införandet av automatisering för typiska steg. Efter det övervÀger vi förÀndringarna i kvalitativa egenskaper, kvantitativa mÄtt och vinsten som teamen fÄtt (i mantimmar eller maskintimmar av besparingar).
Teknologisk karta över produktionsprocessen
Om vi ââtar alla vĂ„ra steg och steg, kodar dem med taggar och utökar dem till en kedja, kommer det att visa sig vara vĂ€ldigt lĂ„ngt och obegripligt (bara sjĂ€lva "pytonsvansen" som vi pratade om i början av artikeln) :
[Production] â [InfMonitoring] â [SourceCodeControl] â [Prepare] â [PrepareLinuxDocker] â [PrepareWinDocker] â [Build] â [PullSourceCode] â [PrepareDep] â [UnitTest] â [CodeCoverage] â [StaticAnalyze] â [BuildScenario] â [PushToSnapshot] â [ChangelogBuilder] â [Deploy] â [PrepareTestStand] â [PullTestCode] â [PrepareTestEnv] â [PullArtifact] â [DeployArtifact] â [Test] â [BVTTest] â [SmokeTest] â [FuncTest] â [LoadTest] â [IntegrityTest] â [DeliveryTest] â [MonitoringStands] â [TestManagement] â [Promote] â [QualityTag] â [MoveToRelease] â [License] â [Publish] â [PublishGUSFLUS] â [ControlVisibility] â [Install] â [LicenseActivation] â [RequestUpdates] â [PullUpdates] â [InitUpdates] â [PrepareEnv] â [InstallUpdates] â [Telemetry] â [Workflow] â [Communication] â [Certification] â [CISelfSufficiency]Det hĂ€r Ă€r stadierna för att bygga produkter [Build], distribuera dem för att testa servrar [Deploy], testa [Test], frĂ€mja byggen för att slĂ€ppa arkiv baserat pĂ„ resultaten av testning [Promote], generera och publicera licenser [License], publicering [ Publicera] pĂ„ GUS uppdateringsserver och leverans till FLUS uppdateringsservrar, installation och uppdatering av produktkomponenter pĂ„ kundens infrastruktur med hjĂ€lp av Product Configuration Management [Install], samt insamling av telemetri [Telemetri] frĂ„n installerade produkter.
Utöver dem kan separata stadier urskiljas: övervakning av infrastrukturtillstÄnd [InfMonitoring], versionering av kÀllkod [SourceCodeControl], förberedelse av byggmiljön [Förbereda], projektledning [Arbetsflöde], förse team med kommunikationsverktyg [Kommunikation], produktcertifiering [ Certifiering] och sÀkerstÀlla sjÀlvförsörjning av CI-processer [CISelfSufficiency] (till exempel oberoende av sammansÀttningar frÄn Internet). Dussintals steg i vÄra processer kommer inte ens att beaktas, eftersom de Àr mycket specifika.
Det blir mycket lÀttare att förstÄ och se hela produktionsprocessen om den presenteras i formulÀret teknisk karta; detta Àr en tabell dÀr de individuella produktionsstegen och nedbrutna stegen i modellen skrivs i rader och i kolumner en beskrivning av vad som görs i varje steg eller steg. Huvudvikten lÀggs pÄ de resurser som ger varje led, och avgrÀnsningen av ansvarsomrÄden.
Kartan för oss Àr en sorts klassificerare. Det speglar de stora tekniska delarna av produktionen av produkter. Tack vare det blev det enklare för vÄrt automationsteam att interagera med utvecklare och gemensamt planera implementeringen av automatiseringsstadier, samt förstÄ vilka arbetskostnader och resurser (mÀnniska och hÄrdvara) som kommer att krÀvas för detta.
Inom vÄrt företag genereras kartan automatiskt frÄn jinja-mallen som en vanlig HTML-fil, och laddas sedan upp till GitLab Pages-servern. En skÀrmdump med ett exempel pÄ en fullt genererad karta kan ses .
Genom att klicka pÄ bilden öppnas den i full storlek
Kort sagt Àr den tekniska kartan en generaliserad bild av produktionsprocessen, som Äterspeglar tydligt klassificerade block med typisk funktionalitet.
Strukturen pÄ vÄr fÀrdplan
Kartan bestÄr av flera delar:
- TitelomrÄde - hÀr Àr en allmÀn beskrivning av kartan, grundlÀggande begrepp introduceras, de viktigaste resurserna och resultaten av produktionsprocessen definieras.
- Dashboard - hÀr kan du styra visningen av data för enskilda produkter, en sammanfattning av de implementerade stegen och stegen i allmÀnhet för alla produkter tillhandahÄlls.
- Teknologisk karta - en tabellformig beskrivning av den tekniska processen. PĂ„ kartan:
- alla steg, steg och deras koder anges;
- korta och fullstÀndiga beskrivningar av stadierna ges;
- de inmatningsresurser och tjÀnster som anvÀnds i varje steg anges;
- resultaten av varje steg och ett separat steg anges;
- ansvarsomrÄdet för varje steg och steg anges;
- de tekniska resurserna, sÄsom HDD (SSD), RAM, vCPU och de mantimmar som krÀvs för att stödja arbetet i detta skede, bÄde för nÀrvarande - ett faktum och i framtiden - en plan, har faststÀllts;
- för varje produkt anges vilka tekniska steg eller steg för den som har implementerats, planerat för implementering, irrelevanta eller inte implementerade.
Beslutsfattande baserat pÄ den tekniska kartan
Efter att ha undersökt kartan Àr det möjligt att vidta nÄgra ÄtgÀrder - beroende pÄ vilken roll medarbetaren har i företaget (utvecklingschef, produktchef, utvecklare eller testare):
- förstÄ vilka stadier som saknas i en verklig produkt eller projekt, och bedöma behovet av deras genomförande;
- avgrÀnsa ansvarsomrÄdena mellan flera avdelningar om de arbetar pÄ olika etapper;
- komma överens om kontrakt vid scenernas in- och utgÄngar;
- integrera ditt arbetsstadium i den övergripande utvecklingsprocessen;
- mer exakt bedöma behovet av resurser som tillhandahÄller vart och ett av stegen.
Sammanfattar allt ovanstÄende
Rutten Àr mÄngsidig, utdragbar och lÀtt att underhÄlla. Det Àr mycket lÀttare att utveckla och underhÄlla en beskrivning av processer i denna form Àn i en strikt akademisk IDEF0-modell. Dessutom Àr en tabellbeskrivning enklare, mer bekant och bÀttre strukturerad Àn en funktionell modell.
För den tekniska implementeringen av stegen har vi ett speciellt internt verktyg CrossBuilder â ett lagerverktyg mellan CI-system, tjĂ€nster och infrastruktur. Utvecklaren behöver inte klippa sin cykel: i vĂ„rt CI-system rĂ€cker det att köra ett av skripten (den sĂ„ kallade uppgiften) i CrossBuilder-verktyget, som kommer att utföra det korrekt, med hĂ€nsyn till funktionerna i vĂ„r infrastruktur .
Resultat av
Artikeln visade sig vara ganska lÄng, men detta Àr oundvikligt nÀr man beskriver modelleringen av komplexa processer. Till sist skulle jag vilja fixa vÄra huvudidéer kort:
- MÄlet med att implementera DevOps-idéer i vÄrt företag Àr att konsekvent minska kostnaderna för produktion och underhÄll av företagets produkter i kvantitativa termer (mantimmar eller maskintimmar, vCPU, RAM, Disk).
- SÀttet att minska den totala kostnaden för utveckling Àr att minimera kostnaderna för att utföra typiska serieuppgifter: stadier och steg i den tekniska processen.
- En typisk uppgift Àr en uppgift vars lösning Àr helt eller delvis automatiserad, inte orsakar svÄrigheter för utförare och inte krÀver betydande arbetskostnader.
- Produktionsprocessen bestÄr av steg, stegen Àr indelade i odelbara steg, som Àr typiska uppgifter av olika skala och omfattning.
- FrÄn olika typiska uppgifter har vi kommit till komplexa tekniska kedjor och flernivÄmodeller av produktionsprocessen, som kan beskrivas med en funktionell IDEF0-modell eller en enklare teknisk karta.
- Den tekniska kartan Àr en tabellformig representation av stadierna och stegen i produktionsprocessen. Det viktigaste: kartan lÄter dig se hela processen i sin helhet, i stora bitar med möjlighet att detaljera dem.
- Baserat pÄ den tekniska kartan Àr det möjligt att bedöma behovet av att införa stadier i en viss produkt, avgrÀnsa ansvarsomrÄden, komma överens om kontrakt vid ingÄngarna och utgÄngarna av stegen och mer exakt bedöma behovet av resurser.
I de följande artiklarna kommer vi att beskriva mer i detalj vilka tekniska verktyg som anvÀnds för att implementera vissa tekniska stadier pÄ vÄr karta.
Artikelförfattare:
- â Chef för Automation (DevOps) pĂ„ Positive Technologies
- - Suppleant Chef för automationsavdelningen (DevOps) pÄ Positive Technologies
KĂ€lla: will.com
