HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Локальный запуск тестов - персональная ответственность. Хорошие разработчики используют тесты непрерывно во время разработки и обязательно запускают их перед пушем (git push).</p>
1 <p>Локальный запуск тестов - персональная ответственность. Хорошие разработчики используют тесты непрерывно во время разработки и обязательно запускают их перед пушем (git push).</p>
2 <p>Но этого недостаточно. Там, где есть люди, присутствует человеческий фактор и ошибки. Поэтому, даже несмотря на локальный запуск, тесты должны запускаться автоматически на серверах непрерывной интеграции.</p>
2 <p>Но этого недостаточно. Там, где есть люди, присутствует человеческий фактор и ошибки. Поэтому, даже несмотря на локальный запуск, тесты должны запускаться автоматически на серверах непрерывной интеграции.</p>
3 <p>Непрерывная интеграция - практика разработки, которая заключается в частой автоматизированной сборке приложения для быстрого выявления проблем. Обычно интеграция выполняется на коммиты в репозиторий. За этим следит либо специальный сервер, либо сервис непрерывной интеграции. Он загружает код, собирает его (если это нужно для текущего приложения) и запускает различные проверки. Что и как запускать - определяется программистом. В первую очередь это тесты и линтер (проверка оформления кода). Кроме них могут запускаться утилиты, анализирующие безопасность, актуальность зависимостей и многое другое.</p>
3 <p>Непрерывная интеграция - практика разработки, которая заключается в частой автоматизированной сборке приложения для быстрого выявления проблем. Обычно интеграция выполняется на коммиты в репозиторий. За этим следит либо специальный сервер, либо сервис непрерывной интеграции. Он загружает код, собирает его (если это нужно для текущего приложения) и запускает различные проверки. Что и как запускать - определяется программистом. В первую очередь это тесты и линтер (проверка оформления кода). Кроме них могут запускаться утилиты, анализирующие безопасность, актуальность зависимостей и многое другое.</p>
4 <p>Немного терминологии и описание процесса. На каждый коммит запускается сборка (build). Во время сборки собирается приложение, устанавливаются зависимости, прогоняются тесты и все остальные проверки. Сборка, завершившаяся без ошибок, считается успешной. Если сборка не проходит, то программист получает уведомление. Дальше он смотрит отчёт и исправляет ошибки.</p>
4 <p>Немного терминологии и описание процесса. На каждый коммит запускается сборка (build). Во время сборки собирается приложение, устанавливаются зависимости, прогоняются тесты и все остальные проверки. Сборка, завершившаяся без ошибок, считается успешной. Если сборка не проходит, то программист получает уведомление. Дальше он смотрит отчёт и исправляет ошибки.</p>
5 <p>Для внедрения непрерывной интеграции есть два пути. Первый, поставить себе на сервер Jenkins или его аналог. Этот вариант требует много ручной работы (плюс поддержка сервера). Он подходит компаниям, в которых очень сложные приложения, или они не хотят допускать утечки кода наружу, или у них настолько много проектов, что свой сервер дешевле, чем стороннее решение. Второй путь - воспользоваться сервисом непрерывной интеграции. Таких сервисов десятки, если не сотни. Есть из чего выбрать. Как правило, большинство из них бесплатны для открытых проектов.</p>
5 <p>Для внедрения непрерывной интеграции есть два пути. Первый, поставить себе на сервер Jenkins или его аналог. Этот вариант требует много ручной работы (плюс поддержка сервера). Он подходит компаниям, в которых очень сложные приложения, или они не хотят допускать утечки кода наружу, или у них настолько много проектов, что свой сервер дешевле, чем стороннее решение. Второй путь - воспользоваться сервисом непрерывной интеграции. Таких сервисов десятки, если не сотни. Есть из чего выбрать. Как правило, большинство из них бесплатны для открытых проектов.</p>
6 <h2>Github Actions</h2>
6 <h2>Github Actions</h2>
7 <p>GitHub Actions - бесплатная система, которая позволяет автоматизировать какие-либо действия, важные для процесса разработки. Она обеспечивает непрерывную интеграцию (но может гораздо больше). Хекслет использует Actions во всех своих открытых и закрытых проектах (<a>пример</a>). С её помощью можно запускать определенный код каждый раз, когда происходит некое событие.</p>
7 <p>GitHub Actions - бесплатная система, которая позволяет автоматизировать какие-либо действия, важные для процесса разработки. Она обеспечивает непрерывную интеграцию (но может гораздо больше). Хекслет использует Actions во всех своих открытых и закрытых проектах (<a>пример</a>). С её помощью можно запускать определенный код каждый раз, когда происходит некое событие.</p>
8 <p>Например:</p>
8 <p>Например:</p>
9 <ul><li>запустить проверку кода линтером и тестами</li>
9 <ul><li>запустить проверку кода линтером и тестами</li>
10 <li>отправить код на сервер (деплой)</li>
10 <li>отправить код на сервер (деплой)</li>
11 <li>подключить оповещения в мессенджер о событиях в репозитории (новые issue, PR)</li>
11 <li>подключить оповещения в мессенджер о событиях в репозитории (новые issue, PR)</li>
12 <li>и многое другое</li>
12 <li>и многое другое</li>
13 </ul><p>В этом уроке мы разберёмся в основных концепциях системы, а затем рассмотрим пример настройки, чтобы быстро начать работу с Actions в своём репозитории.</p>
13 </ul><p>В этом уроке мы разберёмся в основных концепциях системы, а затем рассмотрим пример настройки, чтобы быстро начать работу с Actions в своём репозитории.</p>
14 <p>Для удобства, GitHub Action предоставляет "бейджик" - картинку, которая вставляется в файл проекта<em>README.md</em>. Она показывает текущий статус проекта (успешно завершено последнее задание или нет), и по клику на неё можно попасть на страницу с результатами выполнения задания.</p>
14 <p>Для удобства, GitHub Action предоставляет "бейджик" - картинку, которая вставляется в файл проекта<em>README.md</em>. Она показывает текущий статус проекта (успешно завершено последнее задание или нет), и по клику на неё можно попасть на страницу с результатами выполнения задания.</p>
15 <h3>Основные понятия</h3>
15 <h3>Основные понятия</h3>
16 <p>Начнём с основ. На картинке ниже показаны основные концепции GitHub Actions. Разберем их по порядку.</p>
16 <p>Начнём с основ. На картинке ниже показаны основные концепции GitHub Actions. Разберем их по порядку.</p>
17 <ul><li><p>Воркфлоу / Workflows</p>
17 <ul><li><p>Воркфлоу / Workflows</p>
18 <p>Каждый репозиторий на GitHub может содержать один или несколько воркфлоу. Каждый воркфлоу определяется в отдельном файле конфигурации в каталоге репозитория<em>.github/workflows</em>. Несколько воркфлоу могут выполняться параллельно.</p>
18 <p>Каждый репозиторий на GitHub может содержать один или несколько воркфлоу. Каждый воркфлоу определяется в отдельном файле конфигурации в каталоге репозитория<em>.github/workflows</em>. Несколько воркфлоу могут выполняться параллельно.</p>
19 </li>
19 </li>
20 <li><p>События / Events</p>
20 <li><p>События / Events</p>
21 <p>Воркфлоу может запускаться одним или несколькими событиями. Это могут быть внутренние события GitHub (например, пуш, релиз или пул-реквест), запланированные события (запускаются в определенное время - например, cron), или произвольными внешними событиями (запускаются вызовом Webhook API GitHub).</p>
21 <p>Воркфлоу может запускаться одним или несколькими событиями. Это могут быть внутренние события GitHub (например, пуш, релиз или пул-реквест), запланированные события (запускаются в определенное время - например, cron), или произвольными внешними событиями (запускаются вызовом Webhook API GitHub).</p>
22 </li>
22 </li>
23 <li><p>Задания / Jobs</p>
23 <li><p>Задания / Jobs</p>
24 <p>Воркфлоу состоит из одного или нескольких заданий. Задание содержит набор команд, которые запускаются вместе с рабочим процессом. По умолчанию при запуске воркфлоу все его задания выполняются параллельно, однако между ними можно определить зависимость, чтобы они выполнялись последовательно.</p>
24 <p>Воркфлоу состоит из одного или нескольких заданий. Задание содержит набор команд, которые запускаются вместе с рабочим процессом. По умолчанию при запуске воркфлоу все его задания выполняются параллельно, однако между ними можно определить зависимость, чтобы они выполнялись последовательно.</p>
25 </li>
25 </li>
26 <li><p>Раннеры / Runners</p>
26 <li><p>Раннеры / Runners</p>
27 <p>Каждое задание выполняется на определённом раннере, - временном сервере на GitHub с выбранной операционной системой (Linux, macOS или Windows). Также существуют<a>автономные раннеры</a>, которые позволяют создать своё окружение для выполнения экшена.</p>
27 <p>Каждое задание выполняется на определённом раннере, - временном сервере на GitHub с выбранной операционной системой (Linux, macOS или Windows). Также существуют<a>автономные раннеры</a>, которые позволяют создать своё окружение для выполнения экшена.</p>
28 </li>
28 </li>
29 <li><p>Шаги / Steps</p>
29 <li><p>Шаги / Steps</p>
30 <p>Задания состоят из последовательности шагов. Шаг - это либо команда оболочки (shell command), либо экшен (action). Все шаги задания выполняются последовательно на раннере, связанном с заданием. По умолчанию в случае сбоя шага все следующие шаги задания пропускаются.</p>
30 <p>Задания состоят из последовательности шагов. Шаг - это либо команда оболочки (shell command), либо экшен (action). Все шаги задания выполняются последовательно на раннере, связанном с заданием. По умолчанию в случае сбоя шага все следующие шаги задания пропускаются.</p>
31 </li>
31 </li>
32 <li><p>Экшен / Actions</p>
32 <li><p>Экшен / Actions</p>
33 <p>Экшен - многократно используемый блок кода, который может служить шагом задания. Каждый экшен может принимать на вход параметры и создавать любые значения, которые затем можно использовать в других экшенах. Разработчики могут создавать собственные экшены или использовать опубликованные сообществом GitHub. Общих экшенов около тысячи, все они доступны на<a>GitHub Marketplace</a>.</p>
33 <p>Экшен - многократно используемый блок кода, который может служить шагом задания. Каждый экшен может принимать на вход параметры и создавать любые значения, которые затем можно использовать в других экшенах. Разработчики могут создавать собственные экшены или использовать опубликованные сообществом GitHub. Общих экшенов около тысячи, все они доступны на<a>GitHub Marketplace</a>.</p>
34 </li>
34 </li>
35 </ul><h3>Пример воркфлоу. Hello, World!</h3>
35 </ul><h3>Пример воркфлоу. Hello, World!</h3>
36 <p>Этот воркфлоу не делает ничего особенного - он просто показывает фразу<em>Hello, World!</em>в стандартном выводе runner всякий раз, когда происходит отправка кода в репозиторий. Вот как выглядит код этого воркфлоу:</p>
36 <p>Этот воркфлоу не делает ничего особенного - он просто показывает фразу<em>Hello, World!</em>в стандартном выводе runner всякий раз, когда происходит отправка кода в репозиторий. Вот как выглядит код этого воркфлоу:</p>
37 <p>Разберём его в деталях:</p>
37 <p>Разберём его в деталях:</p>
38 <ul><li>Имя воркфлоу hello-world, определяется полем<a>name</a>.</li>
38 <ul><li>Имя воркфлоу hello-world, определяется полем<a>name</a>.</li>
39 <li>Воркфлоу запускается событием<a>push</a>, которое определяет поле<a>on</a>.</li>
39 <li>Воркфлоу запускается событием<a>push</a>, которое определяет поле<a>on</a>.</li>
40 <li>Воркфлоу содержит одно задание с идентификатором my-job - в нём указано имя задания.</li>
40 <li>Воркфлоу содержит одно задание с идентификатором my-job - в нём указано имя задания.</li>
41 <li>В задании my-job используется runner ubuntu-latest из GitHub Marketplace - он определяется полем<a>runs-on</a>.</li>
41 <li>В задании my-job используется runner ubuntu-latest из GitHub Marketplace - он определяется полем<a>runs-on</a>.</li>
42 <li>Задание my-job содержит один шаг с именем my-step. На этом шаге выполняется<a>команда оболочки</a><em>echo</em>- в нашем случае это<em>"Hello World!"</em>.</li>
42 <li>Задание my-job содержит один шаг с именем my-step. На этом шаге выполняется<a>команда оболочки</a><em>echo</em>- в нашем случае это<em>"Hello World!"</em>.</li>
43 </ul><p><em>Все элементы синтаксиса для определения воркфлоу можно найти на странице<a>справки по синтаксису воркфлоу в документации</a>GitHub Actions.</em></p>
43 </ul><p><em>Все элементы синтаксиса для определения воркфлоу можно найти на странице<a>справки по синтаксису воркфлоу в документации</a>GitHub Actions.</em></p>
44 <p>Практическая польза от этого воркфлоу минимальна, но он нужен для тренировки: попробуем интегрировать его в репозиторий на GitHub. Сначала в репозитории нужно создать каталог с именем<em>.github/workflows</em>, а затем скопировать в него указанный выше код, сохранить и отправить изменения на GitHub.</p>
44 <p>Практическая польза от этого воркфлоу минимальна, но он нужен для тренировки: попробуем интегрировать его в репозиторий на GitHub. Сначала в репозитории нужно создать каталог с именем<em>.github/workflows</em>, а затем скопировать в него указанный выше код, сохранить и отправить изменения на GitHub.</p>
45 <p>Затем переходим во вкладку actions и в левой части экрана в списке рабочих процессов ищем "hello-world". Воркфлоу запускается при пуше - информация об этом показана в правой части экрана.</p>
45 <p>Затем переходим во вкладку actions и в левой части экрана в списке рабочих процессов ищем "hello-world". Воркфлоу запускается при пуше - информация об этом показана в правой части экрана.</p>
46 <p>Теперь каждый раз при пуше в репозиторий на GitHub этот воркфлоу будет запускаться автоматически, а информация об этом появится в правой верхней части экрана.</p>
46 <p>Теперь каждый раз при пуше в репозиторий на GitHub этот воркфлоу будет запускаться автоматически, а информация об этом появится в правой верхней части экрана.</p>
47 <p>Если вы хотите проверить корректность запуска, откройте уведомление - на новом экране будет показаны все задания воркфлоу, а при нажатии на my-job - все детали заданий.</p>
47 <p>Если вы хотите проверить корректность запуска, откройте уведомление - на новом экране будет показаны все задания воркфлоу, а при нажатии на my-job - все детали заданий.</p>
48 <p>Процесс состоит из трёх шагов: set up job, my-step и complete job. Первый и последний добавляются автоматически, а my-step определяется при создании воркфлоу.</p>
48 <p>Процесс состоит из трёх шагов: set up job, my-step и complete job. Первый и последний добавляются автоматически, а my-step определяется при создании воркфлоу.</p>
49 <p>На каждый шаг можно кликнуть и получить дополнительную информацию о нем:</p>
49 <p>На каждый шаг можно кликнуть и получить дополнительную информацию о нем:</p>
50 <p>На этом всё - вы только что создали и запустили первый воркфлоу в GitHub Actions.</p>
50 <p>На этом всё - вы только что создали и запустили первый воркфлоу в GitHub Actions.</p>
51 <p>Не стоит останавливаться на достигнутом: этот воркфлоу можно адаптировать для вашего сценария. Например, если вы делаете проект на Хекслете, то можете сделать запуск команд из<em>Makefile</em>на каждый пуш в GitHub.</p>
51 <p>Не стоит останавливаться на достигнутом: этот воркфлоу можно адаптировать для вашего сценария. Например, если вы делаете проект на Хекслете, то можете сделать запуск команд из<em>Makefile</em>на каждый пуш в GitHub.</p>