Skip to content

CI/CD: Deploy to platform-specific package managers #75

@sfloess

Description

@sfloess

Overview

Distribute JNexus through standard package managers for easier installation and automatic updates.

Current State

  • ✅ packagecloud.io (Debian/RPM packages)
  • ✅ GitHub Releases (manual download)
  • ❌ Not in Maven Central
  • ❌ Not in Homebrew
  • ❌ Not in Google Play Store
  • ❌ Not in App Store
  • ❌ Not in F-Droid

CI/CD Score Impact

Current: CI/CD A- (90/100)
With #73 + this: CI/CD A+ (98/100)

Platform Distribution Matrix

Platform Package Manager Priority Effort Status
macOS Homebrew Tap High Low
macOS App Store Medium High
Linux Snap Medium Medium
Linux Flatpak Low Medium
Windows Chocolatey Low Medium
Windows Winget Low Low
Java Maven Central High Medium
Android Google Play High High
Android F-Droid Medium Medium
iOS App Store High High

1. Homebrew Tap (macOS + Linux)

Setup

Create flossware/homebrew-tap repository:

Formula:

class Jnexus < Formula
  desc "Sonatype Nexus repository management tool"
  homepage "https://github.com/FlossWare/jnexus"
  url "https://github.com/FlossWare/jnexus/releases/download/v2.0.0/jnexus-2.0-jar-with-dependencies.jar"
  sha256 "SHA256_HERE"
  license "GPL-3.0"
  
  depends_on "openjdk@21"
  
  def install
    libexec.install "jnexus-2.0-jar-with-dependencies.jar"
    bin.write_jar_script libexec/"jnexus-2.0-jar-with-dependencies.jar", "jnexus"
  end
  
  test do
    assert_match "JNexus", shell_output("#{bin}/jnexus --version")
  end
end

Installation:

brew tap flossware/tap
brew install jnexus

# Or one-liner:
brew install flossware/tap/jnexus

Update workflow (.github/workflows/homebrew.yml):

- name: Update Homebrew Tap
  if: startsWith(github.ref, 'refs/tags/v')
  run: |
    # Calculate SHA256
    SHA256=$(sha256sum target/jnexus-*-jar-with-dependencies.jar | cut -d' ' -f1)
    
    # Clone tap repo
    git clone https://github.com/FlossWare/homebrew-tap
    cd homebrew-tap
    
    # Update formula
    sed -i "s|url \".*\"|url \"https://github.com/FlossWare/jnexus/releases/download/${GITHUB_REF#refs/tags/}/jnexus-${VERSION}-jar-with-dependencies.jar\"|" Formula/jnexus.rb
    sed -i "s|sha256 \".*\"|sha256 \"${SHA256}\"|" Formula/jnexus.rb
    
    # Commit and push
    git add Formula/jnexus.rb
    git commit -m "Update jnexus to ${VERSION}"
    git push

2. Maven Central (Java Libraries)

Setup

Why: jnexus-core can be consumed as a library by other Java projects.

Requirements:

  • Sonatype OSSRH account
  • GPG key for signing
  • Approved groupId (org.flossware)

Update pom.xml:

<distributionManagement>
    <repository>
        <id>ossrh</id>
        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

<plugins>
    <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <version>1.7.0</version>
        <extensions>true</extensions>
    </plugin>
    
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <version>3.2.7</version>
        <executions>
            <execution>
                <id>sign-artifacts</id>
                <phase>verify</phase>
                <goals>
                    <goal>sign</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

Deployment:

mvn clean deploy -P release

Users can then:

<dependency>
    <groupId>org.flossware</groupId>
    <artifactId>jnexus-core</artifactId>
    <version>2.0.0</version>
</dependency>

3. Google Play Store (Android)

Requirements

  • Google Play Developer account (99 USD one-time fee)
  • Privacy policy (required for apps handling credentials)
  • Content rating questionnaire
  • App screenshots and descriptions

Setup

Create store listing:

  • App name: JNexus
  • Short description: Manage Sonatype Nexus repositories on Android
  • Full description: [Marketing copy about features]
  • Screenshots: 4-8 screenshots (phone + tablet)
  • Feature graphic: 1024x500 banner

Update build.gradle:

android {
    defaultConfig {
        versionCode 1
        versionName "2.0.0"
    }
}

Automated Publishing (Fastlane):

Install Fastlane:

cd jnexus-android
fastlane init

Fastfile:

platform :android do
  lane :deploy do
    gradle(task: "assembleRelease")
    
    upload_to_play_store(
      track: 'production',
      apk: 'build/outputs/apk/release/jnexus-android-release.apk'
    )
  end
end

CI Integration:

- name: Deploy to Google Play
  if: startsWith(github.ref, 'refs/tags/v')
  run: |
    cd jnexus-android
    fastlane deploy
  env:
    PLAY_STORE_JSON_KEY: ${{ secrets.PLAY_STORE_JSON_KEY }}

4. F-Droid (Open-Source Android)

Requirements

  • No proprietary dependencies (✅ we're good)
  • Reproducible builds
  • No tracking/analytics (✅ we're clean)

Setup

Submit to F-Droid:

  1. Fork fdroiddata repository
  2. Add metadata file:
Categories:
  - Development
License: GPL-3.0-only
SourceCode: https://github.com/FlossWare/jnexus
IssueTracker: https://github.com/FlossWare/jnexus/issues

AutoName: JNexus

Summary: Sonatype Nexus repository manager
Description: |-
    JNexus is a tool for managing components in Sonatype Nexus Repository Manager.
    
    Features:
    * List and search components
    * Advanced filtering (size, date, type)
    * Safe deletion with dry-run mode
    * Repository statistics and analytics
    * Encrypted credential storage (AES-256-GCM)

Builds:
  - versionName: '2.0.0'
    versionCode: 1
    commit: v2.0.0
    subdir: jnexus-android
    gradle:
      - release

MaintainerNotes: Reproducible builds enabled.
  1. Create pull request
  2. Wait for F-Droid review (1-2 weeks)

Users can then:

# Add F-Droid repo (one-time)
# Install JNexus from F-Droid app

5. Apple App Store (iOS/macOS)

Requirements

  • Apple Developer Program membership (99 USD/year)
  • Privacy policy
  • App screenshots
  • App review (manual process, 1-2 days)

Setup

Create App Store Connect listing:

  • App name: JNexus
  • Bundle ID: org.flossware.jnexus
  • Screenshots: iPhone, iPad, macOS
  • Privacy policy: Host at github.io

Automated Publishing (Fastlane):

Fastfile:

platform :ios do
  lane :release do
    build_app(
      scheme: "JNexus-iOS",
      export_method: "app-store"
    )
    
    upload_to_app_store(
      skip_screenshots: true,
      skip_metadata: false,
      submit_for_review: true,
      automatic_release: true
    )
  end
end

platform :mac do
  lane :release do
    build_app(
      scheme: "JNexus-macOS",
      export_method: "mac-app-store"
    )
    
    upload_to_app_store(
      platform: "osx",
      submit_for_review: true
    )
  end
end

CI Integration:

- name: Deploy to App Store
  if: startsWith(github.ref, 'refs/tags/v')
  run: |
    cd jnexus-ios
    fastlane ios release
    fastlane mac release
  env:
    APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_API_KEY }}

6. Snap (Linux)

Create snapcraft.yaml:

name: jnexus
version: '2.0.0'
summary: Sonatype Nexus repository manager
description: |
  Manage components in Sonatype Nexus Repository Manager with CLI and GUI interfaces.

grade: stable
confinement: strict

apps:
  jnexus:
    command: java -jar $SNAP/jnexus.jar
    plugs:
      - network
      - home

parts:
  jnexus:
    plugin: maven
    source: .
    build-packages:
      - openjdk-21-jdk
    stage-packages:
      - openjdk-21-jre

Build and publish:

snapcraft
snapcraft upload jnexus_2.0.0_amd64.snap --release=stable

Acceptance Criteria

  • Homebrew tap created and formula working
  • Maven Central deployment configured
  • Google Play listing created (can be done manually, automation optional)
  • F-Droid metadata submitted
  • App Store listing created (manual, automation optional)
  • Snap package created (optional)
  • Documentation updated (INSTALL.md showing all methods)

Installation Documentation

Update README.md with all methods:

## Installation

### macOS
```bash
brew install flossware/tap/jnexus

Linux

# Snap
sudo snap install jnexus

# Or download JAR
wget https://github.com/FlossWare/jnexus/releases/latest/download/jnexus.jar

Android

  • Google Play Store: [link]
  • F-Droid: [link]
  • Direct APK: [GitHub Releases]

iOS

  • App Store: [link]

As Library (Maven)

<dependency>
    <groupId>org.flossware</groupId>
    <artifactId>jnexus-core</artifactId>
    <version>2.0.0</version>
</dependency>

## Priority
Low-Medium - High impact on discoverability but time-intensive

## Related
- #73: Unified release workflow (builds the artifacts)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions