Skip to content

hunter-nl/rpmbuilder

 
 

GitHub Actions CI Status

Usage demoInstallationTipsUsageBuild StatusContributingLicense


rpmbuilder is RPM package build helper.

Usage demo

rpmbuilder.mp4

Installation

sudo yum install -y https://pkgs.kaos.st/kaos-repo-latest.el$(grep 'CPE_NAME' /etc/os-release | tr -d '"' | cut -d':' -f5).noarch.rpm
sudo yum install rpmbuilder

Build node:

sudo yum install -y https://pkgs.kaos.st/kaos-repo-latest.el$(grep 'CPE_NAME' /etc/os-release | tr -d '"' | cut -d':' -f5).noarch.rpm
sudo yum install rpmbuilder-node

Using Makefile and Git

git clone https://kaos.sh/rpmbuilder.git
cd rpmbuilder
sudo make install

Using Docker

We provide a big variety of Docker images available on GitHub Container Registry and Docker Hub.

Official images

Basic images:

  • ghcr.io/essentialkaos/rpmbuilder:centos7 (CentOS 7)
  • ghcr.io/essentialkaos/rpmbuilder:ol7 (OracleLinux 7)
  • ghcr.io/essentialkaos/rpmbuilder:ol8 (OracleLinux 8)
  • ghcr.io/essentialkaos/rpmbuilder:ol9 (OracleLinux 9)
  • essentialkaos/rpmbuilder:centos7 (CentOS 7) [Not Recommended]
  • essentialkaos/rpmbuilder:ol7 (OracleLinux 7) [Not Recommended]
  • essentialkaos/rpmbuilder:ol8 (OracleLinux 8) [Not Recommended]
  • essentialkaos/rpmbuilder:ol9 (OracleLinux 9) [Not Recommended]

Build node images:

  • ghcr.io/essentialkaos/rpmbuilder:node-centos7 (CentOS 7 | Port: 2027)
  • ghcr.io/essentialkaos/rpmbuilder:node-ol7 (OracleLinux 7 | Port: 2037)
  • ghcr.io/essentialkaos/rpmbuilder:node-ol8 (OracleLinux 8 | Port: 2038)
  • ghcr.io/essentialkaos/rpmbuilder:node-ol9 (OracleLinux 9 | Port: 2039)
  • essentialkaos/rpmbuilder:node-centos7 (CentOS 7 | Port: 2027) [Not Recommended]
  • essentialkaos/rpmbuilder:node-ol7 (OracleLinux 7 | Port: 2037) [Not Recommended]
  • essentialkaos/rpmbuilder:node-ol8 (OracleLinux 8 | Port: 2038) [Not Recommended]
  • essentialkaos/rpmbuilder:node-ol9 (OracleLinux 9 | Port: 2039) [Not Recommended]

Package build using base image:

# Download and install rpmbuilder-docker script
curl -fL# -o rpmbuilder-docker https://kaos.sh/rpmbuilder/rpmbuilder-docker
chmod +x rpmbuilder-docker
sudo mv rpmbuilder-docker /usr/bin/

# Pull rpmbuilder image based on OracleLinux 8
docker pull ghcr.io/essentialkaos/rpmbuilder:ol8
export IMAGE=ghcr.io/essentialkaos/rpmbuilder:ol8

# Build package locally
cd my-package-dir
rpmbuilder-docker my-package.spec

# Build package using build nodes
rpmbuilder-docker my-package.spec -r buildnode-ol7.acme.corp:2022 -r buildnode-ol8.acme.corp:2022 -k $(base64 -w0 ~/.ssh/buildnode)

Package build using build node image:

docker pull ghcr.io/essentialkaos/rpmbuilder:node-ol8
docker run -e PUB_KEY="$(cat ~/.ssh/buildnode.pub)" -p 2038:2038 -d ghcr.io/essentialkaos/rpmbuilder:node-ol8

cd my-package-dir

# Using local version of rpmbuilder (if you are use RHEL, Alma, Rocky, CentOS…)
rpmbuilder my-package.spec -r builder@localhost:2038 -k ~/.ssh/buildnode

# With docker helper script (any Linux distro or macOS)
rpmbuilder-docker my-package.spec -r builder@localhost:2038 -k $(base64 -w0 ~/.ssh/buildnode)

You can bootstrap your own build farm using Docker and rpmbuilder-farm script:

curl -fL# -o rpmbuilder-farm https://kaos.sh/rpmbuilder/rpmbuilder-farm
chmod +x rpmbuilder-farm
sudo mv rpmbuilder-farm /usr/bin/

# Install farm script
sudo rpmbuilder-farm install

# Create user bob and add public key
sudo farm add-user bob

# Start all containers for user bob
sudo farm start bob

rpmbuilder-farm preview

Tips

  • You could define rpmbuilder options inside your specs (example). It very helpful for determining information about external sources.
  • If you have a big bunch of default options, you can define them in the preferences file. More info.
  • Since version 2.5.0 rpmbuilder provides automatic checksum generation feature. More info.

Usage

Usage: rpmbuilder {spec-file} {options}

Spec file:

  You can define absolute or relative path to spec file. You also can define only spec name (without extension).
  In this case, rpmbuilder try use {name}.spec file for build and try to find {name}.source file and use as
  sources list.

Source packaging:

  --pack, -p files                     Pack specified files to archive with default source name (mergeable)
  --relative-pack, -R                  Use relative path in source archive instead of absolute
  --source-dir, -sd path               Path to a directory which contains source files specified in spec file
  --source-list, -sl file              Path to file which contains a list of source files specified in spec file
  --dlcache, -dc dir                   Path to a directory for downloads caching
  --download, -dl dir                  Download all remote sources to a specified directory
  --no-validate, -nv                   Don't validate sources

  --git url                            Fetch sources from Git repository
  --svn url                            Fetch sources from SVN repository
  --hg url                             Fetch sources from Mercurial repository
  --bzr url                            Fetch sources from Bazaar repository
  --path, -rp path                     Path to a directory with sources in repository
  --branch, -rb branch                 Use specified repository branch
  --revision, -rr rev                  Use specified revision
  --tag, -rt tag                       Use specified tag
  --svn-user, -su username             Username for access to SVN repository
  --svn-pass, -sp password             Password for access to SVN repository

┌ --github, -gh url                    Fetch sources from github.com repository by url
│ --github, -gh user:project           Fetch sources from github.com repository by user and project
└ --github, -gh user/project           Fetch sources from github.com repository by user and project
┌ --bitbucket, -bb url                 Fetch sources from bitbucket.org repository by url
│ --bitbucket, -bb user:project        Fetch sources from bitbucket.org repository by user and project
└ --bitbucket, -bb user/project        Fetch sources from bitbucket.org repository by user and project
┌ --launchpad, -lp url                 Fetch sources from launchpad.net repository by url
└ --launchpad, -lp project-name        Fetch sources from launchpad.net repository by project name

  --gopack, -G url                     Fetch and pack golang sources using gopack

  Examples:

    rpmbuilder package.spec -sl sources/current -d ~/mypackages
    rpmbuilder package.spec --source-list files.list --dest ~/mypackages
    rpmbuilder package.spec --pack "file1 file2 dir1 dir2 file3"
    rpmbuilder package.spec -p "file1 file2" -p "dir1 dir2 file3" -p file4
    rpmbuilder package.spec --git git://github.com/user/project.git --tag 1.3-12
    rpmbuilder package.spec --git git://github.com/user/project.git -rb develop
    rpmbuilder package.spec --git git://github.com/user/project.git -rr f8debbfdbebb97f5d0ee2218edf1425ac219cff5
    rpmbuilder package.spec -bb user:project
    rpmbuilder package.spec --github https://github.com/user/project/
    rpmbuilder package.spec --gopack github.com/user/project --tag v1.2.3

Dependencies install:

  --install, -I                        Install build dependencies before build process
  --install-latest, -IL                Install the latest versions of build dependencies before build process
  --enable-repo, -ER repo-name         Enable repositories (mergeable)
  --disable-repo, -DR repo-name        Disable repositories (mergeable)
  --exclude-package, -EX package       Exclude package by name or glob (mergeable)

Remote build:

  --parallel, -P                       Parallel build on all build nodes in the same time (tmux is required)
┌ --remote, -r user:pass@host:port     Build rpm package on the remote node with specified host, username and password (mergeable)
└ --remote, -r file                    Build rpm package on the remote nodes listed in specified file
┌ --key, -k file                       Path to the private key for specified user
└ --key, -k data                       Base64-encoded private key for specified user
  --node, -N index-or-name             Node index or name from the file with build nodes
  --attach, -A                         Attach to parallel build session in tmux

  Examples:

    rpmbuilder package.spec -r builder@192.168.1.100 -r builder@192.168.1.101 -k ~/.ssh/id_rsa
    rpmbuilder package.spec -r builder:mypass@127.0.0.1:2022~i386 -k ~/.ssh/id_ed25519
    rpmbuilder package.spec --remote ~/buildnodes.list --key ~/.ssh/id_ed25519
    rpmbuilder package.spec --remote builder@127.0.0.1:5001 --key $(base64 -w0 ~/.ssh/id_ed25519)
    rpmbuilder package.spec --parallel --remote ~/buildnodes.list --node 1,2

Build options:

  --no-build, -NB                      Don't execute any build stages
  --no-clean, -NC                      Don't remove source files and spec file after build
  --no-deps, -ND                       Don't verify build dependencies
  --no-binary, -NR                     Don't build binary packages
  --no-source, -NS                     Don't build source package
  --arch, -a arch                      Override target arch for a build
  --qa-rpaths "<value>,<value>,..."    Ignoring rpaths check

Arguments passing:

  --with, -w param                     Pass conditional parameters into a rpmbuild (mergeable)
  --without, -W param                  Pass conditional parameters into a rpmbuild (mergeable)
  --define, -D "macro=value"           Define MACRO with value (exist macro will be not redefined) (mergeable)

  Examples:

    rpmbuilder package.spec --with ssl --with ldap
    rpmbuilder package.spec -w ssl -w static -W ldap
    rpmbuilder package.spec --with "ssl ldap"
    rpmbuilder package.spec --define "install_dir=/some/dir" --define "service_user=someone"

  More info: https://kaos.sh/rpmbuilder/w/Conditional-Builds

Spec validation:

  --no-lint, -0                        Don't check spec file before package build
  --strict, -1                         Don't build package if perfecto found major problems in spec file
  --pedantic, -2                       Don't build package if perfecto found minor problems in spec file
  --perfect, -3                        Don't build package if perfecto found any problems in spec file

Other:

  --sign, -s                           Sign package after build
  --dest, -d dir                       Save built packages to a specified directory
  --keep-log, -kl                      Save build log after an unsuccessful build
  --bump, -b                           Bump release in spec file after a successful build
  --bump-comment, -bc comment          Comment which will be added while release bump
  --tmp dir                            Path to a temporary directory (default: /var/tmp)
  --verbose, -V                        Verbose output
  --no-color, -nc                      Disable colors in output
  --help, -h                           Show this help message
  --version, -v                        Show information about version

Build Status

Branch Status
master CI
develop CI

Contributing

Before contributing to this project please read our Contributing Guidelines.

License

Apache License, Version 2.0

About

RPM package build helper

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Shell 97.3%
  • Makefile 2.6%
  • Dockerfile 0.1%