Сэкономьте усилия, время и деньги, протестировав конвейеры CI/CD в своей системе.

GitHub Actions — это инструмент, который позволяет разработчикам автоматизировать рабочие процессы, связанные с их репозиториями GitHub. С помощью GitHub Actions разработчики могут создавать, тестировать и развертывать свой код непосредственно из GitHub. Хотя действия GitHub могут быть очень полезными, их также может быть сложно отлаживать, когда что-то идет не так. Когда действие терпит неудачу, может быть сложно понять, что пошло не так и как это исправить, поскольку они могут работать только на Github, и в конечном итоге вы отправляете фиктивные коммиты один за другим для итерации исправления ошибок. Более того, это может быть дорогостоящим, так как Github Actions оплачивается поминутно. В этом посте я расскажу об инструменте под названием Act, который позволяет разработчикам запускать Github Actions локально на вашем компьютере.

Что такое действия Github?

Github Actions — это инструмент (система), разработанный Microsoft для облегчения повседневных задач разработки. Это позволяет интегрировать CI/CD (непрерывную интеграцию/непрерывное развертывание) с существующими рабочими процессами Github. Одним из основных преимуществ GitHub Actions является то, что его очень легко настроить и начать работу даже для разработчиков, которые плохо знакомы с системами CI/CD. Помимо своей простоты, GitHub Actions также относительно недорог по сравнению с другими инструментами CI/CD, что делает его хорошим выбором для разработчиков с ограниченным бюджетом. Еще одним преимуществом GitHub Actions является сильное сообщество пользователей и разработчиков, которые могут предоставить поддержку и рекомендации при работе с инструментом. В целом, GitHub Actions — это мощная и удобная система CI/CD, которая хорошо подходит для разработчиков всех уровней квалификации. На изображении выше вы можете увидеть типичные шаги в системе CI/CD.

Почему их трудно отлаживать?

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

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

Как работает Акт?

Act — это инструмент командной строки, написанный на Go, который точно имитирует собственное поведение Github Actions. Act считывает действия GitHub, определенные в каталоге .github/workflows/, и определяет, какие действия необходимо выполнить на основе зависимостей, определенных в файлах рабочего процесса. . Для выполнения этих действий act использует Docker API для извлечения или создания необходимых образов, как указано в файлах рабочего процесса. После того, как образы подготовлены, act определяет путь выполнения на основе зависимостей, а затем использует Docker API для запуска контейнеров для каждого действия на основе подготовленных образов. Этот процесс очень похож на то, как выполняются действия GitHub, с переменными среды и файловой системой, настроенными в соответствии со средой GitHub. В целом, act предоставляет разработчикам удобный способ локально протестировать и отладить свои действия GitHub перед их развертыванием.

Как установить Акт

Перед установкой Act вам необходимо убедиться, что ваша система соответствует предварительным требованиям. Act использует Docker, поэтому вам нужно убедиться, что он у вас установлен и что в вашем терминале доступна команда docker. Вы можете следовать этим инструкциям по установке Docker в вашей системе: Windows, Linux, macOS.

После установки Docker можно переходить к установке act. Вот инструкции для выбранной вами платформы:

Linux (AUR):yay -Syu act

Linux (COPR):

dnf copr enable rubemlrm/act-cli 
dnf install act-cli

Linux (NIX): nix-env -iA nixpkgs.act

Linux/macOS (скрипт Bash): curl <https://raw.githubusercontent.com/nektos/act/master/install.sh> | sudo bash

macOS (домашнее пиво): brew install act

macOS (MacPorts): port install act

Windows (Chocolatey): choco install act-cli

Windows (Scoop): scoop install act

Если ни один из них не работает для вас, вы всегда можете скачать двоичный файл и указать свой PATH.

Эти инструкции получены в начале 2023 года и могут устареть. За обновлениями обращайтесь к репозиторию проекта.

Как использовать Акт

Чтобы запустить действие Github локально, перейдите в папку проекта (где находится .github/workflows) и запустите:

$ act

Вот оно! По умолчанию он запустит ваше действие push. Чтобы просмотреть все доступные действия, вы можете запустить:

$ act -l

Чтобы выполнить определенное действие, запустите:

$ act <ACTION NAME>

Когда вы запускаете Act в первый раз, вам будет предложено выбрать образ Docker для бегуна. Прочитайте их описания и выберите один в зависимости от того, насколько сложны ваши рабочие процессы. Я выбрал «микро» для своего основного рабочего процесса тестирования JS. Это вывод, который я получил при запуске act в моем проекте React:

[Node.js CI/build] 🚀  Start image=node:16-buster-slim
[Node.js CI/build]   🐳  docker pull image=node:16-buster-slim platform= username= forcePull=false
[Node.js CI/build]   🐳  docker create image=node:16-buster-slim platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[]
[Node.js CI/build]   🐳  docker run image=node:16-buster-slim platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[]
[Node.js CI/build]   ☁  git clone '<https://github.com/actions/setup-node>' # ref=v1
[Node.js CI/build] 🧪  Matrix: map[node-version:18.x]
Node.js CI/build] ⭐ Run Main actions/checkout@v2
[Node.js CI/build]   🐳  docker cp src=/home/mk/Documents/Projects/react-sandbox/. dst=/home/mk/Documents/Projects/react-sandbox
[Node.js CI/build]   ✅  Success - Main actions/checkout@v2
[Node.js CI/build] ⭐ Run Main Use Node.js 18.x
[Node.js CI/build]   🐳  docker cp src=/home/mk/.cache/act/actions-setup-node@v1/ dst=/var/run/act/actions/actions-setup-node@v1/
[Node.js CI/build]   🐳  docker exec cmd=[node /var/run/act/actions/actions-setup-node@v1/dist/index.js] user= workdir=
[Node.js CI/build]   💬  ::debug::isExplicit:
[Node.js CI/build]   💬  ::debug::explicit? false
[Node.js CI/build]   💬  ::debug::evaluating 0 versions
[Node.js CI/build]   💬  ::debug::match not found
[Node.js CI/build]   💬  ::debug::evaluating 553 versions
[Node.js CI/build]   💬  ::debug::matched: v18.12.1
[Node.js CI/build]   💬  ::debug::isExplicit: 18.12.1
[Node.js CI/build]   💬  ::debug::explicit? true
[Node.js CI/build]   💬  ::debug::checking cache: /opt/hostedtoolcache/node/18.12.1/x64
[Node.js CI/build]   💬  ::debug::not found
[Node.js CI/build]   💬  ::debug::Downloading <https://nodejs.org/dist/v18.12.1/node-v18.12.1-linux-x64.tar.gz>
[Node.js CI/build]   💬  ::debug::Destination /tmp/1dd90780-7651-4890-b0f5-5bac82fa4228
[Node.js CI/build]   💬  ::debug::download complete
[Node.js CI/build]   💬  ::debug::Checking tar --version
[Node.js CI/build]   💬  ::debug::tar (GNU tar) 1.30%0ACopyright (C) 2017 Free Software Foundation, Inc.%0ALicense GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.%0AThis is free software: you are free to change and redistribute it.%0AThere is NO WARRANTY, to the extent permitted by law.%0A%0AWritten by John Gilmore and Jay Fenlason.
[Node.js CI/build]   💬  ::debug::Caching tool node 18.12.1 x64
[Node.js CI/build]   💬  ::debug::source dir: /tmp/a6b40c33-d3ce-43a7-b507-023e90ab51c4/node-v18.12.1-linux-x64
[Node.js CI/build]   💬  ::debug::destination /opt/hostedtoolcache/node/18.12.1/x64
[Node.js CI/build]   💬  ::debug::finished caching tool
| [command]/opt/hostedtoolcache/node/18.12.1/x64/bin/node --version
| v18.12.1
| [command]/opt/hostedtoolcache/node/18.12.1/x64/bin/npm --version
| 8.19.2
[Node.js CI/build]   ❓  ##[add-matcher]/run/act/actions/actions-setup-node@v1/.github/tsc.json
[Node.js CI/build]   ❓  ##[add-matcher]/run/act/actions/actions-setup-node@v1/.github/eslint-stylish.json
[Node.js CI/build]   ❓  ##[add-matcher]/run/act/actions/actions-setup-node@v1/.github/eslint-compact.json
[Node.js CI/build]   ✅  Success - Main Use Node.js 18.x
[Node.js CI/build]   ⚙  ::add-path:: /opt/hostedtoolcache/node/18.12.1/x64/bin
[Node.js CI/build] ⭐ Run Main npm ci
[Node.js CI/build]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/2] user= workdir=
| npm WARN deprecated [email protected]: Use your platform's native performance.now() and performance.timeOrigin.
| npm WARN deprecated [email protected]: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
| npm WARN deprecated [email protected]: Please use @jridgewell/sourcemap-codec instead
| npm WARN deprecated [email protected]: Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility>
| npm WARN deprecated [email protected]: This SVGO version is no longer supported. Upgrade to v2.x.x.
|
| added 1467 packages, and audited 1468 packages in 55s
|
| 227 packages are looking for funding
|   run `npm fund` for details
|
| 6 high severity vulnerabilities
|
| To address all issues (including breaking changes), run:
|   npm audit fix --force
|
| Run `npm audit` for details.
[Node.js CI/build]   ✅  Success - Main npm ci
[Node.js CI/build] ⭐ Run Main npm run build --if-present
[Node.js CI/build]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/3] user= workdir=
|
| > [email protected] build
| > react-scripts build
|
| Creating an optimized production build...
| Compiled successfully.
|
| File sizes after gzip:
|
|   46.61 kB  build/static/js/main.56dd61fd.js
|   1.79 kB   build/static/js/787.60ffb363.chunk.js
|   541 B     build/static/css/main.073c9b0a.css
|
| The project was built assuming it is hosted at /.
| You can control this with the homepage field in your package.json.
|
| The build folder is ready to be deployed.
| You may serve it with a static server:
|
|   npm install -g serve
|   serve -s build
|
| Find out more about deployment here:
|
|   <https://cra.link/deployment>
|
[Node.js CI/build]   ✅  Success - Main npm run build --if-present
[Node.js CI/build] ⭐ Run Main npm test
[Node.js CI/build]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/4] user= workdir=
|
| > [email protected] test
| > react-scripts test
|
|  PASS  src/App.test.js
|   ✓ renders learn react link (37 ms)
|
Test Suites: 1 passed, 1 total
| Tests:       1 passed, 1 total
| Snapshots:   0 total
| Time:        1.856 s
| Ran all test suites.
[Node.js CI/build]   ✅  Success - Main npm test
[Node.js CI/build] 🏁  Job succeeded

Вы можете видеть, что Act успешно прочитал мой файл YAML и выполнил базовые тесты JS в контейнере Docker.

Вы также можете добавить свои переменные и секреты Github Actions в Act, чтобы завершить тестирование. Просто поместите их в файл .env (для переменных) и файл .secrets (для секретов) вот так:

SOME_API_KEY=ABCDEF 
ANOTHER_API_KEY=XYZ

За и против

Act — прекрасный инструмент по многим причинам:

  • Гораздо проще, быстрее и дешевле отлаживать действия Github локально, прежде чем отправлять их на сервер.
  • Act работает «из коробки» без дополнительной настройки
  • Точно имитирует поведение Github Actions

Однако у Act есть несколько недостатков, которые могут помешать некоторым разработчикам использовать весь его потенциал:

  • Очень большие размеры образов Docker; полный образ, предназначенный для предоставления всех функций Github Actions, весит более 20 ГБ.
  • Невозможно использовать функцию пользовательских контейнеров; Github позволяет вам использовать пользовательские контейнеры Docker для ваших заданий; вы не можете сделать это с Act
  • Нельзя использовать контейнеры, отличные от Linux; Github позволяет вам использовать контейнеры Windows для своих задач, а Act этого не может.
  • Act не поддерживает контекст Docker, поэтому любые задания, которые полагаются на него, не будут работать.
  • Службы Github Actions не поддерживаются; любая работа, использующая их, потерпит неудачу

Заключение

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