Skip to main content
Harness Artifact Registry provides support for RPM packages, allowing you to host private Red Hat/CentOS/Fedora packages.

Overview

RPM registry features:
  • Standard RPM repository protocol
  • Automatic repository metadata generation
  • GPG signature support
  • Multi-architecture support (x86_64, aarch64, noarch)
  • Integration with yum and dnf package managers

Pushing RPM packages

Use the hc artifact push rpm command:
hc artifact push rpm <registry-name> <rpm-file-path> \
  --pkg-url <pkg-url>
RPM files are binary packages with .rpm extension

Building RPM packages

1

Create RPM spec file

Define your package specification:
mypackage.spec
Name:           mypackage
Version:        1.0.0
Release:        1%{?dist}
Summary:        My application
License:        MIT
URL:            https://example.com/mypackage

%description
My awesome application description

%prep
# Preparation steps

%build
# Build steps

%install
# Installation steps
mkdir -p %{buildroot}/usr/bin
cp myapp %{buildroot}/usr/bin/

%files
/usr/bin/myapp

%changelog
* Mon Jan 01 2024 Your Name <[email protected]> - 1.0.0-1
- Initial release
2

Build the RPM

Use rpmbuild:
# Install build tools
sudo yum install rpm-build rpmdevtools

# Create build structure
rpmdev-setuptree

# Build the RPM
rpmbuild -ba mypackage.spec
This creates: ~/rpmbuild/RPMS/x86_64/mypackage-1.0.0-1.el8.x86_64.rpm
3

Upload to registry

Push the RPM:
hc artifact push rpm my-registry \
  ~/rpmbuild/RPMS/x86_64/mypackage-1.0.0-1.el8.x86_64.rpm \
  --pkg-url https://app.harness.io/registry/pkg

Installing RPM packages

Configure yum/dnf to use your Harness registry:

Create repository configuration

sudo tee /etc/yum.repos.d/harness.repo <<EOF
[harness]
name=Harness RPM Repository
baseurl=https://<username>:<token>@<registry-url>/rpm/
enabled=1
gpgcheck=0
EOF

Install packages

# Update cache
sudo yum makecache

# Install package
sudo yum install mypackage

# Or with dnf (Fedora/RHEL 8+)
sudo dnf install mypackage

Examples

# Build and push a simple RPM
rpmbuild -ba mypackage.spec
hc artifact push rpm my-registry \
  ~/rpmbuild/RPMS/x86_64/mypackage-1.0.0-1.x86_64.rpm \
  --pkg-url https://app.harness.io/registry/pkg

RPM naming convention

RPM packages follow this format:
name-version-release.architecture.rpm
Examples:
  • mypackage-1.0.0-1.el8.x86_64.rpm
  • myapp-2.1.0-1.fc38.aarch64.rpm
  • mytool-1.0.0-1.noarch.rpm

Version and release

RPM uses separate version and release fields:
  • Version: Upstream version (e.g., 1.0.0)
  • Release: Package revision (e.g., 1%{?dist})
Example: mypackage-1.0.0-1.el8 means:
  • Package: mypackage
  • Version: 1.0.0
  • Release: 1
  • Distribution: el8 (RHEL/CentOS 8)

GPG signing (optional)

Sign your RPMs for added security:
# Generate GPG key
gpg --gen-key

# Export public key
gpg --export -a 'Your Name' > RPM-GPG-KEY-yourname

# Sign RPM
rpmsign --addsign mypackage-1.0.0-1.x86_64.rpm

# Upload signed RPM
hc artifact push rpm my-registry ./mypackage-1.0.0-1.x86_64.rpm \
  --pkg-url https://app.harness.io/registry/pkg

CI/CD integration

- name: Build and publish RPM
  run: |
    sudo yum install -y rpm-build
    rpmbuild -ba mypackage.spec
    hc artifact push rpm my-registry \
      ~/rpmbuild/RPMS/*/*.rpm \
      --pkg-url https://app.harness.io/registry/pkg
  env:
    HARNESS_API_KEY: ${{ secrets.HARNESS_API_KEY }}

Troubleshooting

Check your spec file syntax:
# Lint spec file
rpmlint mypackage.spec
Ensure all build dependencies are installed:
# Install build dependencies from spec
sudo yum-builddep mypackage.spec
Clear yum cache:
sudo yum clean all
sudo yum makecache

See also

Build docs developers (and LLMs) love