Русский
Русский
English
Статистика
Реклама

Блог компании gitlab

GitOps очередной модный термин или прорыв в автоматизации?

06.10.2020 12:23:44 | Автор: admin

Большинство из нас, подмечая очередной новый термин в IT блогосфере или конференции, рано или поздно задается подобным вопросом: Что это? Очередное модное слово, buzzword или действительно что-то стоящее пристального внимания, изучения и обещающее новые горизонты? Точно также вышло у меня и с термином GitOps некоторое время назад. Вооружившись множеством уже существующих статей, а также знанием коллег из компании GitLab, я попытался разобраться, что же это за зверь, и как его применение может выглядеть на практике.

Кстати, о новизне термина GitOps также говорит недавно проведенный нами опрос: более половины опрошенных еще не начинали работы с его принципами.

Итак, проблема управления инфраструктурой не нова. Множество облачных провайдеров уже добрый десяток лет доступны широкой публике и, казалось бы, должны были сделать работу отвечающих за инфраструктуру команд простой и незатейливой. Однако при сравнении с процессом разработки приложений (где уровень автоматизации достигает все новых и новых горизонтов), инфраструктурные проекты все еще зачастую включают множество выполняемых вручную задач и требуют особых знаний и специалистов, особенно с учетом современных требований к отказоустойчивости, гибкости, масштабируемости и эластичности.

Облачные сервисы очень успешно выполняли эти требования и именно они дали значительный толчок развитию подхода IaC. Оно и понятно. Ведь именно они дали возможность конфигурировать полностью виртуальный центр обработки данных: нет физических серверов, стоек, сетевых компонентом, всю инфраструктуру можно описать при помощи скриптов и конфигурационных файлов.

Так в чем собственно отличие GitOps от IaC? Именно с этого вопроса я и начал свое расследование. Пообщавшись с коллегами, у меня получилось выработать следующее сравнение:

GitOps

IaC

Весь код хранится в git репозитории

Версионность кода необязательна

Декларативное описание кода / Идемпотентность

Допустимо как декларативное, так и императивное описание

Изменения вступают в силу с использованием механизмов Merge Request / Pull Request

Согласование, утверждение и коллаборация необязательны

Процесс выката обновлений автоматизирован

Процесс выката обновлений не нормирован (автоматический, ручной, копирование файлов, с использованием командной строки и т.д.)

Иными словами GitOps появился на свет именно благодаря применению принципов IaC. Во-первых, инфраструктуру и конфигурации теперь можно было хранить точно так же как и приложения. Код легко хранить, им легко делиться, сравнивать, пользоваться возможностями версионности. Версии, ветки, история. И все это в общедоступном для всей команды месте. Поэтому вполне закономерным развитием стало использования систем контроля версий. В частности, git, как наиболее популярного.

С другой стороны, появилась возможность автоматизировать процессы управления инфраструктурой. Теперь это можно сделать быстрее, надежнее и дешевле. Тем более принципы CI / CD уже были известны и популярны среди разработчиков программного обеспечения. Необходимо было только перенести и применить уже известные знания и навыки в новую область. Эти практики однако выходили за рамки стандартного определения Инфраструктуры как кода, отсюда и родилось понятие GitOps.

Любопытность GitOps, конечно, еще и в том, что это не продукт, плагин или платформа, связанная с каким бы то ни было вендором. Это скорее парадигма и набор принципов, аналогично с другим знакомым нам термином: DevOps.

В компании GitLab мы выработали два определения этого нового термина: теоретический и практически. Начнем с теоретического:

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

Все процессы GitOps работаю с использованием уже имеющихся инструментов. Весь инфраструктурный код хранятся в уже знакомом git репозитории, изменения проходят тот же процесс согласования, что и любой другой программный код, а процесс выката автоматизирован, что позволяет свести к минимуму ошибки человеческого фактора, повысить надежность и воспроизводимость.

С практической же точки зрения мы описываем GitOps следующим образом:

GitOps = IaC + MRs + CI/CD

Инфраструктуру как код мы уже обсудили, как одно из ключевых составляющих этой формулы. Давайте представим остальных участников.

