Привет, Хабр. Это статья о том как настроить построение на всех платформах с помощью 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 данная строка говорит о том что нужно запустить работу только после всех билдов(Если что билды идут параллельно), Затем сначала мы скачиваем артефакты, а затем бинарники из них добавляем к релизу
Ссылки
Спасибо за внимание!
