Żviluppajna DevOps bl-aħjar mod li stajna. Konna 8 minna, u Vasya kien l-aktar wieħed cool. WindowsF'daqqa waħda Vasya telaq, u jien kelli l-kompitu li nniedi proġett ġdid li jipprovdi Windows-żvilupp. Meta tefgħet il-munzell kollu fuq il-mejda Windows-разработки, то понял, что ситуация — боль…
Hekk tibda l-istorja Alexandra Sinchinova fuq . Когда из компании ушел ведущий специалист по Windows, Alexander ħaseb x'għandu jagħmel issa. Mur fuq Linux, конечно же! Александр расскажет, как ему удалось создать прецедент и перевести часть Windows разработки на Linux на примере реализованного проекта на 100 000 конечных пользователей.

Как легко и непринужденно доставлять проект в RPM, используя TFS, Puppet, Linux .NET core? Как поддерживать версионирование БД проекта, если разработка впервые слышит слова Postgres и Flyway, а дедлайн послезавтра? Как интегрировать с Docker? Как мотивировать .NET-разработчиков отказаться от Windows и смузи в пользу Puppet и Linux? Как решать идеологические конфликты, если обслуживать Windows в продакшн нет ни сил, ни желания, ни ресурсов? Об этом, а также о Web Deploy, тестировании, CI, о практиках использования TFS в существующих проектах, и, конечно, о сломанных костылях и работающих решениях, в расшифровке доклада Александра.

Итак, Вася ушел, задача на мне, девелоперы ждут с вилами с нетерпением. Когда я окончательно осознал, что Васю не вернуть — приступил к делу. Для начала оценил процент Win VM в нашем парке. Счёт был не в пользу Windows.

Так как мы активно развиваем DevOps, я понял, что нужно что-то менять в подходе выноса нового приложения. Решение было одно — по возможности перевести все на Linux. Google мне помог — на тот момент уже был портирован .Net под Linux, и я понял, что это решение!
Почему .NET core в связке с Linux?
На это было несколько причин. Между «платить деньги» и «не платить» большинство выберет второе — как и я. Лицензия на MSDB стоит около 1 000 $, обслуживание парка виртуальных машин Windows исчисляется сотнями долларов. Для большой компании это большие затраты. Поэтому tfaddil - l-ewwel raġuni. Mhux l-aktar importanti, iżda wieħed minn dawk sinifikanti.
Magni virtwali Windows занимают больше ресурсов, чем их братья из Linux - huma tqal. Учитывая масштаб большой компании мы выбрали Linux.
Is-sistema hija sempliċement integrata fis-CI eżistenti. Мы считаем себя прогрессивными DevOps’ами, используем Bamboo, Jenkins и GitLab CI, поэтому большая часть у нас крутится на Linux.
L-aħħar raġuni hija akkumpanjament konvenjenti. Нам нужно было снизить порог вхождения для «сопровожденцев» — ребят, которые понимают техническую часть, обеспечивают бесперебойность и обслуживают сервисы со второй линии. Они уже были знакомы со стеком Linux, поэтому им гораздо проще понять новый продукт, поддерживать и сопровождать, чем тратить дополнительные ресурсы, чтобы разобраться с аналогичным функционалом ПО для Windows pjattaformi.
Rekwiżiti
L-ewwel nett - konvenjenza tas-soluzzjoni l-ġdida għall-iżviluppaturi. Не все из них оказались готовы к переменам, особенно после произнесенного слова Linux. Разработчики хотят любимую Visual Studio, TFS c автотестами по сборкам и смузи. Как происходит доставка в продакшн — им не важно. Поэтому мы решили не менять привычный процесс и оставить для Windows-разработки всё без изменений.
Proġett ġdid meħtieġ jintegraw fis-CI eżistenti. Il-binarji kienu diġà hemm u x-xogħol kollu kellu jsir b'kont meħud tal-parametri tas-sistema ta 'ġestjoni tal-konfigurazzjoni, standards ta' konsenja aċċettati u sistemi ta 'monitoraġġ.
Faċilità ta 'appoġġ u tħaddim, bħala kundizzjoni għal-limitu minimu tad-dħul għall-parteċipanti ġodda kollha minn diviżjonijiet differenti u d-dipartiment ta 'appoġġ.
Skadenza - bieraħ.
Win Development Group
С чем тогда работала команда Windows?

