.NET Core oan LinuxDevOps is yn opkomst

Wy hawwe DevOps sa goed mooglik ûntwikkele. Wy wiene mei acht, en Vasya wie de coolste. WindowsYnienen gie Vasya fuort, en ik hie de taak om in nij projekt te lansearjen dat leveret Windows-ûntwikkeling. Doe't ik de hiele stapel op 'e tafel dumpte Windows-разработки, то понял, что ситуация — боль…

Dit is hoe't it ferhaal begjint Alexandra Sinchinova op DevOpsConf. Когда из компании ушел ведущий специалист по Windows, Aleksander frege him ôf wat er no dwaan moast. Gean nei Linux, конечно же! Александр расскажет, как ему удалось создать прецедент и перевести часть Windows разработки на Linux на примере реализованного проекта на 100 000 конечных пользователей.

.NET Core oan LinuxDevOps is yn opkomst

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

Spielje fideo

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

.NET Core oan LinuxDevOps is yn opkomst

Так как мы активно развиваем DevOps, я понял, что нужно что-то менять в подходе выноса нового приложения. Решение было одно — по возможности перевести все на Linux. Google мне помог — на тот момент уже был портирован .Net под Linux, и я понял, что это решение!

Почему .NET core в связке с Linux?

На это было несколько причин. Между «платить деньги» и «не платить» большинство выберет второе — как и я. Лицензия на MSDB стоит около 1 000 $, обслуживание парка виртуальных машин Windows исчисляется сотнями долларов. Для большой компании это большие затраты. Поэтому sparen - earste reden. Net de wichtichste, mar ien fan de wichtige.

Firtuele masines Windows занимают больше ресурсов, чем их братья из Linux - se binne swier. Учитывая масштаб большой компании мы выбрали Linux.

It systeem is gewoan yntegrearre yn besteande CI. Мы считаем себя прогрессивными DevOps’ами, используем Bamboo, Jenkins и GitLab CI, поэтому большая часть у нас крутится на Linux.

De lêste reden is handige begelieding. Нам нужно было снизить порог вхождения для «сопровожденцев» — ребят, которые понимают техническую часть, обеспечивают бесперебойность и обслуживают сервисы со второй линии. Они уже были знакомы со стеком Linux, поэтому им гораздо проще понять новый продукт, поддерживать и сопровождать, чем тратить дополнительные ресурсы, чтобы разобраться с аналогичным функционалом ПО для Windows platfoarmen.

easken

Earst en foaral - gemak fan de nije oplossing foar ûntwikkelders. Не все из них оказались готовы к переменам, особенно после произнесенного слова Linux. Разработчики хотят любимую Visual Studio, TFS c автотестами по сборкам и смузи. Как происходит доставка в продакшн — им не важно. Поэтому мы решили не менять привычный процесс и оставить для Windows-разработки всё без изменений.

Nij projekt nedich yntegrearje yn besteande CI. De rails wiene der al en al it wurk moast dien wurde mei rekkening mei de parameters fan it konfiguraasjebehearsysteem, akseptearre leveringsnormen en kontrôlesystemen.

Gemak fan stipe en operaasje, as betingst foar de minimale yntreedrompel foar alle nije dielnimmers út ferskate divyzjes ​​en de stipe-ôfdieling.

Deadline - juster.

Win Development Group

С чем тогда работала команда Windows?

.NET Core oan LinuxDevOps is yn opkomst

No kin ik dat mei fertrouwen sizze IdentityServer 4 is in koel fergees alternatyf foar ADFS mei ferlykbere mooglikheden, of wat Entity Framework Core - in paradys foar in ûntwikkelder, wêr't jo gjin muoite hawwe om SQL-skripts te skriuwen, mar fragen yn 'e databank beskriuwe yn OOP-termen. Mar doe, tidens de diskusje fan it aksjeplan, seach ik nei dizze stapel as wie it Sumearysk spykerskrift, erkende allinich PostgreSQL en Git.

Op dat stuit brûkten wy aktyf Poppe as in konfiguraasjebehearsysteem. Yn de measte fan ús projekten brûkten wy GitLab CI, elastysk, balansearre hege-load tsjinsten mei help HAProxy kontrolearre alles mei Zabbix, ligaminten grafana и Prometheus, Jager, en dit alles draaide op stikken izer HPESXi op Omrop. Elkenien wit it - in klassiker fan it sjenre.

.NET Core oan LinuxDevOps is yn opkomst

Litte wy sjen en besykje te begripen wat der barde foardat wy al dizze yntervinsjes begûnen.

Wat is der bart