Merge Request (альтернативное название Pull Request). В плане процесса MR - это запрос на применение изменений кода и последующее слияние веток. Но в плане инструментов, которыми мы пользуемся - это скорее возможность для получения полной картины всех вносимых изменений: не только code diff, собранный из какого-то количества коммитов, но и контекст, результаты тестов, конечный ожидаемый результат. Если мы говорим про инфраструктурный код, то нам интересно, как именно изменится инфраструктура, сколько новых ресурсов будет добавлено или удалено, изменено. Желательно в каком-то более удобном и легко читаемом формате. В случае с облачными провайдерами неплохо было бы знать, какие финансовые последствия понесет это изменение.

Но MR - это еще и средство совместной работы, взаимодействия, общения. То место, где вступает в действие система сдержек и противовесов. От простых комментариев до формальных одобрений и утверждений.

Ну и последняя составляющая: CI/CD, как мы уже знаем, дает возможность автоматизировать процесс внесения инфраструктурных изменений, тестирования (от простой проверки синтаксиса до более сложного статического анализа кода). А также и в последующем обнаружения дрейфа: отличий реального и желаемого состояния системы. Например, в результате несанкционированных ручных изменений или же отказа систем.

Да, термин GitOps не знакомит нас ни с чем абсолютно новым, не изобретает велосипед, а всего лишь применяет уже накопленный опыт в новой области. Но в этом и заключается его сила.

А если вам вдруг станет интересно, как это все выглядит на практике, то приглашаю посмотреть наш мастер-класс, в котором я пошагово рассказываю, как при помощи GitLab:

  • Реализовать основные принципы GitOps

  • Создавать и вносить изменения в облачную инфраструктуру (на примере Yandex Cloud)

  • Автоматизировать обнаружение дрейфа системы от желаемого состояния при помощи активного мониторинга

http://personeltest.ru/aways/bit.ly/34tRpwZhttps://bit.ly/34tRpwZ
Подробнее..

Новые ограничения в использовании Docker Hub и как GitLab реагировал на их ввод

30.11.2020 22:22:08 | Автор: admin

Ни для кого уже не новость, что начиная с 2 ноября 2020 года Docker Hub ввел ограничения на скачивание образов: для анонимных пользователей он будет равен одной сотне за шесть часов, а для авторизованных пользователей будет зависеть от уровня подписки.

В компании GitLab мы очень внимательно следили за этими изменениями, так как они затрагивали практически всех наших пользователей и клиентов. Сегодня я хотел бы рассказать о том, какие изменения мы внесли и как адаптировались к новым правилам.

Что же произошло?

Публичный регистр контейнеров Docker Hub очень широко и часто используется сообществом DevOps для достижения разнообразных целей: запуска CI/CD задач, стандартизации процессов, выката контейнерных приложений как в sandbox, так и в production. Как только мы узнали о введении новых ограничения по количеству запросов, мы начали анализ новых правил, чтобы понять, как они повлияют на работу наших пользователей, и как мы можем почем решить возможные проблемы.

Согласно новым правилам после 100 запросов за 6 часов с одного клиентского IP адреса каждый новый docker pull вернет ошибку 429 - too many requests, что несомненно приведет к сломанным CI/CD конвейерам, невозможности выкатить приложения и целому букету ошибок в ваших Kubernetes кластерах. Вполне понятно, что этот лимит может быть очень быстро достигнут, особенно если все задачи выполняются с одного и того же GitLab Runner агента, или если команда из нескольких инженеров работает с одного и того же публичного адреса.

Аутсорсинг Dependency Proxy

Как отметил мой коллега Tim Rizzi "Нам следует срочно всем рассказать о Dependency Proxy", который изначально создавался для проксирования и кэширования образов Docker Hub. Этот функционал существует в GitLab уже довольнейший давно (начиная с версии 11.11), но до сегодняшнего дня был доступен только для пользователей Enterprise подписки уровня Premium. Перед продуктовой командой встал вполне резонный вопрос: "Стоит ли нам вынести Dependency Proxy в open source версию продукта, помогая таким образом широкому сообществу пользователей минимизировать проблемы из-за новых ограничений Docker Hub?"

