Python向けGUIフレームワークFletで作成したアプリをGithub ActionとGithub CLIを使ってクロスプラットフォームビルドする

当サイトではアフィリエイト広告を利用しています

以前FletというPython向けGUIフレームワークを使ってGUIアプリケーションを作成し、公開しました。

このアプリケーションは筆者の環境の都合でWindows向けとしてリリースしましたが、今回Github Actionsを用いてWindows/Mac/Linuxのクロスプラットフォームに対応させることができました。

ただ、ReleaseのAsset Uploadで時間を取られましたので、同じ轍を踏まないように記録しておきます。

対象のアプリケーション

以下で作成したFlet製GUIアプリケーションを対象にGithub Actionsを作成します。

Actionsにおいて、バージョンを指定するタグがプッシュされた際にWindows/Mac/Linux向けに実行ファイルをビルドして、Releaseを作成して3つの実行ファイルをアップロードすることを想定しています。

嵌ったポイント

最終的にはReleaseの作成でGithub Actions内でGithub CLIを使うことに落ち着いたのですが、それまで以下ので嵌りました。

まずGithub公式Actionのupload-release-assetはPublic Archiveになっているにもかかわらず利用している人が多いです。そのまま利用してもよいのですが、すでにメンテが停止して数年たっているものを使い続けるリスクがあり、今回は回避することにしました。

上記公式Actionで紹介されているMaintained Actionsとして第三者action-gh-releaseというリポジトリがあるのですが、自分の環境だとビルドしたファイルをアップロードできなかったです。実行ファイルがあるにも関わらずアップロードできないという問題を解決できませんでした。

REST APIを使うことも考えましたが、すべてのGithub ActionsでプリインストールされているGithub CLIを使うとだいぶ手軽に解決できました。

Github Actionsのコード

.github/workflows/build-flet-cross.ymlとして以下を用意しました。

v*というタグがプッシュされたときにクロスプラットフォームでビルドを行い、Draft Releaseを作成するというものになっています。

最終的に手動でファイルを確認して問題がなければReleaseを公開するという方針にしております。

ここでGithub CLIのgh release creategh release uploadを用いることでかなり手軽にReleaseの作成と実行ファイルのアップロードが行えています。

name: build-flet-cross
on:
  push:
    tags:
      - "v*"

jobs:
  create-release:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
      - name: "Create Release"
        run: gh release create ${{github.ref_name}} --draft --verify-tag --notes "Release ${{github.ref_name}}"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  cross-build:
    needs: create-release
    strategy:
      matrix:
        include:
          - runs-on: ubuntu-latest
            flet-name: myapp_linux
            binary-name: myapp_linux.tar.gz
          - runs-on: macos-latest
            flet-name: myapp_macos
            binary-name: myapp_maco.tar.gz
          - runs-on: windows-latest
            flet-name: myapp_windows
            binary-name: myapp_windows.zip
    runs-on: ${{ matrix.runs-on }}
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v4
        with:
          python-version: 3.9
          cache: "pip"
      - run: pip install -r requirements.txt
      - run: flet pack app.py --name ${{ matrix.flet-name }}
      - name: "Linux/MacOS compress"
        if: runner.os != 'Windows'
        run: tar zcvf ${{matrix.binary-name}} dist
      - name: "Windows compress"
        if: runner.os == 'Windows'
        run: powershell Compress-Archive -Path dist -DestinationPath ${{matrix.binary-name}}
      - name: "Upload Release"
        run: gh release upload ${{github.ref_name}} ${{matrix.binary-name}}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

また、Flet製アプリケーションをビルドするためにリポジトリでrequirements.txtを作成しておく必要があります。poetryで環境を管理しているので以下を実行してリポジトリに追加しておきます。

poetry export --without-hashes --format requirements.txt --output requirements.txt

公開したソフトウェア

以下のGithubリポジトリで今回の対象となったGUIソフトウェアを公開しております。

無事version0.1.6よりGithub Actions製アプリケーションをWindows/Mac/Linuxの3環境でAssetsに追加できています。

すべての環境での動作確認はMacなどが手持ちにないので未実施できませんが、ひとまずWindowsではActions製のアプリが動作することは確認できました。

まとめ

  • Python&Flet製アプリケーションのクロスプラットフォームビルドを実施
  • Github ActionsとGithub CLIを利用することで実施できた
  • 無事、Releaseが生成されることを確認できた