TFS is in frij krêftich systeem dat net allinich koade leveret fan 'e ûntwikkelder nei de definitive produksjemasine, mar hat ek in set foar heul fleksibele yntegraasje mei ferskate tsjinsten - om CI op in cross-platform nivo te leverjen.

.NET Core oan LinuxDevOps is yn opkomst
Раньше это были сплошные форточки. TFS использовал несколько Build-агентов, на которых собиралось множество проектов. В каждом агенте по 3-4 worker-a, чтобы распараллелить задачи и оптимизировать процесс. Дальше, согласно релизным планам, TFS доставлял свежеиспеченный Build на Windows-сервер приложений.

Wat woene wy ​​berikke?

Для доставки и разработки используем TFS, а запускаем приложение на Linux Application server, и между ними какая-то магия. Этот Magic Box en d'r is it sâlt fan it wurk foarút. Foardat ik it útinoar helje, doch ik in stapke oan de kant en sis ik in pear wurden oer de applikaasje.

It projekt

De applikaasje biedt funksjonaliteit foar it behanneljen fan prepaidkaarten.

.NET Core oan LinuxDevOps is yn opkomst

Kliïnt

D'r wiene twa soarten brûkers. De earste tagong krigen troch oan te melden mei in SSL SHA-2-sertifikaat. U fan 'e twadde der wie tagong mei in oanmelding en wachtwurd.

HAProxy

Doe gie it klantfersyk nei HAProxy, dy't de folgjende problemen oploste:

  • primêre autorisaasje;
  • SSL-beëiniging;
  • tuning HTTP-fersiken;
  • útstjoering fersiken.

It klantsertifikaat waard ferifiearre lâns de ketting. wy - autoriteit en wy kinne dit betelje, om't wy sels sertifikaten útjaan oan tsjinstkliïnten.

Jou omtinken oan it tredde punt, wy komme der in bytsje letter op werom.

backend

Бэкенд планировали сделать на Linux. Бэкенд взаимодействует с БД, подгружает необходимый список привилегий и потом, в зависимости от того, какими привилегиями обладает авторизовавшийся пользователь, предоставляет доступ для подписания финансовых документов и отправки их на исполнение, либо генерации какого-то отчета.

Besparring mei HAProxy

Neist de twa konteksten dy't elke klant navigearre, wie d'r ek in identiteitskontekst. IdentityServer 4 lit jo gewoan ynlogge, dit is in fergese en krêftige analoog foar ADFS - Tsjinsten fan Active Directory Federaasje.

It identiteitsfersyk waard yn ferskate stappen ferwurke. Earste stap - klant kaam yn 'e efterkant, dy't kommunisearre mei dizze tsjinner en kontrolearre de oanwêzigens fan in token foar de kliïnt. As it net fûn waard, waard it fersyk weromjûn nei de kontekst dêr't it út kaam, mar mei in trochferwizing, en mei de trochferwizing gie it nei identiteit.

Twadde stap - it fersyk waard ûntfongen nei de autorisaasjeside yn IdentityServer, wêr't de klant registrearre, en dat langferwachte token ferskynde yn 'e IdentityServer-database.

Tredde stap - de klant waard omlaat werom nei de kontekst dêr't it út kaam.

.NET Core oan LinuxDevOps is yn opkomst

IdentityServer4 hat in funksje: it jout it antwurd op it weromfersyk fia HTTP. Gjin saak hoefolle wy muoite mei it opsetten fan de tsjinner, gjin saak hoefolle wy ferljochte ússels mei de dokumintaasje, eltse kear wy krigen in earste klant fersyk mei in URL dy't kaam fia HTTPS, en IdentityServer werom deselde kontekst, mar mei HTTP. Wy wiene skrokken! En wy hawwe dit alles troch de identiteitskontekst oerbrocht nei HAProxy, en yn 'e kopteksten moasten wy it HTTP-protokol wizigje nei HTTPS.

Wat is de ferbettering en wêr hawwe jo bewarre?

Wy hawwe jild besparre troch in fergese oplossing te brûken foar it autorisearjen fan in groep brûkers, boarnen, om't wy IdentityServer4 net as in apart knooppunt yn in apart segmint pleatsten, mar it tegearre mei de backend op deselde tsjinner brûkten wêr't de efterkant fan 'e applikaasje rint .

Hoe moat it wurkje

Итак, как я обещал — Magic Box. Мы уже понимаем, что гарантированно движемся в сторону Linux. Давайте сформулируем конкретные задачи, которые требовали решения.

.NET Core oan LinuxDevOps is yn opkomst

Puppet manifestearret. Om tsjinst- en applikaasjekonfiguraasje te leverjen en te behearjen, moasten koele resepten skreaun wurde. In potleadrol lit wolsprekend sjen hoe fluch en effisjint it dien is.

Levering metoade. Стандарт — это RPM. Все понимают, что в Linux без него никак, но сам проект после сборки представлял собой набор исполняемых DLL-файлов. Их было около 150, проект достаточно тяжелый. Единственное гармоничное решение — упаковать эту бинарщину в RPM и уже из нее разворачивать приложение.

Ferzjefoarming. Нам предстояло релизиться очень часто, и нужно было решить, каким образом формировать имя пакета. Это вопрос уровня интеграции с TFS. Build-агент у нас был на Linux. Когда TFS отправляет задачу обработчику — worker — на Build-агент, он передает ему еще и банч переменных, которые попадают в environment процесса обработчика. В этих переменных окружения передается имя Build, имя версии и другие переменные. Подробнее об этом в с разделе «сборка RPM-пакета».

TFS ynstelle сводилась к настройке Pipeline. Раньше мы собирали на Windows-агентах все Windows-проекты, а сейчас появляется Linux-агент — Build-агент, который нужно включить в группу сборки, обогатить какими-то артефактами, сказать, какого именно типа проекты будут собираться на этом Build-агенте, и как-то модифицировать Pipeline.

IdentityServer. ADFS is net ús manier, wy geane foar Open Source.

Lit ús gean troch de komponinten.

Magic Box

Bestiet út fjouwer dielen.

.NET Core oan LinuxDevOps is yn opkomst

Linux Build-агент. Linux, потому что мы под него собираем — логично. Эта часть выполнялась в три шага.

  • Konfigurearje arbeiders en net allinnich, sûnt ferspraat wurk oan it projekt waard ferwachte.
  • Ynstallearje .NET Core 1.x. Wêrom 1.x as 2.0 al beskikber is yn it standert repository? Want doe't wy begûn ûntwikkeling, de stabile ferzje wie 1.09, en it waard besletten om te meitsjen it projekt basearre op it.
  • Git 2.x.

RPM-repository. RPM-пакеты нужно было где-то хранить. Предполагалось, что мы будем использовать тот же самый корпоративный RPM-репозиторий, который доступен всем Linux хостам. Так и поступили. На сервере репозитория настроен web heak dy't it fereaske RPM-pakket downloade fan 'e opjûne lokaasje. De pakketferzje waard rapportearre oan de webhook troch de Build-agent.

GitLab. Внимание! GitLab здесь используется не разработчиками, а отделом эксплуатации для контроля версий приложения, версий пакетов, контроля состояния всех Linux-машин и в нём хранится рецептура — все манифесты Puppet.

Poppe - lost alle kontroversjele problemen op en leveret krekt de konfiguraasje dy't wy wolle fan Gitlab.

Wy begjinne te dûken. Hoe wurket DLL-levering nei RPM?

Levering DDL to RPM

Litte wy sizze dat wy in .NET-ûntwikkelingsrockstjer hawwe. It brûkt Visual Studio en makket in release branch. Dêrnei uploadt it it nei Git, en Git hjir is in TFS-entiteit, dat wol sizze, it is de applikaasje-repository wêrmei de ûntwikkelder wurket.

.NET Core oan LinuxDevOps is yn opkomst

После чего TFS видит, что прилетел новый коммит. Какое приложение? В настройках TFS есть метка, какими ресурсами обладает тот или иной Build-агент. В данном случае он видит, что мы собираем .NET Core проект и выбирает Linux Build-агент из пула.

De Build-agint ûntfangt de boarnen en downloadt de nedige ôfhinklikens fan it .NET repository, npm, ensfh. en nei it bouwen fan de applikaasje sels en de folgjende ferpakking, stjoert it RPM-pakket nei it RPM-repository.

Oan 'e oare kant bart it folgjende. De yngenieur fan 'e operaasje ôfdieling is direkt belutsen by de útrol fan it projekt: hy feroaret de ferzjes fan pakketten yn Hiera yn de repository dêr't de applikaasje resept wurdt opslein, wêrnei't Puppet triggers yum, hellet it nije pakket út it repository, en de nije ferzje fan 'e applikaasje is klear om te brûken.

.NET Core oan LinuxDevOps is yn opkomst

Alles is ienfâldich yn wurden, mar wat bart der binnen de Build-agint sels?

Ferpakking DLL RPM

Ûntfong projekt boarnen en bouwe taak fan TFS. Bouwe agent begjint it projekt sels út boarnen te bouwen. It gearstalde projekt is beskikber as in set DLL triemmen, dy't yn in zip-argyf binne ferpakt om de lading op it bestânsysteem te ferminderjen.

