Кросс-платформенная сборка с GitHub Actions

Если проект живет на GitHub, можно за десять минут настроить авто-сборку под основные операционные системы — Windows, Linux и macOS.

Раньше для сборки почти всегда использовали Travis CI, многие по инерции и сейчас так делают. Но есть способ лучше — GitHub Actions.

GitHub Actions — невероятно мощный бесплатный сервис автоматизации любых задач. Грубо говоря, вы выполняете свой код на серверах Гитхаба и делаете там все, что заблагорассудится. Звучит диковато, но открывает бездну возможностей. В том числе — автоматическую сборку проекта под все ОС. Особенно приятно, что можно собирать под Windows.

Вот как это работает:

  1. Создаете файл конфигурации.
mkdir -p .github/workflows
touch .github/workflows/build.yml
  1. Указываете условия запуска сборки.

Например, собирать при каждом коммите:

on: push

Или только из новых тегов:

on:
  push:
    tags:
      - "*"
  1. Перечисляете операционные системы.
runs-on: ${{ matrix.os }}
strategy:
  matrix:
    include:
      - os: ubuntu-latest
      - os: windows-latest
      - os: macos-latest
  1. Указываете шаги сборки.
- uses: actions/checkout@v2

- name: Build for Linux
  if: matrix.os == 'ubuntu-latest'
  run: gcc -fPIC -lm -shared src/stats.c -o dist/sqlite3-stats.so

- name: Build for Windows
  if: matrix.os == 'windows-latest'
  run: gcc -fPIC -lm -shared src/stats.c -o dist/sqlite3-stats.dll

- name: Build for macOS
  if: matrix.os == 'macos-latest'
  run: gcc -fno-common -dynamiclib src/stats.c -o dist/sqlite3-stats.dylib

Действие actions/checkout скачивает исходники, а на остальных шагах выполняются те команды, что указаны по тексту. В примере это сборка исходного кода на C с помощью gcc, но у вашего проекта может быть npm run для JS или tox для Python — то, что обычно используете для сборки.

Если для вашего языка есть стандартный репозиторий пакетов вроде npm или pypi — здесь же можно опубликовать сборку. Если репозитория нет, можно опубликовать прямо на гитхабе с помощью действия svenstaro/upload-release-action:

- name: Upload binaries to release
  uses: svenstaro/upload-release-action@v2
  with:
    repo_token: ${{ secrets.GITHUB_TOKEN }}
    file: dist/${{ matrix.artifact_name }}
    asset_name: ${{ matrix.asset_name }}
    tag: ${{ github.ref }}
  1. Коммитите изменения, пушите и наблюдаете результат на вкладке Actions репозитория на Гитхабе.

⌘ ⌘ ⌘

Готово! Теперь Гитхаб трудится, а вы отдыхаете.

Еще почитать:

Подписывайтесь на канал, чтобы не пропустить новые заметки 🚀