Issa nista' ngħid hekk b'fiduċja IdentityServer4 hija alternattiva ħielsa friska għal ADFS b'kapaċitajiet simili, jew xiex Entity Framework Core - ġenna għal żviluppatur, fejn m'għandekx għalfejn tinkwieta tikteb skripts SQL, iżda tiddeskrivi mistoqsijiet fid-database f'termini OOP. Imma mbagħad, waqt id-diskussjoni tal-pjan ta 'azzjoni, ħarist lejn dan il-munzell bħallikieku kien cuneiform Sumerjan, għaraf biss PostgreSQL u Git.
Dak iż-żmien konna nużaw b'mod attiv Pupazz bħala sistema ta 'ġestjoni tal-konfigurazzjoni. Fil-biċċa l-kbira tal-proġetti tagħna użajna GitLab CI, Elastic, servizzi bbilanċjati ta 'tagħbija għolja bl-użu HAProxy immonitorjat kollox ma Zabbix, ligamenti grafana и Prometheus, Jaeger, u dan kollu kien qed idawwar fuq biċċiet tal-ħadid HP c ESXi fuq VMware. Kulħadd jafha - klassika tal-ġeneru.

Ejja nħarsu u nippruvaw nifhmu x’ġara qabel bdejna dawn l-interventi kollha.
X'ġara
TFS hija sistema pjuttost qawwija li mhux biss tagħti kodiċi mill-iżviluppatur sal-magna tal-produzzjoni finali, iżda għandha wkoll sett għal integrazzjoni flessibbli ħafna ma 'diversi servizzi - biex tipprovdi CI f'livell ta' cross-platform.

Раньше это были сплошные форточки. TFS использовал несколько Build-агентов, на которых собиралось множество проектов. В каждом агенте по 3-4 worker-a, чтобы распараллелить задачи и оптимизировать процесс. Дальше, согласно релизным планам, TFS доставлял свежеиспеченный Build на Windows-сервер приложений.
X’ridna niksbu?
Для доставки и разработки используем TFS, а запускаем приложение на Linux Application server, и между ними какая-то магия. Этот Kaxxa Magic u hemm il-melħ tax-xogħol quddiem. Qabel ma nneħħiha, nieħu pass fil-ġenb u ngħid ftit kliem dwar l-applikazzjoni.
Proġett
L-applikazzjoni tipprovdi funzjonalità għall-immaniġġjar ta 'kards imħallsa minn qabel.

klijent
Kien hemm żewġ tipi ta 'utenti. Ewwel kisbu aċċess billi illoggja billi tuża ċertifikat SSL SHA-2. U it-tieni kien hemm aċċess bl-użu ta 'login u password.
HAProxy
Imbagħad it-talba tal-klijent marret għand HAProxy, li solviet il-problemi li ġejjin:
- awtorizzazzjoni primarja;
- Terminazzjoni SSL;
- irfinar tat-talbiet HTTP;
- talbiet għal xandir.
Iċ-ċertifikat tal-klijent ġie vverifikat tul il-katina. Aħna - awtorità u nistgħu naffordjaw dan, peress li aħna stess noħorġu ċertifikati lill-klijenti tas-servizz.
Oqgħod attent għat-tielet punt, se nerġgħu lura għalih ftit aktar tard.
Backend
Бэкенд планировали сделать на Linux. Бэкенд взаимодействует с БД, подгружает необходимый список привилегий и потом, в зависимости от того, какими привилегиями обладает авторизовавшийся пользователь, предоставляет доступ для подписания финансовых документов и отправки их на исполнение, либо генерации какого-то отчета.
Iffrankar b'HAProxy
Minbarra ż-żewġ kuntesti li kull klijent innaviga, kien hemm ukoll kuntest ta 'identità. IdentityServer4 biss jippermettilek tidħol, dan huwa analogu b'xejn u qawwi għal ADFS - Servizzi tal-Federazzjoni tad-Direttorju Attiv.
It-talba għall-identità ġiet ipproċessata f'diversi passi. L-ewwel pass - klijent daħal fis-backend, li kkomunika ma' dan is-server u ċċekkja l-preżenza ta' token għall-klijent. Jekk ma nstabitx, it-talba ġiet ritornata lura għall-kuntest li minnu tkun ġiet, iżda b'redirect, u bir-redirect marret għall-identità.
It-tieni pass - it-talba waslet għall-paġna ta' awtorizzazzjoni f'IdentityServer, fejn il-klijent irreġistra, u dak it-token tant mistenni deher fid-database IdentityServer.
It-tielet pass - il-klijent ġie ridirett lura għall-kuntest li minnu ġie.