Не вдаваясь в подробности, ответ на этот вопрос был ДА. При принятии решения, в какой уровень подписки должен попадать тот или иной функционал продуктовая команда GitLab всегда руководствуется вопросом "Кто является целевым пользователем?". Согласно этому принципу те возможности, которые чаще всего запрашивает индивидуальный участник или разработчик, попадают в Core или Open Source версию продукта. Скачивание образов с Docker Hub вполне соответсвует этому описанию. Более того аутсорсинг Dependency Proxy поможет большому количеству разработчиков повысить надежность и производительность их CI/CD конвейеров.

Как результат, начиная с версии 13.6 вышедшей 22 ноября 2020 года, проксирование и кэширование образов в GitLab стало абсолютно бесплатным для всех наших пользователей!

Что дальше?

К сожалению, идеальные решения не появляются мгновенно. Мы как никто другой знаем, что нашему продукты есть куда расти, поэтому активно работаем над улучшением функционала Dependency Proxy и уже в ближайших релизах планируем добавить новые возможности / решить имеющиеся проблемы:

  • 13.7 (22 декабря, 2020)

    • gitlab-#11582 сделает возможным использование Dependency Proxy для приватных групп в GitLab (сегодня работает только для публичных проектов)

    • gitlab-#241639 позволит использовать закэшированный образ даже если Docker Hub недоступен. На сегодня это невозможно, так как даже при наличии закэшированного образа, его манифест всегда скачивается из конечного регистра

    • gitlab-#21619 добавит новый параметр pull_policy в YAML описании CI/CD задач, позволяющий разработчикам самим указывать политику скачивания контейнера (always, if-not-present, never) вместо того, чтобы полагаться на настройки GitLab Runner

    • gitlab-runner-#26558 позволит конфигурировать GitLab Runner с набором политик для скачивания образов (always, if-not-present)

Мониторинг ограничений

Решения обозначенные выше, а также в блог посте моего коллеги Steve Azzopardi, помогут упростить работу с новыми ограничениями, но не избавят от них на все 100%. Поэтому мы также выработали набор советов и инструментов, цель которых - помочь широкому сообществу адаптироваться к новым лимитам за счет их мониторинга.

Как проверить текущее значение лимита?

Документация Dockerрекомендует использовать HTTP запрос для проверки текущего значения ограничений запросов в Docker Hub.

Начнем с определения образа, для которого мы хотим получить текущее ограничение и получения токена для авторизации:

$ IMAGE="ratelimitpreview/test"$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:$IMAGE:pull" | jq -r .token)$ echo $TOKEN

Следующий шаг - симуляция запросаdocker pull. Вместо использования методаGETотправляемHEADзапрос (он не учитывается при подсчете ограничений). Ответ на этот запрос содержит параметрыRateLimit-Limit и RateLimit-Remaining.

$ curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/$IMAGE/manifests/latest

В примере ниже количество запросов ограничено2500, из которых2495еще доступны.21600определяет шестичасовой период (в секундах)

RateLimit-Limit: 2500;w=21600RateLimit-Remaining: 2495;w=21600

Автоматизация проверки лимитов

Michael Friedrich, один из евангелистов GitLab, поделился готовым решением на Python для проверки ограничений. Проект включает подробную документацию по установке и использованию

$ python check_docker_hub_limit.py --helpusage: check_docker_hub_limit.py [-h] [-w WARNING] [-c CRITICAL] [-v] [-t TIMEOUT]Version: 2.0.0optional arguments:  -h, --help            show this help message and exit  -w WARNING, --warning WARNING                        warning threshold for remaining  -c CRITICAL, --critical CRITICAL                        critical threshold for remaining  -v, --verbose         increase output verbosity  -t TIMEOUT, --timeout TIMEOUT                        Timeout in seconds (default 10s)

Скрипт возвращает следующие exit коды в зависимости от указанных параметров

  • 0- OK

  • 1- WARNING

  • 2- CRITICAL

$ python3 check_docker_hub_limit.pyOK - Docker Hub: Limit is 5000 remaining 4997|'limit'=5000 'remaining'=4997$ echo $?0$ python3 check_docker_hub_limit.py -w 10000 -c 3000WARNING - Docker Hub: Limit is 5000 remaining 4999|'limit'=5000 'remaining'=4999$ echo $?1$ python3 check_docker_hub_limit.py -w 10000 -c 5000CRITICAL - Docker Hub: Limit is 5000 remaining 4998|'limit'=5000 'remaining'=4998$ echo $?2

Экспортер Prometheus

Кроме этого мы подготовили и выпустили экспортер для Prometheus, который позволит экспортировать метрики ограничений и реализовать их полноценный мониторинг.

Репозиторий проекта включает демо контейнер, включающий себе экспортер, Prometheus, Grafana, и docker-compose инструкции для его выката

$ cd example/docker-compose$ docker-compose up -d

Перейдите по адресу http://localhost:3000 для доступа к дэшборду Grafana

Надеюсь, наш опыт и рекомендации окажутся для вас полезными!

Подробнее..

Как в MGA в 5 раз быстрее реализуют проекты при помощи GitLab

11.01.2021 12:12:41 | Автор: admin


Как в MGA в 5 раз быстрее реализуют проекты при помощи GitLab


Благодаря переходу на GitLab в MGA внедрили практики CI/CD, повысили качество ПО, создали процесс обмена знаниями и сэкономили средства.


Oбзор

В MGA перешли на GitLab с целью улучшения качества и сокращения сроков разработки с использованием автоматизированных процессов CI/CD.

Трудности

В MGA искали экономичную Continuous Integration платформу, которая позволила бы усовершенствовать рабочий процесс, расширить знания и повысить качество кода.

Pешение

GitLab EE

Преимущества

  • Автоматические сканеры кода в конвейере CI
  • Улучшенные возможности совместной работы
  • Повышение эффективности операционных процессов
  • Улучшение качества продуктов
  • Простота интегрирования

C 80 до 240 Увеличение объема проектов


10 В 10 раз больший коэффициент успешного выполнения, чем при ручном развертывании CD


80% Экономия времени при переходе на CD


Kлиент Разработчик корпоративного логического ПО


MGA разрабатывает, создает и внедряет компьютерные приложения для крупных и средних коммерческих и промышленных предприятий. Компания MGA, основанная в 1993 году, создала логическое программное обеспечение, которое использует преимущества реляционной базы данных (Oracle), работающей на операционной системе Linux. В 1999 году MGA создала подразделение аутсорсинга и начали предоставлять бухгалтерские услуги, кадровую поддержку и услуги по расчету заработной платы более чем 30 компаниям.

Tрудности Недостатки в совместной работе, поддержке и качестве кода


В MGA сами писали код и использовали Mercurial. Команда разработчиков протестировала бесплатные инструменты, которые позволяли проверять код и поддерживали CI и CD. Это оказалось сложным процессом, так как у программистов не было опыта в использовании подобных инструментов, а поддержка при их установке и применении не предоставлялась. У MGA возникли серьезные проблемы, поскольку Mercurial был слишком сложным, а у разработчиков не хватало опыта в использовании инструментов CI/CD.

ИТ-администраторы были перегружены работой. В команде разработчиков было 25 человек, на которых приходилось всего три системных администратора. Любую связанную с ИТ проблему, возникающую внутри компании, приходилось решать ИТ-администраторам. Не было установленного способа связи между разработчиками и ИТ-отделом, поэтому задержки были обычным делом. В MGA искали инструмент, который позволил бы автоматизировать как можно больше составляющих производства. Также требовалась платформа, которая оптимизировала бы совместную работу для устранения проблемы контроля версий.

Из-за невозможности совместной работы и отсутствия общего доступа к документации снижалось качество кода. Мы начали искать инструменты, которые позволяли бы нам просто осуществлять проверку кода и создавать политику утверждения для управления кодом. Вторым приоритетом было системное использование CI/CD с целью упростить работу и свести к минимуму штат администраторов, рассказывает главный ИТ-администратор Якуб Тадея.

У команд также возникали проблемы с распределением знаний. В MGA справочная информация хранилась на внутренних вики-сайтах, в задачах Redmine, записях от руки и некоторых приложениях. Ресурсы были разрозненны, неорганизованны и их было трудно найти. Новым сотрудникам приходилось самостоятельно разыскивать документацию о внутренних системах. ИТ-специалисты и разработчики MGA теряли время и деньги, не имея подходящих инструментов для решения всех проблем.

Pешение Динамичный инструмент по выгодной цене


В MGA протестировали различные инструменты. Обнаружив простой пользовательский интерфейс GitLab, в компании приняли решение перейти с Mercurial на GitLab. Еще одним аргументом в пользу GitLab был Deviniti официальный партнер GitLab в Польше. Проработав неделю с этим хорошо зарекомендовавшим себя партнером, в MGA окончательно решили продолжить работу с GitLab. Для покупки MGA требовалась польская валюта и польские счета. Большинство польских клиентов ищут местного партнера, который сможет продавать им продукцию, поясняет директор по продажам Deviniti Радослав Косец. Поддержка и знания местных особенностей со стороны Deviniti способствовали быстрому переходу MGA на новую платформу. В MGA до сих пор очень довольны партнерством. Работать с Deviniti одно удовольствие. Рекомендую!, добавляет Тадея.

Тарифный план GitLab подходил MGA больше всего. Это стало важным фактором в принятии окончательного решения. Мы зарабатываем меньше, чем компании на Западе Мы искали решение, которое бы позволило размещать приложения на нашем сервере. Насколько мне известно, GitHub и прочие облачные решения не позволяют этого сделать. Их невозможно использовать локально, поясняет Тадея.

До начала использования GitLab программисты работали в небольших командах над мелкими проектами. Но по мере роста компании увеличивались объемы проектов и численность команд. Внедренные инструменты уже не справлялись с такими масштабами. Благодаря GitLab, создание наших проектов полностью изменилось, утверждает Тадея. Первоначально у нас не было больших ожиданий. Нам просто был нужен новый инструмент, который дает возможность создавать конвейер CI/CD и политику проверку кода. Большего мы не ждали. Однако, как выяснилось, GitLab может предложить намного больше. Постепенно мы начали экспериментировать с функциями, и нам понравилось.

Благодаря GitLab, команды смогли планировать дорожную карту ПО и устанавливать сроки окончания проектов. Мы начали планировать проекты, используя непрерывную интеграцию и развертывание. GitLab полностью изменил архитектуру нашего решения, говорит Тадея.
У CD как минимум в 10 раз больший коэффициент успешного выполнения, чем у развертывания вручную. У нас есть проекты, где ни разу не подвело автоматическое развертывание. Якуб Тадея, Главный ИТ-администратор

Pезультаты Лучшие программы, больше разработчиков и единая база знаний


Успех с самого начала все шло как по маслу. В этом было самое большое преимущество, потому что мы легко установили GitLab и обновили его. Начать работу было очень просто, рассказывает Якуб. Подготовка серверов к переходу на GitLab заняла у MGA примерно неделю. В течение года все проекты перенесли в новый инструмент. Было очень просто начать работу. У нас не возникало никаких проблем, добавил Тадея.

До перехода на GitLab было 3 ИТ-администратора и 30 разработчиков. Теперь у нас более 60 разработчиков, которых легко обслуживают три ИТ-администратора, и много других серверов. Задержки больше не возникают, поскольку большая часть проблем больше не ложится на плечи ИТ-администраторов.

С начала использования GitLab количество проектов увеличилось с 80 до 240. В запущенных проектах все выполняется через CI и CD. По мере необходимости мы просто решаем проблемы и учим разработчиков пользоваться инструментами GitLab, поясняет Тадея. Теперь наша работа более эффективна, и мы можем уделять больше внимания коду, не отвлекаясь на простейшие задачи, которые можно автоматизировать.

Качество программ повышается, так как разработчики имеют возможность повысить качество кода. Я убежден, что мы обеспечиваем гораздо лучшее качество кода, и что еще важнее стала возможной совместная работа по созданию кодов для более крупных проектов, говорит Тадея. Теперь мы можем проверять коды и текстовые заметки, а также делиться ими Я считаю, что это значительно упрощает работу.

