Привет, Хабр. Это статья о том как настроить построение на всех платформах с помощью 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


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

Комментарии (0)