IdentityServer4 għandu karatteristika: jirritorna t-tweġiba għat-talba għar-ritorn permezz HTTP. Ma jimpurtax kemm tħabtu biex inwaqqfu s-server, irrispettivament minn kemm iddawwalna lilna nfusna bid-dokumentazzjoni, kull darba li rċevejna talba inizjali tal-klijent b'URL li wasal permezz ta 'HTTPS, u IdentityServer rritorna l-istess kuntest, iżda b'HTTP. Konna ixxukkjati! U ttrasferijna dan kollu permezz tal-kuntest tal-identità għal HAProxy, u fl-intestaturi kellna nimmodifikaw il-protokoll HTTP għal HTTPS.
X'inhu t-titjib u fejn iffrankajt?
Aħna ffrankajna l-flus billi użajna soluzzjoni b'xejn għall-awtorizzazzjoni ta 'grupp ta' utenti, riżorsi, peress li aħna ma poġġiex IdentityServer4 bħala node separat f'segment separat, iżda użajna flimkien mal-backend fuq l-istess server fejn jaħdem il-backend tal-applikazzjoni. .
Kif għandha taħdem
Итак, как я обещал — Magic Box. Мы уже понимаем, что гарантированно движемся в сторону Linux. Давайте сформулируем конкретные задачи, которые требовали решения.

Manifesti pupazzi. Biex iwasslu u jimmaniġġjaw is-servizz u l-konfigurazzjoni tal-applikazzjoni, kellhom jinkitbu riċetti friski. Roll ta 'lapes juri b'mod elokwenti kemm sar malajr u b'mod effiċjenti.
Metodu ta 'konsenja. Стандарт — это RPM. Все понимают, что в Linux без него никак, но сам проект после сборки представлял собой набор исполняемых DLL-файлов. Их было около 150, проект достаточно тяжелый. Единственное гармоничное решение — упаковать эту бинарщину в RPM и уже из нее разворачивать приложение.
Verżjoni. Нам предстояло релизиться очень часто, и нужно было решить, каким образом формировать имя пакета. Это вопрос уровня интеграции с TFS. Build-агент у нас был на Linux. Когда TFS отправляет задачу обработчику — worker — на Build-агент, он передает ему еще и банч переменных, которые попадают в environment процесса обработчика. В этих переменных окружения передается имя Build, имя версии и другие переменные. Подробнее об этом в с разделе «сборка RPM-пакета».
Twaqqif ta 'TFS сводилась к настройке Pipeline. Раньше мы собирали на Windows-агентах все Windows-проекты, а сейчас появляется Linux-агент — Build-агент, который нужно включить в группу сборки, обогатить какими-то артефактами, сказать, какого именно типа проекты будут собираться на этом Build-агенте, и как-то модифицировать Pipeline.
IdentityServer. L-ADFS mhux il-mod tagħna, sejrin għall-Open Source.
Ejja ngħaddu mill-komponenti.
Kaxxa Magic
Tikkonsisti f'erba' partijiet.