Новым сотрудникам теперь гораздо проще войти в курс дела, поскольку MGA все документирует. Разработчики могут проверить конфигурацию CI и, исходя из YML, определить, как все настроено. Каждый программист знает, где найти необходимые знания, что экономит время и избавляет от лишних проблем. Теперь, вместо нескольких недель обучения, адаптация новых сотрудников сводится к тому, чтобы показать им, где стоит кофеварка и где находится туалет, отмечает Якоб.

Благодаря поддержке GitLab, MGA быстрее создает более качественные программы, улучшив процессы тестирования и проверки качества кода. ИТ-специалисты и команды разработчиков стали специалистами в области CI/CD и создают оптимизированные системы автоматизации, при этом сводя к минимуму потребности в ИТ-администрировании и повышая эффективность затрат.

Вся информация и лица, упомянутые в приведенном примере, соответствуют действительности на момент публикации.
Подробнее..

Приглашаем на Live-Вебинар Автоматизация процессов с GitLab CICD 29 Окт., 1500 -1600 (MST)

06.10.2020 12:23:44 | Автор: admin

Расширяем знания и переходим на следующий уровень.




Вы только начинаете изучать основные принципы Continuous Integration / Continuous Delivery или написали уже не один десяток пайплайнов? Вне зависимости от уровня Ваших знаний, присоединяйтесь к нашему вебинару, чтобы на практике разобраться, почему тысячи организаций по всему миру выбирают GitLab в качестве ключевого инструмента для автоматизации IT процессов.

Традиционные инструменты усложняют работу команд, требуют дополнительного внимания для настройки множества плагинов и интеграций и не позволяют по-настоящему масштабировать их использование. Не позволяйте Вашим инструментам тратить Ваше время.

В этом вебинаре мы разберем:
  • Основные элементы автоматизации в GitLab CI/CD
  • Принципы Pipelines-as-Code
  • AutoDevOps автоматический полноценный CI/CD конвейер, который самостоятельно автоматизирует весь процесс
  • Расширенные настройки и оптимизацию GitLab CI/CD

Также мы вметсе на конкретных примерах покажем, как использование GitLab из коробки поможет значительно ускорить цикл разработки программного обеспечения.
Подробнее..

GitLab oпрос ждем Bаших предложений

09.02.2021 20:10:35 | Автор: admin


После успешного live-вебинара на тему Автоматизация процессов с GitLab CI/CD, который мы провели в oктябре, мы хотели бы узнать, какие темы ещё интерeсуют Вас.

Пожалуйста, воспользуйтесь приведенным ниже опросом, чтобы сообщить нам о том, что вы хотели бы услышать во время нашего следующего вебинара. Или просто оставьте свой комментарий с предложениями.

Мы с нетерпением ждем результатов опроса и надеемся также увидеть Вас на нашем следующем мероприятии.
Подробнее..

Приглашаем на Live-Вебинар GitLab Auto DevOps 8. апреля 2021, 1500-1600 МCK

18.03.2021 22:21:23 | Автор: admin


Приглашаем Bас на наш вебинар на тему GitLab Auto DevOps: магия самонастраивающихся пайплайнов.

Владимир Дзалбо, Архитектор Решений компании GitLab, расскажет о том, как функционал GitLab Auto DevOps упрощает процесс описания CI/CD процессов; помогает с изучением и задействованием всех возможностей GitLab как единой платформы для разработки программных продуктов:

  • сборки и тестирования
  • поискa уязвимостей
  • создания релизов
  • выкатa приложений в реальные окружения


Кроме этого мы поговорим, почему Auto DevOps, благодаря своей гибкости это взрослый и готовый для использования в реальных проектах инструмент.

Алексей Ионин, Softmart, сделает обзор типов различных подписок GitLab, действующих на текущий момент, и подробнее остановится на некоторых функциональных особенностях редакции Premium, наиболее востребованных на нашем рынке. Также будут затронуты наиболее острые вопросы лицензирования, которые постоянно возникают у клиентов.

Когда: 8 апреля, 15:00 -16:00 (MSK)
Где: Zoom Вебинар

Зарегистрироваться
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru