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-latest artifact_name: SoftwareManager-dev-linux asset_name: SoftwareManager-dev-linux - os: windows-latest artifact_name: SoftwareManager-dev-windows.exe asset_name: SoftwareManager-dev-windows.exe - os: macos-latest artifact_name: SoftwareManager-dev-macos asset_name: SoftwareManager-dev-macos runs-on: ${{ matrix.os }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install system dependencies (Linux) if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install -y \ libxcb-xinerama0 \ libxkbcommon-x11-0 \ libxcb-cursor0 \ libxcb-keysyms1 \ libxcb-render-util0 \ libxcb-icccm4 \ libxcb-image0 \ libxcb-shape0 \ libxcb-util1 - name: Install Python dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pyinstaller - name: Inject commit hash into code run: | echo "version = '${GITHUB_SHA}'" > build_info.json - name: Build executable with PyInstaller run: pyinstaller --onefile --windowed --add-data "build_info.json:." --name ${{ env.APP_NAME }} main.py - name: Make executable (Unix) if: runner.os != 'Windows' run: chmod +x dist/${{ env.APP_NAME }} - name: Rename artifact shell: bash run: | cd dist mv ${{ env.APP_NAME }}${{ runner.os == 'Windows' && '.exe' || '' }} ${{ 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-latest if: success() steps: - name: Checkout code uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Display downloaded artifacts run: | echo "Downloaded artifacts:" find artifacts -type f ls -la artifacts/ - name: Generate version id: version run: | COMMIT_SHA=${{ github.sha }} SHORT_SHA=${COMMIT_SHA:0:7} VERSION="${SHORT_SHA}-dev" echo "version=${VERSION}" >> $GITHUB_OUTPUT echo "short_sha=${SHORT_SHA}" >> $GITHUB_OUTPUT echo "Generated version: ${VERSION}" - name: Prepare release files run: | mkdir -p release cp artifacts/ubuntu-latest-build/SoftwareManager-dev-linux release/SoftwareManager-dev-linux cp artifacts/windows-latest-build/SoftwareManager-dev-windows.exe release/SoftwareManager-dev-windows.exe cp artifacts/macos-latest-build/SoftwareManager-dev-macos release/SoftwareManager-dev-macos chmod +x release/SoftwareManager-dev-linux release/SoftwareManager-dev-macos ls -la release/ - name: Create Release (Public) uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.version.outputs.version }} name: ${{ steps.version.outputs.version }} draft: false prerelease: false files: | release/SoftwareManager-dev-linux release/SoftwareManager-dev-windows.exe release/SoftwareManager-dev-macos env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}