Linux Build-агент. Linux, потому что мы под него собираем — логично. Эта часть выполнялась в три шага.
- Ikkonfigura l-ħaddiema u mhux waħdu, peress li kien mistenni xogħol imqassam fuq il-proġett.
- Installa .NET Core 1.x. Għaliex 1.x meta 2.0 huwa diġà disponibbli fir-repożitorju standard? Minħabba li meta bdejna l-iżvilupp, il-verżjoni stabbli kienet 1.09, u ġie deċiż li l-proġett isir ibbażat fuqha.
- Git 2.x.
RPM-repożitorju. RPM-пакеты нужно было где-то хранить. Предполагалось, что мы будем использовать тот же самый корпоративный RPM-репозиторий, который доступен всем Linux хостам. Так и поступили. На сервере репозитория настроен ganċ tal-web li niżżel il-pakkett RPM meħtieġ mill-post speċifikat. Il-verżjoni tal-pakkett ġiet irrappurtata lill-webhook mill-aġent Ibni.
GitLab. Внимание! GitLab здесь используется не разработчиками, а отделом эксплуатации для контроля версий приложения, версий пакетов, контроля состояния всех Linux-машин и в нём хранится рецептура — все манифесты Puppet.
Pupazz — issolvi l-kwistjonijiet kontroversjali kollha u tagħti eżattament il-konfigurazzjoni li rridu minn Gitlab.
Nibdew ngħaddu. Kif taħdem il-kunsinna DLL għal RPM?
Kunsinna DDL għal RPM
Ejja ngħidu li għandna rockstar tal-iżvilupp .NET. Juża Visual Studio u joħloq fergħa ta 'rilaxx. Wara dan, ittellah fuq Git, u Git hawnhekk hija entità TFS, jiġifieri, hija r-repożitorju tal-applikazzjoni li miegħu jaħdem l-iżviluppatur.

После чего TFS видит, что прилетел новый коммит. Какое приложение? В настройках TFS есть метка, какими ресурсами обладает тот или иной Build-агент. В данном случае он видит, что мы собираем .NET Core проект и выбирает Linux Build-агент из пула.
L-aġent Ibni jirċievi s-sorsi u jniżżel dak meħtieġ dipendenzi mir-repożitorju .NET, npm, eċċ. u wara li tibni l-applikazzjoni nnifisha u l-ippakkjar sussegwenti, tibgħat il-pakkett RPM lir-repożitorju RPM.
Min-naħa l-oħra, jiġri dan li ġej. L-inġinier tad-dipartiment tal-operazzjonijiet huwa involut direttament fit-tnedija tal-proġett: jibdel il-verżjonijiet tal-pakketti fil Hiera fir-repożitorju fejn tinħażen ir-riċetta tal-applikazzjoni, u wara Puppet triggers yum, iġib il-pakkett il-ġdid mir-repożitorju, u l-verżjoni l-ġdida tal-applikazzjoni hija lesta biex tintuża.

Kollox huwa sempliċi fi kliem, imma x'jiġri ġewwa l-aġent Ibni nnifsu?
Ippakkjar DLL RPM
Irċieva sorsi tal-proġett u kompitu tal-bini minn TFS. Aġent tal-bini jibda jibni l-proġett innifsu minn sorsi. Il-proġett immuntat huwa disponibbli bħala sett Fajls DLL, li huma ppakkjati f'arkivju zip biex inaqqsu t-tagħbija fuq is-sistema tal-fajls.
L-arkivju ZIP jintrema għad-direttorju tal-bini tal-pakkett RPM. Sussegwentement, l-iskrittura Bash jinizjalizza l-varjabbli tal-ambjent, isib il-verżjoni Ibni, il-verżjoni tal-proġett, it-triq għad-direttorju tal-bini, u jmexxi RPM-build. Ladarba l-bini tkun kompluta, il-pakkett jiġi ppubblikat fuq repożitorju lokali, li tinsab fuq l-aġent Ibni.
Sussegwentement, mill-aġent Ibni għas-server fir-repożitorju RPM It-talba JSON tintbagħat li jindika l-isem tal-verżjoni u l-bini. Webhook, li tkellimt dwaru qabel, iniżżel dan il-pakkett stess mir-repożitorju lokali fuq l-aġent Ibni u jagħmel l-assemblaġġ il-ġdid disponibbli għall-installazzjoni.

Почему именно такая схема доставки пакета в репозиторий RPM? Почему нельзя сразу отправить собранный пакет в репозиторий? Дело в том, что это условие для обеспечения безопасности. Такой сценарий ограничивает возможность несанкционированной загрузки RPM-пакетов посторонними людьми на сервер, который доступен всем Linux-машинам.
Verżjoni tad-database
На консилиуме с разработкой выяснилось, что ребятам ближе MS SQL, но в большинстве non-Windows проектов мы уже вовсю использовали PostgreSQL. Так как мы уже решили отказаться от всего платного, то стали использовать PostgreSQL и здесь.