It ZIP-argyf wurdt fuortsmiten nei de RPM-pakket build map. Dêrnei initialisearret it Bash-skript de omjouwingsfariabelen, fynt de Build-ferzje, de projektferzje, it paad nei de build-map, en rint RPM-build. As de bou foltôge is, wurdt it pakket publisearre nei lokale repository, dat leit op de Build-agint.

Folgjende, fan 'e Build-agent nei de tsjinner yn' e RPM-repository JSON-fersyk wurdt ferstjoerd oanjout de namme fan de ferzje en build. Webhook, dêr't ik earder oer praat, downloadt dit heul pakket fan it lokale repository op 'e Build-agent en makket de nije gearkomste beskikber foar ynstallaasje.

.NET Core oan LinuxDevOps is yn opkomst

Почему именно такая схема доставки пакета в репозиторий RPM? Почему нельзя сразу отправить собранный пакет в репозиторий? Дело в том, что это условие для обеспечения безопасности. Такой сценарий ограничивает возможность несанкционированной загрузки RPM-пакетов посторонними людьми на сервер, который доступен всем Linux-машинам.

Database ferzje

На консилиуме с разработкой выяснилось, что ребятам ближе MS SQL, но в большинстве non-Windows проектов мы уже вовсю использовали PostgreSQL. Так как мы уже решили отказаться от всего платного, то стали использовать PostgreSQL и здесь.

.NET Core oan LinuxDevOps is yn opkomst

Yn dit diel wol ik jo fertelle hoe't wy de databank ferzje hawwe en hoe't wy hawwe keazen tusken Flyway en Entity Framework Core. Litte wy nei har foar- en neidielen sjen.

Минусы

Flyway giet mar ien kant, wy wy kinne net rôlje werom — это существенный минус. Сравнивать с Entity Framework Core можно по другим параметрам — с точки зрения удобства разработчика. Вы же помните, что мы это поставили во главу угла, и основным критерием было не изменить ничего для Windows-разработки.

Foar Flyway us in soarte fan wrapper wie nedichsadat de jonges net skriuwe SQL-fragen. Se binne folle tichter by it operearjen yn OOP-termen. Wy hawwe ynstruksjes skreaun foar it wurkjen mei databankobjekten, in SQL-query generearre en it útfierd. De nije ferzje fan 'e databank is klear, hifke - alles is goed, alles wurket.

Entity Framework Core hat in minus - ûnder swiere loads it bout suboptimale SQL-fragen, en de drawdown yn 'e databank kin signifikant wêze. Mar om't wy gjin tsjinst mei hege lading hawwe, berekkenje wy de lading net yn hûnderten RPS, wy hawwe dizze risiko's akseptearre en it probleem delegearre oan ús takomst.

Плюсы

Entity Framework Core wurket út 'e doaze en is maklik te ûntwikkeljen, en Flyway Maklik yntegreart yn besteande CI. Mar wy meitsje it handich foar ûntwikkelders :)

Roll-up proseduere

Puppet sjocht dat der in feroaring yn pakketferzje komt, ynklusyf dejinge dy't ferantwurdlik is foar migraasje. Earst ynstalleart it in pakket dat migraasjeskripts en database-relatearre funksjonaliteit befettet. Hjirnei wurdt de applikaasje dy't wurket mei de databank opnij starte. Dêrnei komt de ynstallaasje fan 'e oerbleaune komponinten. De folchoarder wêryn pakketten wurde ynstalleare en applikaasjes wurde lansearre wurdt beskreaun yn it Puppet-manifest.

Applikaasjes brûke gefoelige gegevens, lykas tokens, database wachtwurden, dit alles wurdt lutsen yn 'e konfiguraasje fan Puppet master, wêr't se wurde opslein yn fersifere foarm.

TFS problemen

Nei't wy besletten hawwe en realisearre dat alles echt foar ús wurke, besleat ik om te sjen nei wat der bart mei de gearkomsten yn TFS as gehiel foar de Win-ûntwikkelingsôfdieling op oare projekten - oft wy gau bouwe / loslitte of net, en ûntduts wichtige problemen mei snelheid.

Ien fan 'e wichtichste projekten nimt 12-15 minuten om te sammeljen - dat is in lange tiid, jo kinne net sa libje. In flugge analyse toande in skriklike drawdown yn I / O, en dit wie op arrays.

