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.11" 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.zip asset_name: SoftwareManager-dev-${{ github.sha }}-windows.zip - 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 pyinstaller backports.tarfile pillow 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: Build executable with PyInstaller (Windows) if: runner.os == 'Windows' shell: bash run: | pyinstaller --onedir --windowed \ --add-data "build_info.json;." \ --add-data "build_info.json;core" \ --add-data "build_info.json;core/interface" \ --add-data "core/interface/assets;core/interface/assets" \ --icon "core/interface/assets/logo.png" \ --exclude-module PyQt6 \ --exclude-module PyQt5 \ --hidden-import=backports.tarfile \ --hidden-import=backports \ --hidden-import=jaraco.context \ --hidden-import=jaraco.text \ --hidden-import=jaraco.functools \ --name ${{ env.APP_NAME }} \ main.py - name: Build executable with PyInstaller (Unix) if: runner.os != 'Windows' shell: bash run: | pyinstaller --onefile --windowed \ --add-data "build_info.json:." \ --add-data "build_info.json:core" \ --add-data "build_info.json:core/interface" \ --add-data "core/interface/assets:core/interface/assets" \ --icon "core/interface/assets/logo.png" \ --exclude-module PyQt6 \ --exclude-module PyQt5 \ --hidden-import=backports.tarfile \ --hidden-import=backports \ --hidden-import=jaraco.context \ --hidden-import=jaraco.text \ --hidden-import=jaraco.functools \ --name ${{ env.APP_NAME }} \ main.py - name: Package and rename artifact (Windows) if: runner.os == 'Windows' shell: powershell run: | cd dist Compress-Archive -Path '${{ env.APP_NAME }}' -DestinationPath '${{ matrix.artifact_name }}' ls -la - name: Rename artifact (Unix) if: runner.os != 'Windows' shell: bash run: | cd dist chmod +x ${{ env.APP_NAME }} mv ${{ env.APP_NAME }} ${{ matrix.artifact_name }} ls -la - 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.zip release/SoftwareManager-dev-${SHORT_SHA}-windows.zip 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.zip\` - 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.zip release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-macos env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}