Release v0.7.8 #35
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| push: | |
| tags: | |
| - 'v*' # Trigger on version tags (v0.6.4, v1.0.0, etc.) | |
| permissions: | |
| contents: write | |
| jobs: | |
| release: | |
| name: Build and Release | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # Full history needed for changelog | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Get version from tag | |
| id: version | |
| run: | | |
| # Extract version from tag (v0.6.4 -> 0.6.4) | |
| VERSION=${GITHUB_REF#refs/tags/v} | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "Release version: $VERSION" | |
| - name: Setup .NET 9 | |
| uses: actions/setup-dotnet@v3 | |
| with: | |
| dotnet-version: '9.0.x' | |
| - name: Install zip utility | |
| run: sudo apt-get update && sudo apt-get install -y zip | |
| - name: Generate changelog from commits | |
| id: changelog | |
| run: | | |
| # Find previous version tag (not release trigger tags) | |
| PREV_TAG=$(git describe --tags --abbrev=0 --match "v[0-9]*" HEAD^ 2>/dev/null || echo "") | |
| echo "Previous tag: ${PREV_TAG:-none (first release)}" | |
| if [ -z "$PREV_TAG" ]; then | |
| # First release - get all commits (excluding automated commits) | |
| COMMITS=$(git log --pretty=format:"- %s (%h)" --no-merges | grep -v "\[skip ci\]" | grep -v "Update CHANGELOG" | grep -v "Release v" | head -20) | |
| else | |
| # Get commits since last version tag (excluding automated commits) | |
| COMMITS=$(git log ${PREV_TAG}..HEAD --pretty=format:"- %s (%h)" --no-merges | grep -v "\[skip ci\]" | grep -v "Update CHANGELOG" | grep -v "Release v") | |
| fi | |
| # Build changelog for GitHub release | |
| { | |
| echo "changelog<<EOF" | |
| echo "## What's Changed" | |
| echo "" | |
| echo "$COMMITS" | |
| if [ -n "$PREV_TAG" ]; then | |
| echo "" | |
| echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${PREV_TAG}...v${{ steps.version.outputs.version }}" | |
| fi | |
| echo "EOF" | |
| } >> $GITHUB_OUTPUT | |
| - name: Build all platforms | |
| run: | | |
| ./build.sh | |
| echo "✓ Built all platforms" | |
| # ═══════════════════════════════════════════════════════════════ | |
| # NuGet Packages | |
| # ═══════════════════════════════════════════════════════════════ | |
| - name: Build and push NuGet packages | |
| env: | |
| NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} | |
| run: | | |
| VERSION=${{ steps.version.outputs.version }} | |
| # Use simple release notes URL to avoid shell escaping issues with CHANGELOG content | |
| RELEASE_NOTES="See https://github.com/${{ github.repository }}/releases/tag/v$VERSION for full release notes." | |
| # Pack NuGet packages with release notes | |
| dotnet pack LocalizationManager.JsonLocalization/LocalizationManager.JsonLocalization.csproj \ | |
| --configuration Release \ | |
| --output ./nupkg \ | |
| -p:PackageReleaseNotes="$RELEASE_NOTES" | |
| dotnet pack LocalizationManager.JsonLocalization.Generator/LocalizationManager.JsonLocalization.Generator.csproj \ | |
| --configuration Release \ | |
| --output ./nupkg \ | |
| -p:PackageReleaseNotes="$RELEASE_NOTES" | |
| echo "Generated NuGet packages:" | |
| ls -la ./nupkg/*.nupkg | |
| # Push to NuGet.org | |
| for pkg in ./nupkg/*.nupkg; do | |
| echo "Pushing $pkg..." | |
| dotnet nuget push "$pkg" \ | |
| --api-key "$NUGET_API_KEY" \ | |
| --source https://api.nuget.org/v3/index.json \ | |
| --skip-duplicate | |
| done | |
| echo "✓ NuGet packages published" | |
| # ═══════════════════════════════════════════════════════════════ | |
| # VS Code Extension - Platform-Specific Builds | |
| # ═══════════════════════════════════════════════════════════════ | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Install extension dependencies | |
| run: | | |
| cd vscode-extension | |
| npm install | |
| - name: Build platform-specific extensions | |
| run: | | |
| cd vscode-extension | |
| npm run compile | |
| # Package for each platform (each gets its own binary bundled) | |
| for platform in win32-x64 win32-arm64 linux-x64 linux-arm64 darwin-x64 darwin-arm64; do | |
| echo "══════════════════════════════════════════════════════" | |
| echo "Packaging for $platform" | |
| echo "══════════════════════════════════════════════════════" | |
| # Bundle only this platform's binary | |
| ./scripts/bundle-binaries.sh --target $platform | |
| # Package with platform target | |
| npx vsce package --target $platform | |
| done | |
| echo "" | |
| echo "Generated VSIX files:" | |
| ls -la *.vsix | |
| - name: Publish to VS Code Marketplace | |
| env: | |
| VSCE_PAT: ${{ secrets.VSCE_PAT }} | |
| run: | | |
| cd vscode-extension | |
| # Publish each platform-specific VSIX | |
| for vsix in *.vsix; do | |
| echo "Publishing $vsix..." | |
| npx vsce publish --packagePath "$vsix" --pat "$VSCE_PAT" | |
| done | |
| echo "✓ All platform packages published to Marketplace" | |
| - name: Install Debian packaging tools | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y dpkg-dev debhelper devscripts dput-ng | |
| - name: Build Debian packages (amd64) | |
| run: | | |
| ./build-deb.sh amd64 | |
| echo "✓ Built amd64 .deb package (standalone)" | |
| - name: Build Debian packages (arm64) | |
| run: | | |
| ./build-deb.sh arm64 | |
| echo "✓ Built arm64 .deb package (standalone)" | |
| - name: Build source package for PPA | |
| run: | | |
| ./build-source-package.sh | |
| echo "✓ Built source package" | |
| - name: Import GPG key | |
| env: | |
| GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} | |
| GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} | |
| run: | | |
| # Import GPG key | |
| echo "$GPG_PRIVATE_KEY" | base64 -d | gpg --batch --import | |
| # Configure GPG for non-interactive use | |
| mkdir -p ~/.gnupg | |
| chmod 700 ~/.gnupg | |
| echo "use-agent" >> ~/.gnupg/gpg.conf | |
| echo "pinentry-mode loopback" >> ~/.gnupg/gpg.conf | |
| echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf | |
| # Restart GPG agent | |
| gpg-connect-agent reloadagent /bye || true | |
| echo "✓ GPG key imported and configured" | |
| - name: Sign source package | |
| env: | |
| GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} | |
| LAUNCHPAD_EMAIL: ${{ secrets.LAUNCHPAD_EMAIL }} | |
| run: | | |
| cd publish/source | |
| # Sign using debsign with passphrase from environment | |
| # Use --no-conf to avoid user config interference | |
| echo "$GPG_PASSPHRASE" | debsign --no-conf -k "$LAUNCHPAD_EMAIL" --no-re-sign -p"gpg --batch --pinentry-mode loopback --passphrase-fd 0" lrm_*_source.changes | |
| echo "✓ Source package signed" | |
| - name: Upload to Launchpad PPA | |
| env: | |
| LAUNCHPAD_EMAIL: ${{ secrets.LAUNCHPAD_EMAIL }} | |
| run: | | |
| cd publish/source | |
| # Configure dput for PPA | |
| cat > ~/.dput.cf << EOF | |
| [lrm-tool-ppa] | |
| fqdn = ppa.launchpad.net | |
| method = ftp | |
| incoming = ~nickprotop/ubuntu/lrm-tool/ | |
| login = anonymous | |
| allow_unsigned_uploads = 0 | |
| EOF | |
| # Upload to PPA | |
| dput lrm-tool-ppa lrm_*_source.changes | |
| echo "✓ Uploaded to PPA: ppa:nickprotop/lrm-tool" | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| tag_name: v${{ steps.version.outputs.version }} | |
| name: "Localization Resource Manager v${{ steps.version.outputs.version }}" | |
| body: | | |
| # LRM v${{ steps.version.outputs.version }} | |
| ${{ steps.changelog.outputs.changelog }} | |
| ## 📦 Downloads | |
| ### APT/PPA Installation (Recommended for Ubuntu/Debian) | |
| ```bash | |
| sudo add-apt-repository ppa:nickprotop/lrm-tool | |
| sudo apt update | |
| sudo apt install lrm-standalone # Self-contained (~72MB) | |
| ``` | |
| ### Direct Downloads | |
| Choose the appropriate version for your platform: | |
| **Linux (Direct Download):** | |
| - **x64:** `lrm-linux-x64.tar.gz` | |
| - **ARM64:** `lrm-linux-arm64.tar.gz` *(Raspberry Pi, etc.)* | |
| **Linux (.deb packages):** | |
| - **x64:** `lrm-standalone_${{ steps.version.outputs.version }}-1_amd64.deb` (~72MB) | |
| - **ARM64:** `lrm-standalone_${{ steps.version.outputs.version }}-1_arm64.deb` (~72MB) | |
| **macOS:** | |
| - **x64 (Intel):** `lrm-osx-x64.tar.gz` | |
| - **ARM64 (Apple Silicon):** `lrm-osx-arm64.tar.gz` | |
| **Windows:** | |
| - **x64:** `lrm-win-x64.zip` | |
| - **ARM64:** `lrm-win-arm64.zip` | |
| ## 🧩 VS Code Extension | |
| Install from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=nickprotop.localization-manager): | |
| ``` | |
| ext install nickprotop.localization-manager | |
| ``` | |
| The marketplace automatically provides the correct version for your platform. | |
| Platform-specific VSIX files are also attached below for manual installation. | |
| ## 📖 Installation | |
| See the [Installation Guide](https://github.com/${{ github.repository }}/blob/main/docs/INSTALLATION.md) for detailed instructions. | |
| ## 🧪 Verified | |
| ✅ All tests passing | |
| files: | | |
| publish/lrm-linux-x64.tar.gz | |
| publish/lrm-linux-arm64.tar.gz | |
| publish/lrm-osx-x64.tar.gz | |
| publish/lrm-osx-arm64.tar.gz | |
| publish/lrm-win-x64.zip | |
| publish/lrm-win-arm64.zip | |
| publish/deb/lrm-standalone_${{ steps.version.outputs.version }}-1_amd64.deb | |
| publish/deb/lrm-standalone_${{ steps.version.outputs.version }}-1_arm64.deb | |
| vscode-extension/*.vsix | |
| draft: false | |
| prerelease: false |