SYNOPSIS
rdopkg <action> <arg>…
rdopkg -c
rdopkg -h
DESCRIPTION
rdopkg is a tool for automating RDO/RHOSP packaging tasks, such as introducing patches, updating packages to new versions and submitting packages to RDO.
Run rdopkg -h to get available actions.
persistence
rdopkg provides multi-step actions where each step is (should be) idempotent
so if something fails along the way or human interaction is required, rdopkg
drops to shell, let’s you rectify and then continue by running
rdopkg --continue (rdopkg -c).
The state is stored in .rdopkg.json file in current directory. Stored action
can be inspected (rdopkg status), continued (rdopkg --continue) or aborted
(rdopkg --abort). rdopkg will refuse to start new multi-step action if
state file is present.
ACTIONS
Important actions diagram
+---------------------+
/ WHAT DO YOU NEED? /
+-----+----------+----+
|
|
|
build new package
|
v
+----------------+
/ what change? /
+--+-----+-----+-+
| | |
+------+ | +--------+
| | |
just update introduce update to new
.spec patch(es) upstream version
| | |
| | |
v v v
+-----+ +-------+ +-------------+
| fix | | patch | | new-version |
+-----+ +-------+ +-------------+
ACTION: fix
Make .spec file only changes.
Flow:
-
Bump Release, prepare a new %changelog entry header.
-
Drop to shell, let user edit .spec file.
-
After running
rdopkg, ensure description was added to %changelog and commit changes to new commit.
Example:
cd python-novaclient rdopkg fix vim python-novaclient.spec rdopkg -c
ACTION: patch
Introduce new patches to the package.
This action works with patches branch
(see AUTOMAGIC → patches branch).
By default, rdopkg resets local patches branch to remote patches branch.
You can skip this this with --local-patches to directly use local patches
branch as is.
Note that patch is a high level wrapper of update-patches action. If
you’re interested in just updating patches in .spec file from local patches
branch, try using update-patches action instead.
Don’t forget to git fetch before running the action.
After running rdopkg patch, new commit will contain the changes.
Flow:
-
Unless
-l/--local-patcheswas used, reset local patches branch to remote patches branch. -
Update .spec file: bump Release, create new %changelog entry with new patches' titles and create a commit.
-
Update patches from local patches branch (
update-patchesaction) -
Display the diff.
ACTION: new-version
Update package to new upstream version.
This action works with patches branch
(see AUTOMAGIC → patches branch).
After successful rebase, rdopkg will offer to push the
rebased patches branch.
Required new-version argument is a new version to rebase on, presumably
a git version tag.
Don’t forget to git fetch --all before running the action.
After running rdopkg new-version, new commit will contain the changes.
To just update .spec without touching patches branch, -b/--bump-only can
be used. You might also occasionally want to skip fedpkg new-sources step
with -n/--no-new-sources. These two options combined give you local-only
operation, much like rpmdev-bumpspec:
rdopkg -bn
Flow:
-
Show diff from previous version, especially changes to
requirements.txt. -
Reset local patches branch to remote patches branch
-
Rebase local patches branch on
$NEW_VERSIONtag. -
Update
.specfile: setVersion,Releaseandpatches_baseto appropriate values and create new %changelog entry. -
Download source tarball.
-
Run
fedpkg new-sources(rhpkg new-sources). -
Update patches from local patches branch (
update-patchesaction) -
Display the diff.
Example:
cd python-novaclient git fetch --all rdopkg new-version 2.15.0 # rebase failed, manually fix using git rdopkg -c
ACTION: clone
Clone an RDO package distgit and setup remotes.
clone uses rdoinfo metadata to clone the specified RDO package
distgit and also setup relevant remotes to get you packaging quickly.
If your github username differs from your $USER, use -u/--review-user.
Example:
rdopkg clone -u github-user python-novaclient cd python-novaclient git remote -v
ACTION: update-patches
Update .spec file with patches from patches branch.
This is a core low level action used by other actions such as patch and
new-version to update dist-git patches from patches branch.
See AUTOMAGIC → patches branch for explanation.
update-patches is a rework of now obsolete update-patches.sh script with
less restrictions and more features such as optional #patches_base, support
for git am %{patches} method of applying patches and smart patches branch
detection. It also supports filtering out patches based on matching a
regex provided by a magic #patches_ignore comment in the spec file. This is
useful, for example, in case the patches branch contains changes that are
related to the CI/code review infra, that are useful to keep around but don’t
need to end up in the RPM.
Flow:
-
Export patches from patches branch using
git format-patch -
Add these patches to dist-git and edit
.specfile to apply them -
Create new commit with the change (or amend previous with
-a/--amend) -
If a "%global commit asdf1234" macro declaration is present, rewrite it with the current sha1 of the patches branch. (This makes the sha1 value available during your package’s build process. You can use this to build your program so that "mycoolprogram --version" could display the sha1 to users.)
Example:
rdopkg update-patches
ACTION: query
Query RDO/distro repos for available package versions.
See rdopkg-adv-requirements(7) for
complete example of query and other requirements management actions.
This action uses repoquery to discover latest package versions available
from RDO and other repos available on a supported distibution.
See output of rdopkg info for supported releases and distros.
Query specific RELEASE/DIST:
rdopkg query kilo/el7 openstack-nova
Query all dists of a release and show what’s happening:
rdopkg query -v kilo openstack-nova
ACTION: reqquery
Query RDO/distro repos for versions defined in requirements.txt.
See rdopkg-adv-requirements(7) for
complete example of reqquery and other requirements management actions.
This action essentially runs rdopkg query on every module/package defined in
requirements.txt and prints colorful report to quickly find unmet
dependencies. It accepts the same RELEAESE/DIST filter as rdopkg query.
Python module names listed in requirements.txt are mapped to package names
using rdopkg.actionmods.pymod2pkg module.
Query requirements.txt from 2015.1 tag:
rdopkg reqquery -R 2015.1 kilo/el7
Query requirements.txt file:
rdopkg reqquery -r path/to/requirements.txt kilo/f21
Query .spec Requires (experimental):
rdopkg reqquery -s
Verbosely dump query results to a file and view them:
rdopkg reqquery -v -d rdopkg reqquery -l
ACTION: reqcheck
Inspect requirements.txt vs .spec Requires.
See rdopkg-adv-requirements(7) for
complete example of reqcheck and other requirements management actions.
This action parses current requirements.txt from git and checks whether
they’re met in the .spec file. Simple report is printed.
Python module names listed in requirements.txt are mapped to package names
using rdopkg.actionmods.pymod2pkg module.
|
Note
|
Checking for exact version ranges is dumb at the moment. |
Example:
rdopkg reqcheck
ACTION: reqdiff
Show pretty diff of requirements.txt.
See rdopkg-adv-requirements(7) for
complete example of reqdiff and other requirements management actions.
Use this to see how requirements changed between versions.
See diff between current and latest upstream version (automagic):
rdopkg reqdiff
See diff between current and specified version:
rdopkg reqdiff 2015.1
See diff between two supplied versions:
rdopkg reqdiff 2015.1 2015.2
ACTION: kojibuild
Build the package in koji.
See rdopkg-adv-building(7) for complete example of building and submitting packages for RDO.
This is esentaially a wrapper over fedpkg build with added value of
generating update entries for rdopkg update.
Flow:
-
Run equivalent of
fedpkg buildusing disgustingfedpkgpython module. -
Watch the build.
Example:
rdopkg kojibuild
ACTION: coprbuild
Build the package in copr-jruzicka.
See rdopkg-adv-building(7) for complete example including instructions how to setup copr, obtain permissions, build, submit update, and more.
Please, try to do coprbuild after successful kojibuild to ensure same
SRPM for both builds. This will be automated further in the future.
-r/--release and -d/--dist are autodetected from current branch if
possible. These are used to select right copr to build in.
Flow:
-
Create the source RPM from current dist-git.
-
Upload the source RPM to your
fedorapeople.org:~/public_html/copr. (specify Fedora user with-u/--fuser) -
Submit the source RPM to build in
jruzicka / rdo-$RELEASE-$DISTcopr. -
Watch the build.
Example:
rdopkg coprbuild
ACTION: amend
Amend last git commit with current dist-git changes and (re)generate the commit message from %changelog.
This simple atomic action is equivalent to running
git commit -a --amend -m "$AUTOMAGIC_COMMIT_MESSAGE"
See AUTOMAGIC → commit message for more information about the generated commit message.
ACTION: squash
Squash last git commit into previous one. Commit message of previous commit is used.
This simple atomic action is a shortcut for
git reset --soft HEAD~ git commit --amend --no-edit
This is useful for squashing commits created by lower level actions such as
update-patches.
ACTION: get-sources
Download package source archive.
Currently, Source0 from .spec file is downloaded.
ACTION: info
Show information about RDO packaging.
Use this command to find out about:
-
currently supported RDO OpenStack releses
-
which distros are supported for each release
-
what branch to build from
-
what build system to build in
-
supported packages
-
various repositories tied to a package
-
package maintainers
This command is a human interface to rdoinfo.
Releases/dists/branches overview:
rdopkg info
Detailed information about a package:
rdopkg info novaclient
Filter packages by maintainers:
rdopkg info maintainers:jruzicka
ACTION: info-tags-diff
Show rdoinfo tag changes.
rdopkg info-tags-diff RDOINFODIR
will show per-package new/changed tags in rdoinfo between HEAD~..HEAD.
For an existing package, a list of changed tags is returned
For a new package, full tags dict is returned.
Example:
$ rdopkg info-tags-diff ~/.rdopkg/rdoinfo
openstack-changed ['newton-uc', 'newton']
openstack-new-pkg {'under-review': None}
This is an interface to rdopkg.actionmods.rdoinfo:tags_diff().
ACTION: conf
Display rdopkg’s local configuration.
This command prints the default configuration that ships with rdopkg out of the
box. You can override the individual settings here by using .py files in the
configuration directories.
Store your per-user configuration in ~/.rdopkg/conf.d/*.py, or store
system-wide configuration in /etc/rdopkg.d/*.py.
AUTOMAGIC
Instead of requiring project config files or endless lists of command line
arguments, rdopkg tries to guess all the neccessary variables.
patches branch
update-patches is a core lower level action for updating dist-git .spec
file with patches from associated patches branch. rdopkg tries hard to
detect the patches branch automagically, it’s usually $BRANCH-patches for
$BRANCH dist-git but one patches branch per multiple dist-gits is also
supported.
Best illustrated by example, following are all valid patches branches for
rhos-5.0-rhel-7 dist-git and they’re searched in that order:
-
rhos-5.0-rhel-7-patches
-
rhos-5.0-rhel-patches
-
rhos-5.0-patches ←-- preferred for RHOSP
-
rhos-patches
Use rdopkg pkgenv to check detected patches branch.
You can specify remote patches branch by -p/--patches-branch action
parameter for actions that use it, such as patch and new-version.
Previously, now obsolete update-patches.sh script required patches_base
comment to be present in spec file which indicated git revision on top of
which the patches are applied but this is now optional with
update-patches action and defaults to .spec Version.
Most common use of patches_base is to specify number of patches on top of
patches base (which defaults to spec Version) to skip:
# patches_base=+2
You can set an arbitrary git revision as a patches base:
# patches_base=1.2.3+2
You shouldn’t need to modify this by hand expect the number of skipped patches
as rdopkg manages patches_base as needed.
commit message
Actions modifying dist-git generate commit message from %changelog.
First line of commit message is first line from latest %changelog entry.
If there are multiple lines in latest %changelog entry, entire entry is listed in the commit message.
For each "(rhbz#XYZ)" mentioned in latest %changelog entry, "Resolves: rhbz#XYZ" is appended to commit message as required by RHOSP workflow.
If you need to (re)generate commit message after modifying %changelog, use ACTION: amend.
For example following %changelog entry:
%changelog * Tue Feb 11 2014 Jakub Ruzicka <jruzicka@redhat.com> 0.5.1-2 - Update to upstream 0.5.1 - Fix evil Bug of Doom (rhbz#123456)
will generate following commit message:
Update to upstream 0.5.1
Resolves: rhbz#123456
Changelog: - Update to upstream 0.5.1 - Fix evil Bug of Doom (rhbz#123456)
rdoinfo
rdoinfo is a special utility repository with RDO metadata:
rdopkg uses rdoinfo to
-
detect release/dist from branch name
-
check valid RDO updates
-
query packages from RDO/distribution repos
and more.
You can view the rdoinfo metada using rdopkg info.
rdopkg.actionmods.rdoinfo module provides convenient interface to rdoinfo
should you want to integrate it into your codez.
CONTACT
rdopkg is maintained by Jakub Ruzicka <jruzicka@redhat.com>.
Bugs are tracked in Red Hat Bugzilla:
To report a new bug: