Transcription
В этом уроке мы научимся применять дополнительные фильтры при работе с ивентами. Для этого давайте создадим новый workflow, в котором мы будем работать. И на данный момент нас интересует Event Push. Именно для этого ивента я сейчас буду создавать фильтр.
Итак, первый фильтр, самый часто используемый на мой взгляд, это branches – это ветки. Мы можем фильтровать по веткам. Очень часто бывает такая практика, что запускать workflow нужно только при пуше на ветку Main, а при работе с любыми другими ветками ничего происходить не должно быть, то есть не должен запускаться workflow. Делается это очень просто: мы должны передать параметр branches и указать, какие ветки. В данном случае я буду указывать ветку Main. Давайте эти ивенты мы временно отсюда удалим, они нам не нужны. Вот такой ивент будет триггерить только тогда, когда мы делаем Push в ветку Main. В любом другом случае она не будет запускаться.
Дальше, следующий параметр, по которому мы можем фильтровать помимо branches, это у нас tags. Мы можем и по тегам, поэтому давайте мы. У нас сейчас тегов нет в репозитории, но мы этот момент не будем тестировать, просто пропишем его, чтобы вы понимали, как это делается. Мы передаём `tags` и в нём мы просто прописываем те теги, по которым мы хотим фильтровать. Предположим, нас интересует первая версия. И такой момент, ребята, здесь ещё очень интересный: мы можем даже использовать некие паттерны, потому что у нас версии могут быть различного вида, например, вот такого, либо вот такого вида. Версия у нас может быть и так далее. И чтобы не прописывать все конкретные версии, нас интересует первая версия и все остальные под-версии, мы можем воспользоваться паттерном и передать вот такую вот звёздочку. Конкретно в нашем случае звёздочка будет отвечать за вот эту часть и за вот эту часть. Имейте это в виду при написании. Вы можете использовать дополнительные паттерны. В документации эти паттерны у нас присутствуют, я вам ссылочку тоже прикреплю к уроку. Вот они, вот список дополнительных символов, которые помогут вам создать эти паттерны. Ну, я дополнительно сейчас вам ещё покажу парочку.
Также бывают задачи, когда нужно исключить конкретную версию. Чтобы исключить в фильтрах, мы используем знак отрицания. Знак отрицания в программировании – это знак `!`. И, конечно же, мы заключим её в кавычки. Пишем знак отрицания, и мы, например, хотим исключить версию `v1.2.1`. Вот при пуше конкретно в этот тег мы не должны запускать данный паттерн. Ну, здесь ещё букву `v` пропустил, потому что предполагается, что именно такой у меня будет тег.
Паттерны можно и здесь использовать при работе с ветками. Обратите внимание, мы создавали в прошлых уроках ветку `page-about`, по-моему, да, `page-about`. И таких веток у нас могут быть много, например, `page-contacts`, `page-blog`. Помимо `page`, могут быть другие ветки, например, какая-то `feature`, да, и `feature-comms`. Не `page`, а `feature`. Если мы хотим сделать триггер на ветку, которая содержит `page`, мы можем поступить следующим образом: мы можем задавать эту ветку с `page-*`, то есть используем здесь тот же паттерн. И в данном случае, когда у нас будет `page-about`, он у нас прекрасно сработает. Кстати, здесь у нас тоже кавычки, мы их пропустили. Давайте их добавим. Значит, вот конкретно такой паттерн будет работать с ветками такого типа, `page-about`, либо с веткой такого типа, либо с веткой такого типа и так далее. Здесь вы уже уловили, то есть под звёздочкой могут быть любые символы.
И есть ещё один момент, ребята. В документации указано, что звёздочка допускает любой символ, кроме слеша. Если у нас будет не страница, а ветка под таким названием `page/category/lifestyle`, например, то она не сработает, потому что здесь присутствует вот этот вот символ. Если наш бранч выглядит таким образом, мы должны здесь поступить немножечко по-другому. В таком случае мы должны задать две звёздочки, и две звёздочки уже позволят вот такие ветки, и будет их прекрасно понимать.
Если есть задача исключить какую-то ветку, например, `page-blog`, я хочу исключить, но она попадает под этот фильтр и она добавляется, значит, используем следующее написание. Пишем саму ветку и добавляем отрицание в начале ветки вот таким вот образом: `!page-blog`. Он будет игнорировать ветку `page-blog`. Но, ребята, когда вы используете такой подход, будьте, пожалуйста, внимательны, потому что здесь идёт логическая последовательность. Если вы эту строчку поставите, например, вот сюда, таким образом, то он это дело проигнорирует. Почему? Потому что он использует все условия разом. Он проверит: "исключить `page-blog`", но потом сразу следующей строкой он увидит: "давай используй ты, пожалуйста, все `page-*`". Поэтому здесь эту строку писать нельзя, её нужно написать после. То есть сначала мы делаем паттерн общего вида, потом из него исключаем, если есть такая необходимость.
Помимо этого способа, мы можем исключить ветки и другим способом, дополнительным параметром `branches-ignore`. Давайте мы воспользуемся `branches-ignore` и передаём, например, вот эту страницу `blog`, точнее ветку `blog`. Но будьте внимательны, ребята, использование `branches-ignore` можно только тогда, когда мы не используем `branches`. То есть, если у нас будет задача при пуше везде, но только кроме `page-blog` ветки, тогда мы используем `branches-ignore`. Во всех других случаях мы используем вот этот первый подход. Даже документация под те, обратите внимание, вы не можете использовать оба `branches` и `branches-ignore` в качестве параметров одного ивента. Поэтому я это дело отсюда убираю, и я показал вам только для демонстрации.
Следующий фильтр, который мы рассмотрим, это `paths`. Он позволяет нам отслеживать изменения в конкретных локациях, конкретных файлов. То есть я могу задать такую опцию, что если изменения будут только в файликах `.html`, тогда мы будем запускать этот workflow. Давайте зададим его, используя `paths`, и далее используем опять же паттерн для написания этого `paths`. Я использую две звёздочки, `*.html`. Значит, какие паттерны используются здесь? Будьте внимательны, они отличаются от паттернов, которые используются для `branches` и `tags`. Для `branches` и `tags` используются паттерны в документации, вот они. А для работы с файлами и каталогами `path` паттерны находятся чуть ниже. Обратите внимание, вот они. Здесь, в моём случае, я хочу выбрать все `.html` файлы, поэтому я использую вот этот паттерн, и независимо в каком каталоге он будет, в корне либо в каком-то вложенном каталоге. Помните об этом, и когда вы будете работать, вы всегда вернётесь в эту документацию и будете знать, что для веток и тегов используется одна таблица паттернов, для `paths` используется другая таблица. Вернёмся обратно.
Замечательно. Но теперь такой момент: если я сейчас запущу этот workflow, он у меня никак не сработает, потому что все условия, которые мы здесь прописываем, они все должны соответствовать. То есть они используют условие "и", то есть не "или", не "или", а только всё вместе. Поэтому, чтобы это условие плюс-минус было выполнимо, я как минимум должен теги убрать, потому что у меня теги не используются. Ветки мы не будем убирать, поскольку они как раз что и позволяют нам либо в Main был пуш, либо в другую ветку. Тут логическая связь скорее идёт между `branches`, `tags` и `paths`. Вот сейчас наш триггер будет отслеживать только изменения в `.html` файле и Push на ветку Main. Если я сейчас просто закомичу и запушу этот файл, у меня workflow конкретный вот этот, шестой, не должен запускаться. Но если буду редактировать индексный файл и опять же запушу, тогда он должен запуститься, потому что в этом случае сработают оба фильтра. Либо запущу в `page-about` и редактирую тоже какой-то `.html` файл, тогда он тоже запустится. То есть любой из этих условий одновременно с этим условием.
Давайте мы это протестируем. Перейдём в наш репозиторий и отключим пятый workflow, чтобы он не выполнялся. Вернёмся в репозиторий и закоммитим и запушим этот шестой workflow. Напоминаю, по логике, сейчас, если мы всё сделали правильно, не должно запускаться экшена. Обновляем вкладку Actions. Как мы видим, у нас экшенов нету. То есть коммит у нас только что был. Давайте даже посмотрим, видите, вот весь наш новый workflow, но экшен не запустился. Почему? Потому что мы не редактировали `.html` файл. Мы по условию не попадаем в необходимый нам триггер.
Давайте отредактируем `.html`. Редактируем `.html` файл, запускаем новый коммит и Push. Переходим в репозиторий, вкладка Actions. Вот сейчас, как мы видим, мы соответствуем условию, и у нас запускается. Указывается также ветка наша, да, запускается наш workflow, который уже успешно выполнен. Вот такой нехитрый способ можно применять для фильтрации и создавать более кастомные фильтры.