Рубрики
Uncategorized

Практические сценарии PowerShell для DevOps — Часть 4

Привет, я вернулся с тобой с частью 4 этой серии. С этой части я покажу вам, как проверить, если … Tagged с PowerShell, DevOps, сценарием.

Практические сценарии для DevOps с PowerShell (4 серии деталей)

Привет, я вернулся с тобой с частью 4 этой серии. С этой частью я покажу вам, как проверить, принадлежит ли конкретная ссылка на GIT определенной папке, а также имеет допустимый формат семантической версии. Этот тип скрипта является коммунальной функцией, которая помогает заполнить пробелы в конкретном сценарии автоматизации, особенно в трубопроводах развертывания. Другой общий термин, используемый для этих сценариев, — Клейкие скрипты Анкет Клей в этом контексте означает заполнение пробела в вашем наборе инструментов пользовательским сценарием и достичь ваших целей.

Как инженеры DevOps, нам нравится использовать полные и зрелые инструменты CI/CD. В течение моей карьеры я использовал различные инструменты CI/CD, такие как Jenkins, TeamCity, Azure DevOps, Octopus Deploy и Github Actions. Хотя все эти инструменты имеют богатый репозиторий официального и поставщика, предоставили задачи/действия, почти все из них имеют общие функции, позволяющие вам запускать свои собственные сценарии. Когда предварительно определенные задачи не допускаются, или вы не можете найти что-то, что делает уловку из коробки, тогда вы вернетесь к своей самой большой силе, написав свой собственный обычай скрипт клея заполнить пробелы.

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

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

Допустим, вы впервые выпускаете продукт или программную службу, ваш типичный номер версии для этого конкретного выпуска может быть 1.0.0 Тогда давайте скажем, что ваш следующий релиз с некоторыми функциями может быть 1.1.0 . Давайте скажем, что вы обнаружили некоторые дефекты и хотите подтолкнуть несколько патчей во второй релиз, затем вы можете назвать свою новую версию как 1.1.1 Анкет Следующий релиз будет 1.2.0 и так далее.

Переходя от 1.x.x к 2.x.x Обозначает основное обновление версии, а затем обозначает изменения, которые являются Майор и отметить, что вы вносите изменения, которые содержит хорошие изменения в программном обеспечении. Это самое простое объяснение семантической версии, и я не могу объяснить, как работает семантическое управление версиями полностью Но я призываю вас проверить эту страницу, чтобы полностью понять ее, и Google еще немного, чтобы узнать об этом. https://semver.org/

Я собираюсь привести примеры от GitHub и Azure DevOps Но я почти уверен, что у всех инструментов CI/CD, который работает с репозиториями GIT, будет что -то подобное.

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

Azure DevOps: https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml

Действия GitHub https://docs.github.com/en/actions/learn-github-actions/environment-variables

Чтобы смоделировать, что у нас есть одна из этих переменных, доступных нам в нашем контексте сценария, мы начнем с примера ввода массива.

$refsInputArray = @("refs/heads/releases/1.0.0",
                    "refs/heads/releases/1.a.0",
                    "refs/heads/releases/1.2.0.5.6.9",
                    "refs/heads/release/1.1.1",
                    "refs/heads/releases/1.0.1",
                    "refs/heads/releases/2.4.3",
                    "refs/heads/main",
                    "refs/heads/develop")

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

Без дальнейшего причитается, давайте придем к нашему заявлению о проблеме и требованиях в сценарии DevOps реального использования.

Проблема

Эй, коллега -инженер DevOps! У нас есть конвейер для сервиса API, который у нас есть, и у нас есть конвейер доставки, который позволяет нам развернуть наш код на нашу платформу для хостинга без сервера из конкретной ветви по нашему выбору.

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

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

Мы хотели бы, чтобы вы написали нам PowerShell Скрипт, чтобы выполнить простой тест, чтобы проверить, если Git Branch Мы запускаем трубопровод, на самом деле придерживается наших правил выпуска, это спасет нас от развертывания неправильного филиала в Производство Окружающая среда.

1- Мы хотели бы, чтобы вы сначала проверили, если ветвь Мы развертываем из IS ine Выпуски/ папка.

2- Мы также хотели бы проверить, действительно ли имя ветви придерживается семантического формата версий.

Как выглядит успех для этого вызова

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

