Привет, Хабр. Это статья о том как настроить построение на всех платформах с помощью github actions.
Предыстория
Написал я простенькое приложение на electron, сам я пользовался linux-ом но мой друг предпочитал macos. Когда я попытался скомпилировать на своём компьютере для macos и передал моему другу pkg — Оно не запустилось. В итоге оказалось единственным вариантом скомпилировать приложение для macos это скомпилировать его на macos. Для максимального упрощения задачи я сделал три скрипта: build:linux, build:mac, build:win. В результате после компиляции получались файлы: linux.deb, linux.AppImage, mac.pkg, win.exe. Но оставалось одна проблема нужно было компилировать на разных системах. И тут спасение gihub actions.
Как всё должно будет работать
Я нажимаю кнопку new release на github, а затем магия запускается workflow на github actions он компилирует на всех операционных системах и добавляя бинарники к релизу
Для добавления файлов к release я использовал https://github.com/JasonEtco/upload-to-releas, однако было одна загвоздка с этим действием. Это действие контейнерное, а в github actions контейнерные действия доступны только в linux. Поэтому было решено использовать четыре job-а, 3 для компиляции и 1 для загрузки. Так как для каждой job-ы окружение не сохраняется, по этому для обмена между ними используются артефакты
Практика
Для начала в папке .github/workflows/workflow.yml с содержимым
name: CI
on: release
Ну я думаю понятно что это workflow CI и запускаться он по релизу, а теперь самое важное job
jobs:
build-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Install bluetooth
run: sudo apt-get install -y build-essential libbluetooth-dev
- name: Install dependencies
run: npm install
- name: Build linux
run: npm run build:linux
- name: Creating out
run: |
mkdir out
cp dist/linux.AppImage out/
cp dist/linux.deb out/
- name: Upload build
uses: actions/upload-artifact@master
with:
name: linux
path: out
По шагам jobs: это все работы, build-linux: это работа с названием build-linux, runs-on: ubuntu-latest говорит что нужно запускать всё под последней ubuntu
А дальше самое интересное steps: и всё что под ним это то что будет делать наша работа
Во-первых — uses: ations/checkout@v1 клонирует репозиторий чтобы мы могли его использовать. Следующий шаг Install bluetooth устанавливает блютуз т. к. проект его использует. Далее устанавливается зависимости и происходит билд. Так как после построения в папке dist находятся не только бинарники, но и не нужный мусор, по этому следующим действие происходит создание другой папки в которой лежат только бинарники, а затем их загрузка в артефакты.
Почти то же самое и для win с macos
build-mac:
runs-on: macOS-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
with: node-version: '8.x'
- name: Install dependencies
run: npm install
- name: Build mac
run: npm run build:mac
- name: Creating out
run: |
mkdir out
cp dist/mac.pkg out/
- name: Upload build
uses: actions/upload-artifact@master
with:
name: mac
path: out
build-win:
runs-on: windows-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
with: node-version: '8.x'
- name: Install dependencies
run: npm install
- name: Build win
run: npm run build:win
- name: Creating out
run: |
mkdir out
copy dist\win.exe out\
- name: Upload build
uses: actions/upload-artifact@master
with:
name: win
path: out
Однако стоит отметить некоторые различи. Во-первых, не нужно устанавливать блютуз он уже установлен, Однако нужно установить nodejs для этого используется actions/setup-node. Также в windows используются другие команды на этапе Creating out.
И конечно финальный этап это загрузка файлов в релиз
upload:
runs-on: ubuntu-latest
needs: [build-linux, build-mac, build-win]
steps:
- uses: actions/checkout@v1
- name: Download linux artifact
uses: actions/download-artifact@master
with:
name: linux
- name: Download mac artifact
uses: actions/download-artifact@master
with:
name: mac
- name: Download win artifact
uses: actions/download-artifact@master
with:
name: win
- name: Upload to Release deb
uses: JasonEtco/upload-to-release@v0.1.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
args: linux/linux.deb application/vnd.debian.binary-package
- name: Upload to Release AppImage
uses: JasonEtco/upload-to-release@v0.1.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
args: linux/linux.AppImage application/x-executable
- name: Upload to Release pkg
uses: JasonEtco/upload-to-release@v0.31.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
args: mac/mac.pkg application/x-xar
- name: Upload to Release exe
uses: JasonEtco/upload-to-release@v0.1.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
args: win/win.exe application/octet-stream
Очень важна часть это needs данная строка говорит о том что нужно запустить работу только после всех билдов(Если что билды идут параллельно), Затем сначала мы скачиваем артефакты, а затем бинарники из них добавляем к релизу
Ссылки
Спасибо за внимание!