Update Package Managers #28
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: Update Package Managers | |
| on: | |
| release: | |
| types: [published] | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'Version to update packages for (e.g., 2.4.0)' | |
| required: true | |
| type: string | |
| env: | |
| GO_VERSION: '1.21' | |
| jobs: | |
| check-network-mapper-release: | |
| name: Check if Release is for Network Mapper | |
| runs-on: ubuntu-latest | |
| outputs: | |
| is_network_mapper: ${{ steps.check.outputs.is_network_mapper }} | |
| steps: | |
| - name: Check for network-mapper release | |
| id: check | |
| run: | | |
| if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then | |
| VERSION="${{ github.event.inputs.version }}" | |
| TAG_NAME="v${VERSION}" | |
| else | |
| TAG_NAME=${GITHUB_REF#refs/tags/} | |
| if [[ $TAG_NAME == network-mapper-v* ]]; then | |
| VERSION=${TAG_NAME#network-mapper-} | |
| elif [[ $TAG_NAME == v* ]]; then | |
| VERSION=${TAG_NAME} | |
| else | |
| echo "Tag '$TAG_NAME' does not match network-mapper format - skipping package updates" | |
| echo "is_network_mapper=false" >> $GITHUB_OUTPUT | |
| exit 0 | |
| fi | |
| fi | |
| echo "Checking for network-mapper release with tag: $TAG_NAME" | |
| # Check if network-mapper binary assets exist in the release | |
| RELEASE_INFO=$(gh api repos/${{ github.repository }}/releases/tags/${TAG_NAME} 2>/dev/null || echo "") | |
| if [ -z "$RELEASE_INFO" ]; then | |
| echo "Release ${TAG_NAME} not found" | |
| echo "is_network_mapper=false" >> $GITHUB_OUTPUT | |
| exit 0 | |
| fi | |
| # Check if the release has network-mapper assets | |
| ASSET_COUNT=$(echo "$RELEASE_INFO" | jq -r '[.assets[] | select(.name | contains("network-mapper"))] | length') | |
| if [ "$ASSET_COUNT" -gt 0 ]; then | |
| echo "Found $ASSET_COUNT network-mapper assets in release ${TAG_NAME}" | |
| echo "is_network_mapper=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "No network-mapper assets found in release ${TAG_NAME} - skipping package updates" | |
| echo "is_network_mapper=false" >> $GITHUB_OUTPUT | |
| fi | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| update-homebrew: | |
| name: Update and Publish Homebrew Formula | |
| runs-on: ubuntu-latest | |
| needs: check-network-mapper-release | |
| if: needs.check-network-mapper-release.outputs.is_network_mapper == 'true' | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Checkout main repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set version | |
| id: version | |
| run: | | |
| if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then | |
| VERSION="${{ github.event.inputs.version }}" | |
| else | |
| TAG_NAME=${GITHUB_REF#refs/tags/} | |
| if [[ $TAG_NAME == network-mapper-v* ]]; then | |
| VERSION=${TAG_NAME#network-mapper-v} | |
| elif [[ $TAG_NAME == v* ]]; then | |
| VERSION=${TAG_NAME#v} | |
| fi | |
| fi | |
| echo "VERSION=$VERSION" >> $GITHUB_ENV | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| - name: Download and extract checksums | |
| run: | | |
| TAG_NAME=${GITHUB_REF#refs/tags/} | |
| if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then | |
| TAG_NAME="v${{ github.event.inputs.version }}" | |
| fi | |
| mkdir -p /tmp/checksums | |
| gh release download ${TAG_NAME} --pattern "*.tar.gz.sha256" --dir /tmp/checksums | |
| # Extract checksums | |
| DARWIN_ARM64_SHA=$(cat /tmp/checksums/network-mapper-darwin-arm64.tar.gz.sha256 | cut -d' ' -f1) | |
| DARWIN_AMD64_SHA=$(cat /tmp/checksums/network-mapper-darwin-amd64.tar.gz.sha256 | cut -d' ' -f1) | |
| LINUX_ARM64_SHA=$(cat /tmp/checksums/network-mapper-linux-arm64.tar.gz.sha256 | cut -d' ' -f1) | |
| LINUX_AMD64_SHA=$(cat /tmp/checksums/network-mapper-linux-amd64.tar.gz.sha256 | cut -d' ' -f1) | |
| echo "DARWIN_ARM64_SHA=$DARWIN_ARM64_SHA" >> $GITHUB_ENV | |
| echo "DARWIN_AMD64_SHA=$DARWIN_AMD64_SHA" >> $GITHUB_ENV | |
| echo "LINUX_ARM64_SHA=$LINUX_ARM64_SHA" >> $GITHUB_ENV | |
| echo "LINUX_AMD64_SHA=$LINUX_AMD64_SHA" >> $GITHUB_ENV | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Checkout Homebrew tap | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: NickBorgers/homebrew-tap | |
| path: homebrew-tap | |
| token: ${{ secrets.HOMEBREW_TAP_TOKEN }} | |
| - name: Update Homebrew formula | |
| run: | | |
| cd homebrew-tap | |
| # Update the formula file | |
| cat > Formula/network-mapper.rb << EOF | |
| class NetworkMapper < Formula | |
| desc "Cross-platform network discovery and visualization tool" | |
| homepage "https://github.com/NickBorgers/util" | |
| version "${{ env.VERSION }}" | |
| license "MIT" | |
| on_macos do | |
| if Hardware::CPU.arm? | |
| url "https://github.com/NickBorgers/util/releases/download/v#{version}/network-mapper-darwin-arm64.tar.gz" | |
| sha256 "${{ env.DARWIN_ARM64_SHA }}" | |
| else | |
| url "https://github.com/NickBorgers/util/releases/download/v#{version}/network-mapper-darwin-amd64.tar.gz" | |
| sha256 "${{ env.DARWIN_AMD64_SHA }}" | |
| end | |
| end | |
| on_linux do | |
| if Hardware::CPU.arm? | |
| url "https://github.com/NickBorgers/util/releases/download/v#{version}/network-mapper-linux-arm64.tar.gz" | |
| sha256 "${{ env.LINUX_ARM64_SHA }}" | |
| else | |
| url "https://github.com/NickBorgers/util/releases/download/v#{version}/network-mapper-linux-amd64.tar.gz" | |
| sha256 "${{ env.LINUX_AMD64_SHA }}" | |
| end | |
| end | |
| def install | |
| bin.install "network-mapper-#{OS.kernel_name.downcase}-#{Hardware::CPU.arch}" | |
| mv bin/"network-mapper-#{OS.kernel_name.downcase}-#{Hardware::CPU.arch}", bin/"network-mapper" | |
| end | |
| def caveats | |
| <<~EOS | |
| Network Mapper may require elevated privileges for some operations: | |
| - On macOS/Linux: Run with 'sudo' if needed for network interface access | |
| - Some features like ARP scanning require root access | |
| To start with intelligent discovery (default, recommended): | |
| network-mapper | |
| To adjust thoroughness for intelligent discovery: | |
| network-mapper --thoroughness 1 # Minimal, faster | |
| network-mapper --thoroughness 5 # Exhaustive, thorough | |
| To run a quick brute-force scan (interface subnets only): | |
| network-mapper --scan-mode quick | |
| For help: | |
| network-mapper --help | |
| EOS | |
| end | |
| test do | |
| assert_match "Network Mapper", shell_output("#{bin}/network-mapper --version") | |
| end | |
| end | |
| EOF | |
| - name: Commit and push Homebrew formula | |
| run: | | |
| cd homebrew-tap | |
| git config --local user.email "action@github.com" | |
| git config --local user.name "GitHub Action" | |
| git add Formula/network-mapper.rb | |
| git commit -m "Update network-mapper to ${{ env.VERSION }} | |
| - Updated formula for network-mapper v${{ env.VERSION }} | |
| - Updated checksums for all platforms | |
| - Automated update from release workflow | |
| 🤖 Generated with [Claude Code](https://claude.ai/code) | |
| Co-Authored-By: Claude <noreply@anthropic.com>" | |
| git push | |
| update-chocolatey: | |
| name: Update and Publish Chocolatey Package | |
| runs-on: windows-latest | |
| needs: check-network-mapper-release | |
| if: needs.check-network-mapper-release.outputs.is_network_mapper == 'true' | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set version | |
| id: version | |
| shell: pwsh | |
| run: | | |
| if ("${{ github.event_name }}" -eq "workflow_dispatch") { | |
| $Version = "${{ github.event.inputs.version }}" | |
| } else { | |
| $TagName = "${{ github.ref }}" -replace "refs/tags/", "" | |
| if ($TagName -match "^network-mapper-v(.+)$") { | |
| $Version = $Matches[1] | |
| } elseif ($TagName -match "^v(.+)$") { | |
| $Version = $Matches[1] | |
| } | |
| } | |
| echo "VERSION=$Version" >> $env:GITHUB_ENV | |
| echo "version=$Version" >> $env:GITHUB_OUTPUT | |
| - name: Download Windows checksum | |
| shell: pwsh | |
| run: | | |
| $TagName = "${{ github.ref }}" -replace "refs/tags/", "" | |
| if ("${{ github.event_name }}" -eq "workflow_dispatch") { | |
| $TagName = "v${{ github.event.inputs.version }}" | |
| } | |
| gh release download $TagName --pattern "*windows-amd64.exe.zip.sha256" --dir "C:\temp\checksums" | |
| $WindowsSha = (Get-Content "C:\temp\checksums\*windows-amd64.exe.zip.sha256").Split(' ')[0] | |
| echo "WINDOWS_SHA=$WindowsSha" >> $env:GITHUB_ENV | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Install Chocolatey | |
| shell: pwsh | |
| run: | | |
| Set-ExecutionPolicy Bypass -Scope Process -Force | |
| [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 | |
| iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) | |
| - name: Prepare Chocolatey package | |
| shell: pwsh | |
| run: | | |
| # Create package directory | |
| $PackageDir = "C:\temp\chocolatey-package" | |
| New-Item -ItemType Directory -Path $PackageDir -Force | |
| New-Item -ItemType Directory -Path "$PackageDir\tools" -Force | |
| # Copy and update nuspec file | |
| $NuspecContent = Get-Content "network-mapper\chocolatey\network-mapper.nuspec" -Raw | |
| $NuspecContent = $NuspecContent -replace '\$version\$', "${{ env.VERSION }}" | |
| $NuspecContent = $NuspecContent -replace '\$releasenotes\$', "Network Mapper ${{ env.VERSION }} - See GitHub releases for full changelog" | |
| Set-Content -Path "$PackageDir\network-mapper.nuspec" -Value $NuspecContent | |
| # Copy and update install script | |
| $InstallScript = Get-Content "network-mapper\chocolatey\tools\chocolateyInstall.ps1" -Raw | |
| $InstallScript = $InstallScript -replace '\$version\$', "${{ env.VERSION }}" | |
| $InstallScript = $InstallScript -replace '\$checksum\$', "${{ env.WINDOWS_SHA }}" | |
| Set-Content -Path "$PackageDir\tools\chocolateyInstall.ps1" -Value $InstallScript | |
| # Copy uninstall script | |
| Copy-Item "network-mapper\chocolatey\tools\chocolateyUninstall.ps1" "$PackageDir\tools\" | |
| - name: Build and publish Chocolatey package | |
| shell: pwsh | |
| run: | | |
| cd "C:\temp\chocolatey-package" | |
| # Pack the package | |
| choco pack network-mapper.nuspec | |
| # Push to Chocolatey community repository | |
| $NupkgFile = Get-ChildItem "*.nupkg" | Select-Object -First 1 | |
| choco push $NupkgFile.Name --source https://push.chocolatey.org/ --api-key ${{ secrets.CHOCOLATEY_API_KEY }} | |
| update-local-files: | |
| name: Update Local Package Files | |
| runs-on: ubuntu-latest | |
| needs: [check-network-mapper-release, update-homebrew, update-chocolatey] | |
| if: needs.check-network-mapper-release.outputs.is_network_mapper == 'true' | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set version and tag | |
| run: | | |
| if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then | |
| VERSION="${{ github.event.inputs.version }}" | |
| TAG_NAME="v${VERSION}" | |
| else | |
| TAG_NAME=${GITHUB_REF#refs/tags/} | |
| if [[ $TAG_NAME == network-mapper-v* ]]; then | |
| VERSION=${TAG_NAME#network-mapper-v} | |
| elif [[ $TAG_NAME == v* ]]; then | |
| VERSION=${TAG_NAME#v} | |
| fi | |
| fi | |
| echo "VERSION=$VERSION" >> $GITHUB_ENV | |
| echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV | |
| - name: Download and extract all checksums | |
| run: | | |
| mkdir -p /tmp/checksums | |
| gh release download ${{ env.TAG_NAME }} --pattern "*.sha256" --dir /tmp/checksums | |
| # Extract all checksums | |
| DARWIN_ARM64_SHA=$(cat /tmp/checksums/network-mapper-darwin-arm64.tar.gz.sha256 | cut -d' ' -f1) | |
| DARWIN_AMD64_SHA=$(cat /tmp/checksums/network-mapper-darwin-amd64.tar.gz.sha256 | cut -d' ' -f1) | |
| LINUX_ARM64_SHA=$(cat /tmp/checksums/network-mapper-linux-arm64.tar.gz.sha256 | cut -d' ' -f1) | |
| LINUX_AMD64_SHA=$(cat /tmp/checksums/network-mapper-linux-amd64.tar.gz.sha256 | cut -d' ' -f1) | |
| WINDOWS_SHA=$(cat /tmp/checksums/*windows-amd64.exe.zip.sha256 | cut -d' ' -f1) | |
| echo "DARWIN_ARM64_SHA=$DARWIN_ARM64_SHA" >> $GITHUB_ENV | |
| echo "DARWIN_AMD64_SHA=$DARWIN_AMD64_SHA" >> $GITHUB_ENV | |
| echo "LINUX_ARM64_SHA=$LINUX_ARM64_SHA" >> $GITHUB_ENV | |
| echo "LINUX_AMD64_SHA=$LINUX_AMD64_SHA" >> $GITHUB_ENV | |
| echo "WINDOWS_SHA=$WINDOWS_SHA" >> $GITHUB_ENV | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Update local package files | |
| run: | | |
| # Update Homebrew formula (for reference/backup) | |
| sed -i "s/version \".*\"/version \"${{ env.VERSION }}\"/" network-mapper/homebrew/network-mapper.rb | |
| sed -i "/on_macos/,/on_linux/ {/Hardware::CPU.arm?/,/else/ s/sha256 \"[^\"]*\"/sha256 \"${{ env.DARWIN_ARM64_SHA }}\"/}" network-mapper/homebrew/network-mapper.rb | |
| sed -i "/on_macos/,/on_linux/ {/else/,/end/ s/sha256 \"[^\"]*\"/sha256 \"${{ env.DARWIN_AMD64_SHA }}\"/}" network-mapper/homebrew/network-mapper.rb | |
| sed -i "/on_linux/,$ {/Hardware::CPU.arm?/,/else/ s/sha256 \"[^\"]*\"/sha256 \"${{ env.LINUX_ARM64_SHA }}\"/}" network-mapper/homebrew/network-mapper.rb | |
| sed -i "/on_linux/,$ {/else/,/end/ s/sha256 \"[^\"]*\"/sha256 \"${{ env.LINUX_AMD64_SHA }}\"/}" network-mapper/homebrew/network-mapper.rb | |
| # Update Chocolatey package files (for reference/backup) | |
| sed -i "s|\\\$version\\\$|${{ env.VERSION }}|g" network-mapper/chocolatey/tools/chocolateyInstall.ps1 | |
| sed -i "s|\\\$checksum\\\$|${{ env.WINDOWS_SHA }}|g" network-mapper/chocolatey/tools/chocolateyInstall.ps1 | |
| sed -i "s|\\\$version\\\$|${{ env.VERSION }}|g" network-mapper/chocolatey/network-mapper.nuspec | |
| sed -i "s|\\\$releasenotes\\\$|Network Mapper ${{ env.VERSION }} - See GitHub releases for full changelog|g" network-mapper/chocolatey/network-mapper.nuspec | |
| - name: Commit local package file updates | |
| run: | | |
| git config --local user.email "action@github.com" | |
| git config --local user.name "GitHub Action" | |
| git add network-mapper/homebrew/network-mapper.rb network-mapper/chocolatey/ | |
| if ! git diff --staged --quiet; then | |
| git commit -m "Update local package files for v${{ env.VERSION }} | |
| - Updated Homebrew formula to v${{ env.VERSION }} with new checksums | |
| - Updated Chocolatey package files to v${{ env.VERSION }} with new checksum | |
| - Automated update via package manager workflow | |
| - Note: Live packages are published to their respective repositories | |
| 🤖 Generated with [Claude Code](https://claude.ai/code) | |
| Co-Authored-By: Claude <noreply@anthropic.com>" | |
| git push | |
| else | |
| echo "No changes to commit" | |
| fi |