F'din il-parti rrid ngħidlek kif verżjonijna d-database u kif għażilna bejn Flyway u Entity Framework Core. Ejja nħarsu lejn il-vantaġġi u l-iżvantaġġi tagħhom.
Cons
Flyway tmur triq waħda biss, aħna ma nistgħux irromblaw lura — это существенный минус. Сравнивать с Entity Framework Core можно по другим параметрам — с точки зрения удобства разработчика. Вы же помните, что мы это поставили во главу угла, и основным критерием было не изменить ничего для Windows-разработки.
Għal Flyway magħna kien hemm bżonn xi tip ta’ tgeżwirbiex il-guys ma jiktbux Mistoqsijiet SQL. Huma ħafna eqreb li joperaw f'termini OOP. Aħna ktibna struzzjonijiet biex naħdmu ma 'oġġetti tad-database, ġġenerajna mistoqsija SQL u eżegwijnaha. Il-verżjoni l-ġdida tad-database hija lesta, ittestjata - kollox tajjeb, kollox jaħdem.
Entity Framework Core għandha minus - taħt tagħbijiet tqal dan jibni mistoqsijiet SQL subottimali, u l-ġbid fid-database jista 'jkun sinifikanti. Imma peress li m'għandniex servizz ta 'tagħbija għolja, aħna ma nikkalkulawx it-tagħbija f'mijiet ta' RPS, aċċettajna dawn ir-riskji u ddelegajna l-problema lilna futur.
Pros
Entity Framework Core jaħdem barra mill-kaxxa u huwa faċli biex tiżviluppa, u Flyway Tintegra faċilment fis-CI eżistenti. Imma nagħmluha konvenjenti għall-iżviluppaturi :)
Proċedura ta' roll-up
Puppet jara li ġejja bidla fil-verżjoni tal-pakkett, inkluż dik li hija responsabbli għall-migrazzjoni. L-ewwel, tinstalla pakkett li fih skripts tal-migrazzjoni u funzjonalità relatata mad-database. Wara dan, l-applikazzjoni li taħdem mad-database terġa' tinbeda. Wara tiġi l-installazzjoni tal-komponenti li fadal. L-ordni li fiha l-pakketti huma installati u l-applikazzjonijiet huma mnedija hija deskritta fil-manifest Puppet.
L-applikazzjonijiet jużaw data sensittiva, bħal tokens, passwords tad-database, dan kollu jinġibed fil-konfigurazzjoni minn Puppet master, fejn jinħażnu f'forma kriptata.
problemi TFS
Wara li ddeċidejna u rrealizzajna li kollox kien qed jaħdem għalina, iddeċidejt li nħares lejn dak li kien għaddej bl-assemblaġġi fit-TFS kollu kemm hu għad-dipartiment tal-iżvilupp Win fuq proġetti oħra - kemm jekk konna qed nibnu/nirrilaxxaw malajr jew le, u skoprew problemi sinifikanti bil-veloċità.
Wieħed mill-proġetti ewlenin jieħu 12-15-il minuta biex jinġabar - dak huwa żmien twil, ma tistax tgħix hekk. Analiżi mgħaġġla wriet drawdown terribbli fl-I/O, u dan kien fuq arrays.
Wara li analizzatha komponent b'komponent, identifikajt tliet fokus. L-ewwel - "Kaspersky antivirus", который на всех Windows Build-агентах сканирует исходники. Второй — Windows Indiċier. Ma kienx diżattivat, u kollox kien indiċjat f'ħin reali fuq l-aġenti Ibni matul il-proċess ta 'skjerament.
It-tielet - Installa Npm. Irriżulta li fil-biċċa l-kbira tal-Pipelines użajna dan ix-xenarju eżatt. Għaliex hu ħażin? Il-proċedura ta 'installazzjoni Npm titħaddem meta s-siġra tad-dipendenza tiġi ffurmata package-lock.json, fejn jiġu rreġistrati l-verżjonijiet tal-pakketti li se jintużaw biex jinbena l-proġett. L-iżvantaġġ huwa li Npm install jiġbed l-aħħar verżjonijiet ta 'pakketti mill-Internet kull darba, u dan jieħu ħafna ħin fil-każ ta' proġett kbir.
L-iżviluppaturi kultant jesperimentaw fuq magna lokali biex jittestjaw kif taħdem parti partikolari jew proġett kollu. Xi drabi rriżulta li kollox kien frisk lokalment, iżda assemblawh, ħarġu, u xejn ma ħadem. Nibdew insemmu x'inhi l-problema - iva, verżjonijiet differenti ta 'pakketti b'dipendenzi.
deċiżjoni
- Sorsi f'eċċezzjonijiet AV.
- Iddiżattiva l-indiċjar.
- Mur fuq npm ci.
Il-vantaġġi ta 'npm ci huma li aħna Niġbru s-siġra tad-dipendenza darba, u jkollna l-opportunità li nipprovdu lill-iżviluppatur lista attwali ta' pakketti, li biha jista’ jesperimenta lokalment kemm jħobb. Dan jiffranka l-ħin żviluppaturi li jiktbu kodiċi.
Konfigurazzjoni
Issa ftit dwar il-konfigurazzjoni tar-repożitorju. Storikament nużaw Nexus għall-ġestjoni ta' repożitorji, inkluż REPO Intern. Dan ir-repożitorju intern fih il-komponenti kollha li nużaw għal skopijiet interni, pereżempju, monitoraġġ awto-miktub.

