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 create
とgh 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が生成されることを確認できた