Nei it analysearjen fan it komponint foar komponint, identifisearre ik trije foci. Earste - "Kaspersky antivirus", который на всех Windows Build-агентах сканирует исходники. Второй — Windows Indexer. It wie net útskeakele, en alles waard yn realtime yndeksearre op de Build-aginten tidens it ynsetproses.

Tredde - Npm ynstallearje. It die bliken dat wy yn de measte Pipelines dit krekte senario brûkten. Wêrom is er min? De Npm-ynstallaasjeproseduere wurdt útfierd as de ôfhinklikensbeam wurdt foarme yn package-lock.json, wêr't de ferzjes fan pakketten dy't brûkt wurde om it projekt te bouwen wurde opnommen. It neidiel is dat Npm-ynstallaasje elke kear de lêste ferzjes fan pakketten fan it ynternet oplûkt, en dit nimt in protte tiid yn it gefal fan in grut projekt.

Untwikkelders eksperimintearje soms op in lokale masine om te testen hoe't in bepaald diel of in heule projekt wurket. Soms die bliken dat alles wie cool lokaal, mar se gearstald it, rôle it út, en neat wurke. Wy begjinne út te finen wat it probleem is - ja, ferskate ferzjes fan pakketten mei ôfhinklikens.

beslút

  • Boarnen yn AV útsûnderings.
  • Yndeksearring útskeakelje.
  • Gean nei npm ci.

De foardielen fan npm ci binne dat wy Wy sammelje de ôfhinklikensbeam ien kear, en wy krije de kâns om te foarsjen de ûntwikkelder aktuele list fan pakketten, dêr't er lokaal safolle mei eksperimintearje kin as er wol. Dit besparret tiid ûntwikkelers dy't skriuwe koade.

Konfiguraasje

No in bytsje oer de konfiguraasje fan 'e repository. Histoarysk brûke wy nexus foar it behearen fan repositories, ynklusyf Ynterne REPO. Dit ynterne repository befettet alle komponinten dy't wy brûke foar ynterne doelen, bygelyks selsskreaune tafersjoch.

.NET Core oan LinuxDevOps is yn opkomst

Wy brûke ek NuGet, om't it bettere caching hat yn ferliking mei oare pakketbehearders.

resultaat

Neidat wy de Build Agents optimalisearre hawwe, waard de gemiddelde boutiid fermindere fan 12 minuten nei 7.

Если посчитать все машины, которые мы могли бы использовать для Windows, но перевели на Linux в этом проекте, мы сэкономили порядка $10 000. И это только на лицензиях, а если учитывать содержание — больше.

Plannen

Foar it folgjende kwartaal planden wy te wurkjen oan it optimalisearjen fan koadelevering.

Oerskeakelje nei in prebuild Docker-ôfbylding. TFS is in cool ding mei in protte plugins dy't jo kinne yntegrearje yn Pipeline, ynklusyf trigger-basearre gearstalling fan bygelyks in Docker-ôfbylding. Wy wolle dizze trigger meitsje foar deselde package-lock.json. As de gearstalling fan 'e komponinten dy't brûkt wurde om it projekt op ien of oare manier te bouwen feroaret, bouwe wy in nije Docker-ôfbylding. It wurdt letter brûkt om de kontener yn te setten mei de gearstalde applikaasje. Dit is no net it gefal, mar wy binne fan plan om te wikseljen nei in mikroservice-arsjitektuer yn Kubernetes, dy't aktyf ûntwikkelet yn ús bedriuw en hat produksjeoplossingen foar in lange tiid tsjinne.

Gearfetting

Призываю всех выкинуть Windows, но это не потому, что я не умею ее готовить. Причина в том, что большая часть Opensource-решений — это Linux-стек. giet it goed mei dy besparje op middels. На мой взгляд, будущее за решениями Open Source на Linux с мощным комьюнити.

Sprekker profyl fan Alexander Sinchinov op GitHub.

DevOps Conf is in konferinsje oer de yntegraasje fan ûntwikkeling, testen en operaasje prosessen foar professionals troch professionals. Dat is wêrom it projekt dat Alexander it oer? ymplemintearre en wurkjen, en op 'e dei fan' e foarstelling wiene d'r twa suksesfolle releases. Op DevOps Conf by RIT++ Op 27 en 28 maaie komme der noch mear ferlykbere gefallen fan beoefeners. Jo kinne noch springe yn de lêste koets en in ferslach yntsjinje of nim dyn tiid te boeke kaartsje. Moetsje ús yn Skolkovo!

Boarne: www.habr.com

Keapje betroubere hosting foar siden mei DDoS-beskerming, VPS VDS-tsjinners 🔥 Keapje betroubere websidehosting mei DDoS-beskerming, VPS VDS-tsjinners | ProHoster