Aħna nużaw ukoll NuGet, peress li għandu caching aħjar meta mqabbel ma 'maniġers ta' pakketti oħra.
Riżultat
Wara li ottimizzajna l-Aġenti tal-Bini, il-ħin medju tal-bini tnaqqas minn 12-il minuta għal 7.
Если посчитать все машины, которые мы могли бы использовать для Windows, но перевели на Linux в этом проекте, мы сэкономили порядка $10 000. И это только на лицензиях, а если учитывать содержание — больше.
Pjanijiet
Għat-trimestru li jmiss, ippjanajna li naħdmu fuq l-ottimizzazzjoni tal-kunsinna tal-kodiċi.
Taqleb għal immaġni ta' Docker li tinbena minn qabel. TFS hija ħaġa friska b'ħafna plugins li jippermettulek tintegra f'Pipeline, inkluż assemblaġġ ibbażat fuq il-grillu ta ', ngħidu aħna, immaġni Docker. Irridu nagħmlu dan il-grillu għall-istess wieħed package-lock.json. Jekk il-kompożizzjoni tal-komponenti użati biex jinbena l-proġett b'xi mod tinbidel, nibnu immaġni Docker ġdida. Aktar tard jintuża biex jintuża l-kontenitur bl-applikazzjoni immuntata. Dan mhux il-każ issa, iżda qed nippjanaw li naqilbu għal arkitettura ta 'mikroservizz f'Kubernetes, li qed tiżviluppa b'mod attiv fil-kumpanija tagħna u ilha sservi soluzzjonijiet ta' produzzjoni għal żmien twil.
Sommarju
Призываю всех выкинуть Windows, но это не потому, что я не умею ее готовить. Причина в том, что большая часть Opensource-решений — это Linux-стек. inti ok tiffranka r-riżorsi. На мой взгляд, будущее за решениями Open Source на Linux с мощным комьюнити.
Profil tal-ispeaker ta' Alexander Sinchinov .
hija konferenza dwar l-integrazzjoni ta 'proċessi ta' żvilupp, ittestjar u tħaddim għal professjonisti minn professjonisti. Huwa għalhekk li l-proġett li tkellem dwaru Alexander? implimentati u jaħdmu, u dakinhar tal-prestazzjoni kien hemm żewġ rilaxxi ta 'suċċess. Fuq Fis-27 u t-28 ta’ Mejju se jkun hemm saħansitra aktar każijiet simili minn prattikanti. Inti xorta tista 'tiżdied fl-aħħar ġarr u jew ħu l-ħin tiegħek biljett. Iltaqa magħna fi Skolkovo!
Sors: www.habr.com
