name: Build Executables (Dev) on: push: branches: - main workflow_dispatch: inputs: version: description: "Dev release version (e.g., v1.0.0-dev)" required: true default: "v1.0.0" permissions: contents: write env: PYTHON_VERSION: "3.12" APP_NAME: "SoftwareManager" jobs: build: name: Build ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-22.04 artifact_name: SoftwareManager-dev-${{ github.sha }}-linux asset_name: SoftwareManager-dev-${{ github.sha }}-linux - os: windows-latest artifact_name: SoftwareManager-dev-${{ github.sha }}-windows.exe asset_name: SoftwareManager-dev-${{ github.sha }}-windows.exe - os: macos-latest artifact_name: SoftwareManager-dev-${{ github.sha }}-macos asset_name: SoftwareManager-dev-${{ github.sha }}-macos runs-on: ${{ matrix.os }} outputs: version: ${{ steps.version.outputs.version }} short_sha: ${{ steps.version.outputs.short_sha }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v6 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install uv uses: astral-sh/setup-uv@v7 with: version: "0.9.7" enable-cache: true - name: Install Python dependencies run: | uv pip install -r requirements.txt uv pip install nuitka env: UV_SYSTEM_PYTHON: 1 - name: Generate version id: version shell: bash run: | COMMIT_SHA=${{ github.sha }} SHORT_SHA=${COMMIT_SHA:0:7} VERSION="${SHORT_SHA}-dev" echo "VERSION=$VERSION" >> $GITHUB_ENV echo "version=$VERSION" >> $GITHUB_OUTPUT echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT echo "Generated version: $VERSION" - name: Inject commit hash into code shell: bash run: | cat > build_info.json << EOF { "version": "${{ env.VERSION }}" } EOF - name: Install UPX shell: bash run: | if [ "$RUNNER_OS" == "Windows" ]; then curl -sL https://github.com/upx/upx/releases/download/v5.1.0/upx-5.1.0-win64.zip -o upx.zip 7z x upx.zip -oupx-dir echo "$(pwd)/upx-dir" >> $GITHUB_PATH elif [ "$RUNNER_OS" == "Linux" ]; then curl -sL https://github.com/upx/upx/releases/download/v5.1.0/upx-5.1.0-amd64_linux.tar.xz -o upx.tar.xz tar xf upx.tar.xz echo "$(pwd)/upx-5.1.0-amd64_linux" >> $GITHUB_PATH else brew install upx fi upx --version | head -1 - name: Build with Nuitka (Windows) if: runner.os == 'Windows' shell: bash run: | python -m nuitka \ --onefile \ --onefile-no-compression \ --onefile-tempdir-spec="{CACHE_DIR}/${{ env.APP_NAME }}/${{ env.VERSION }}" \ --windows-console-mode=disable \ --enable-plugin=pyside6 \ --enable-plugin=upx \ --include-data-dir=core/interface/assets=core/interface/assets \ --include-data-files=build_info.json=build_info.json \ --include-data-files=build_info.json=core/build_info.json \ --include-data-files=build_info.json=core/interface/build_info.json \ --output-filename=${{ env.APP_NAME }}.exe \ main.py - name: Build with Nuitka (Unix) if: runner.os != 'Windows' shell: bash run: | python -m nuitka \ --onefile \ --onefile-no-compression \ --onefile-tempdir-spec="{CACHE_DIR}/${{ env.APP_NAME }}/${{ env.VERSION }}" \ --enable-plugin=pyside6 \ --enable-plugin=upx \ --include-data-dir=core/interface/assets=core/interface/assets \ --include-data-files=build_info.json=build_info.json \ --include-data-files=build_info.json=core/build_info.json \ --include-data-files=build_info.json=core/interface/build_info.json \ --output-filename=${{ env.APP_NAME }} \ main.py - name: Prepare artifact shell: bash run: | mkdir -p dist if [ "$RUNNER_OS" == "Windows" ]; then mv ${{ env.APP_NAME }}.exe dist/${{ matrix.artifact_name }} else mv ${{ env.APP_NAME }} dist/${{ matrix.artifact_name }} chmod +x dist/${{ matrix.artifact_name }} fi ls -la dist/ - name: Upload build artifact uses: actions/upload-artifact@v4 with: name: ${{ matrix.os }}-build path: dist/${{ matrix.artifact_name }} retention-days: 1 release: name: Create Release needs: build runs-on: ubuntu-22.04 if: success() steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: path: artifacts - name: Prepare release files run: | mkdir -p release SHORT_SHA="${{ needs.build.outputs.short_sha }}" cp artifacts/ubuntu-22.04-build/SoftwareManager-dev-*-linux release/SoftwareManager-dev-${SHORT_SHA}-linux cp artifacts/windows-latest-build/SoftwareManager-dev-*-windows.exe release/SoftwareManager-dev-${SHORT_SHA}-windows.exe cp artifacts/macos-latest-build/SoftwareManager-dev-*-macos release/SoftwareManager-dev-${SHORT_SHA}-macos chmod +x release/SoftwareManager-dev-*-linux release/SoftwareManager-dev-*-macos ls -la release/ - name: Generate release notes run: | SHORT_SHA="${{ needs.build.outputs.short_sha }}" cat > release_notes.md << EOF ## Development Build **Commit:** [\`${SHORT_SHA}\`](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) ### Changes $(git log -1 --pretty=format:"- %s" ${{ github.sha }}) ### Downloads - Linux: \`SoftwareManager-dev-${SHORT_SHA}-linux\` - Windows: \`SoftwareManager-dev-${SHORT_SHA}-windows.exe\` - macOS: \`SoftwareManager-dev-${SHORT_SHA}-macos\` EOF cat release_notes.md - name: Create Release (Public) uses: softprops/action-gh-release@v2 with: tag_name: ${{ needs.build.outputs.version }} name: ${{ needs.build.outputs.version }} body_path: release_notes.md files: | release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-linux release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-windows.exe release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-macos env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}