name: Release on: push: tags: - 'v*' workflow_dispatch: inputs: tag: description: 'Release tag' required: true type: string is_prerelease: description: 'Pre-release' required: false type: boolean default: false env: DOTNET_VERSION: '10.0.x' Solution_Name: LanMountainDesktop.sln jobs: prepare: runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.version }} tag: ${{ steps.version.outputs.tag }} steps: - name: Get release info id: version run: | if [[ "${{ github.event_name }}" == "push" ]]; then TAG=${GITHUB_REF#refs/tags/} else TAG=${{ github.event.inputs.tag }} fi VERSION=${TAG#v} echo "tag=${TAG}" >> $GITHUB_OUTPUT echo "version=${VERSION}" >> $GITHUB_OUTPUT build-windows: needs: prepare runs-on: windows-latest strategy: matrix: arch: [x64, x86] name: Build_Windows_${{ matrix.arch }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || github.ref }} - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Update version in .csproj run: | $VERSION = "${{ needs.prepare.outputs.version }}" $csprojFiles = @( "LanMountainDesktop/LanMountainDesktop.csproj", "LanMountainDesktop.RecommendationBackend/LanMountainDesktop.RecommendationBackend.csproj" ) foreach ($csprojPath in $csprojFiles) { Write-Host "Updating version in $csprojPath to $VERSION" $content = Get-Content $csprojPath -Raw $content = $content -replace '.*?', "$VERSION" Set-Content $csprojPath $content } shell: pwsh - name: Restore run: dotnet restore ${{ env.Solution_Name }} - name: Build run: dotnet build ${{ env.Solution_Name }} -c Release --no-restore -v minimal - name: Publish run: | dotnet publish LanMountainDesktop/LanMountainDesktop.csproj ` -c Release ` -o ./publish/windows-${{ matrix.arch }} ` --self-contained ` -r win-${{ matrix.arch }} ` -p:PublishSingleFile=true ` -p:DebugType=none shell: pwsh - name: Package run: | $version = "${{ needs.prepare.outputs.version }}" $arch = "${{ matrix.arch }}" $source = "publish/windows-$arch" $package = "LanMountainDesktop-$version-win-$arch" New-Item -ItemType Directory -Path "$package" -Force | Out-Null Copy-Item -Path "$source/*" -Destination "$package" -Recurse -Force Compress-Archive -Path "$package" -DestinationPath "$package.zip" -Force Write-Host "Created: $package.zip" shell: pwsh - name: Upload uses: actions/upload-artifact@v4 with: name: release-windows-${{ matrix.arch }} path: LanMountainDesktop-*.zip retention-days: 30 build-linux: needs: prepare runs-on: ubuntu-latest name: Build_Linux steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || github.ref }} - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y \ libfontconfig1 libfreetype6 \ libx11-6 libxrandr2 libxinerama1 \ libxi6 libxcursor1 libxext6 \ libxrender1 libxkbcommon-x11-0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Update version in .csproj run: | VERSION="${{ needs.prepare.outputs.version }}" echo "Updating version in LanMountainDesktop.csproj to $VERSION" sed -i "s/.*<\/Version>/$VERSION<\/Version>/" LanMountainDesktop/LanMountainDesktop.csproj echo "Updating version in LanMountainDesktop.RecommendationBackend.csproj to $VERSION" sed -i "s/.*<\/Version>/$VERSION<\/Version>/" LanMountainDesktop.RecommendationBackend/LanMountainDesktop.RecommendationBackend.csproj - name: Restore run: dotnet restore ${{ env.Solution_Name }} - name: Build run: dotnet build ${{ env.Solution_Name }} -c Release --no-restore -v minimal - name: Publish run: | dotnet publish LanMountainDesktop/LanMountainDesktop.csproj \ -c Release \ -o ./publish/linux-x64 \ --self-contained \ -r linux-x64 \ -p:PublishSingleFile=true \ -p:DebugType=none - name: Package as DEB run: | version="${{ needs.prepare.outputs.version }}" source="publish/linux-x64" package_name="LanMountainDesktop" package_version="${version}" arch="amd64" # Create DEB package structure mkdir -p "build-deb/DEBIAN" mkdir -p "build-deb/usr/local/bin" mkdir -p "build-deb/usr/share/applications" mkdir -p "build-deb/usr/share/pixmaps" # Copy application files cp -r "$source"/* "build-deb/usr/local/bin/" # Create control file cat > "build-deb/DEBIAN/control" << EOF Package: $package_name Version: $package_version Architecture: $arch Maintainer: LanMountain Team Description: LanMountain Desktop Application A desktop application for LanMountain. EOF # Set proper permissions chmod 755 "build-deb/usr/local/bin/LanMountainDesktop" # Create DEB file dpkg-deb --build "build-deb" "${package_name}_${package_version}_${arch}.deb" echo "Created: ${package_name}_${package_version}_${arch}.deb" - name: Upload uses: actions/upload-artifact@v4 with: name: release-linux path: "*.deb" retention-days: 30 build-macos: needs: prepare runs-on: macos-latest strategy: matrix: arch: [x64, arm64] name: Build_macOS_${{ matrix.arch }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || github.ref }} - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Update version in .csproj run: | VERSION="${{ needs.prepare.outputs.version }}" echo "Updating version in LanMountainDesktop.csproj to $VERSION" sed -i '' "s/.*<\/Version>/$VERSION<\/Version>/" LanMountainDesktop/LanMountainDesktop.csproj echo "Updating version in LanMountainDesktop.RecommendationBackend.csproj to $VERSION" sed -i '' "s/.*<\/Version>/$VERSION<\/Version>/" LanMountainDesktop.RecommendationBackend/LanMountainDesktop.RecommendationBackend.csproj - name: Restore run: dotnet restore ${{ env.Solution_Name }} - name: Build run: dotnet build ${{ env.Solution_Name }} -c Release --no-restore -v minimal - name: Publish run: | dotnet publish LanMountainDesktop/LanMountainDesktop.csproj \ -c Release \ -o ./publish/macos-${{ matrix.arch }} \ --self-contained \ -r osx-${{ matrix.arch }} \ -p:PublishSingleFile=true \ -p:DebugType=none - name: Package as DMG run: | version="${{ needs.prepare.outputs.version }}" arch="${{ matrix.arch }}" source="publish/macos-$arch" app_name="LanMountainDesktop" package_name="${app_name}-${version}-macos-${arch}" # Create app bundle structure mkdir -p "${app_name}.app/Contents/MacOS" mkdir -p "${app_name}.app/Contents/Resources" # Copy application files cp -r "$source"/* "${app_name}.app/Contents/MacOS/" # Create minimal Info.plist cat > "${app_name}.app/Contents/Info.plist" << 'EOF' CFBundleExecutable LanMountainDesktop CFBundleName LanMountain Desktop CFBundleVersion ${version} CFBundleShortVersionString ${version} CFBundleIdentifier com.lanmountain.desktop CFBundlePackageType APPL EOF # Create DMG mkdir -p dmg-temp cp -r "${app_name}.app" dmg-temp/ hdiutil create -volname "${app_name}" -srcfolder dmg-temp -ov -format UDZO "${package_name}.dmg" # Cleanup rm -rf dmg-temp "${app_name}.app" echo "Created: ${package_name}.dmg" - name: Upload uses: actions/upload-artifact@v4 with: name: release-macos-${{ matrix.arch }} path: "*.dmg" retention-days: 30 github-release: needs: [ prepare, build-windows, build-linux, build-macos ] runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') permissions: contents: write steps: - name: Download artifacts uses: actions/download-artifact@v4 with: path: artifacts pattern: release-* - name: Create Release uses: ncipollo/release-action@v1 with: tag: ${{ github.ref_name }} draft: false prerelease: ${{ github.event.inputs.is_prerelease == 'true' }} artifacts: artifacts/**/* body: | ## Release ${{ needs.prepare.outputs.version }} ### Downloads **Windows:** - win-x64 (64-bit) - win-x86 (32-bit) **Linux:** - linux-x64 **macOS:** - macos-x64 (Intel) - macos-arm64 (Apple Silicon) See commits for changes. token: ${{ secrets.GITHUB_TOKEN }}