Совет : Выход 0 означает Успешное исполнение а также Выход 1 означает отдел с нездоровым исключением или, другими словами, а неудача Анкет

Но поскольку мы делаем фиктивную проблему, в этом примере я хочу, чтобы вы запустили свой сценарий с примерного массива ввода, который я предоставил выше, а затем просто возвращает соответствующее сообщение к терминалу, в которой указано, выполняет ли входная строка требования или нет Анкет

Успешный пробег:

Некоторые указатели на написание собственного решения

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

Для этого нам нужна часть подстроения между последними двумя / персонажи. Может быть много способов сделать это, поэтому постарайтесь выяснить, как это сделать сначала, как только у вас есть эта часть, вы сможете выполнить сравнение строк, чтобы проверить, равно ли оно выпуски

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

PowerShell, будучи языком сценариев, имеет операторы, чтобы облегчить вашу жизнь и позволить вам достичь этого различными способами, вы можете разработать PowerShell ароматизированный раствор. Самый пуленепробиваемый метод — использовать что -то, что называется Регулярные выражения

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

Я использую второй в разделе https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string

^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$

Вы также можете сценаривать, чтобы у вас была собственная логика, чтобы проверить, это конкретная строка, которую вы имеете, придерживаются формата, рассматривая его компоненты, и если она имеет численные значения, разделенные точками между ними. Тем не менее, обучение регулярному выражению поможет вам в различных сценариях группировки строк и фильтрации в вашей карьере Cloud and DevOps Поэтому я действительно призываю вас учиться и пытаться понять, что они и как они используются.

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

Основные знания от вызова

Основными знаниями этой проблемы являются:

1- Операторы сравнения PowerShell

2- Регулярные выражения

3- PowerShell String Operator Сплит разделить определенную строку на подстроки

4- Массивы PowerShell и как нацеливаться на конкретный индекс массива

Ссылки: Соответствующие операторы

ae_regular_expressions

able_split

о_аррай

Задачи, которые вам нужно выполнить в своем сценарии

Поэтому, чтобы дать еще один разбив того, что вам нужно сделать в своем сценарии,

1- петля через массив ввода, чтобы проверить каждую входную строку индивидуально

2- Выясните способ изолировать подстроение между последними двумя / персонажи проверяют, равно ли это выпуски

3- Выясните способ изолировать подстроение после последней / персонаж и проверьте, есть ли у него действительный формат семантической версии (я рекомендую использовать регулярный шаблон выражения/режима режима для выполнения этого, так как он также знакомился бы с помощью Regex)

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

Последние советы

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

Мой образцеп -раствор

Файлы для моего примера решения

Файлы части 4

Test-semverwithregex.ps1

$refsInputArray = @("refs/heads/releases/1.0.0",
                    "refs/heads/releases/1.a.0",
                    "refs/heads/releases/1.2.0.5.6.9",
                    "refs/heads/release/1.1.1",
                    "refs/heads/releases/1.0.1",
                    "refs/heads/releases/2.4.3",
                    "refs/heads/main",
                    "refs/heads/develop")

#https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
$semVerRegex = '^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$'

$refsInputArray | ForEach-Object {
    $refParts = ($PSItem -split '/')

    if ($refParts[-2] -eq 'releases') {
        if ("$($refParts[-1])" -match $semVerRegex) {
            Write-Host "Reference $($PSItem) is in releases folder and has a correct semver format"
        }
        else {
            Write-Error "Reference $($PSItem) is in releases folder but has an incorrect semver format"
        }
    }
    else {
        Write-Error "Reference $($PSItem) is not in releases folder"
    }
}

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

Образец пробега

Поскольку наш сценарий детерминирован, он всегда должен возвращать один и тот же результат с данным входом.

Вывод

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

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

Это фиктивная задача, чтобы дать вам среду, чтобы выучить навыки, чтобы иметь возможность работать со строками и массивами с PowerShell, но, продолжившие вы, вы увидите, что они пригодятся в разных ситуациях. Я надеюсь, что сегодня смог помочь вам узнать что -то новое о PowerShell, и увидимся на следующем.

Практические сценарии для DevOps с PowerShell (4 серии деталей)

Оригинал: «https://dev.to/mertsenel/practical-powershell-scripting-for-devops-part-4-35j7»