Github actions и кросс-платформенное построение

от автора

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

Ссылки

Итоговый файл workflow.yml

Репозиторий

Ещё о github actions

Спасибо за внимание!


ссылка на оригинал статьи https://habr.com/ru/post/466501/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *