RELEASERS.CONF(5)
π RELEASERS.CONF π
okay bestie, welcome to releasers.conf β this is part of the Tito user manual, and it's literally the glow-up guide for where your builds go when they grow up. π
β¨ NAME β¨
releasers.conf β the config file where you define all your release targets, aka the places your builds get published. it's giving "destination board at the airport" but for rpms. π«
πΈ SYNOPSIS πΈ
None
not me having zero synopsis π there's literally nothing to put here. iconic of it honestly.
π DESCRIPTION π
Tito lets projects define their own release targets β and those targets can spell out the exact releaser implementation you want to use (yes, even a custom one you wrote yourself, main character behavior π«Ά), plus any arguments that implementation needs for a specific type of build.
π¦ RELEASERS π¦
Tito ships with several releaser implementations you can drop straight into releasers.conf. And if you're feeling extra β¨, you can define a lib_dir in your tito.props globalconfig section and park your own custom releaser implementation there. build your own, bestie, we love to see it.
If you set builder.test = 1 in your releasers.conf target, that's how you turn on --test builds. (heads up: this uses the latest git HEAD rather than the latest tagged package π·οΈ) this is lowkey perfect for automating the publishing of a nightly build β the kind of thing you'd rather not have to keep tagging over and over like a clown. π
π tito.release.YumRepoReleaser
The releaser that will build your packages, rsync down an existing yum repository, place your packages inside it, regenerate the yum repodata, and then rsync the yum repository back up. full circle moment. π
- It requires the
srpm_disttag = .fc21to specify the disttag on the resulting source RPM. This lets a correct srpm get uploaded, and prevents problems with it getting clobbered when building for "newer" disttags. π (no one wants a clobbered srpm, fr fr) - Specify
filetypes = srpmif you want to build a source rpm instead of a regular rpm. - Specify
createrepo_command = createrepo_c -s sha1if you are building on a recent distro and are working with yum repositories for rhel5. - You can use the environment variable
RSYNC_USERNAMEto override the rsync username.
π tito.release.RsyncReleaser
The releaser that will build your packages and rsync up to a remote repository. sending it straight to the cloud, periodt. βοΈ
- Specify
filetypes = rpm srpm tgzto choose what type of packages will be uploaded. - You can use the environment variable
RSYNC_USERNAMEto override the rsync username. - Specify
scl = COLLECTIONto build into a Software Collection.
Deprecated β prefer builder.scl = COLLECTION instead. bestie it's giving "old news", move on π
- The variable
rsync_argscan specify additional arguments passed to rsync. Default is-rlvz.
π tito.release.FedoraGitReleaser
This one will checkout your project in Fedora git using fedpkg. Sources are then synced to the first branch your releaser lists. After that, tito will git merge the first branch into all the other listed branches, triggering builds in each one. cascade queen. π
The branches property can contain aliases such as fedora-all, fedora-stable, fedora-latest, epel-all, etc. For the complete list of aliases and their explanations, see https://github.com/rpm-software-management/fedora-distro-aliases.
The required_bz_flags property can be specified to have tito check Red Hat Bugzilla to see if each bug number extracted from the changelog has the appropriate flags. If it does not, it will be skipped in the commit message. If no bugs are found with the required tags, a placeholder_bz can be specified (see below), otherwise the release will abort. π
The placeholder_bz property can be specified to use if no bugs were found in the changelog with the required flags.
[fedora-git]
releaser = tito.release.FedoraGitReleaser
branches = fedora-all epel7 epel8 epel9
required_bz_flags = myos-1.1.0+ pm_ack+
placeholder_bz = 100000
π tito.release.CentosGitReleaser
This releaser will checkout your fork in the project in the Centos Stream git using centpkg. A new branch off your fork is then created for the changes. This is produced in the same way as the FedoraGitReleaser, with a .tar file that is loaded to the lookaside. The branch gets pushed to the forked repo and tito is done. The process then requires the manual creation of a merge request against the main repo of the release, which is done in the web UI. so close, yet so manual. π«
The required_bz_flags property can be specified to have tito check Red Hat Bugzilla to see if each bug number extracted from the changelog has appropriate flags. If it does not, it will be skipped in the commit message. If no bugs are found with the required tags, a placeholder_bz can be specified (see below), otherwise the release will abort.
The placeholder_bz property can be specified to use if no bugs were found in the changelog with the required flags.
[centos-git]
releaser = tito.release.CentosGitReleaser
branches = c9s
required_bz_flags = release+
placeholder_bz = 100000
If you would like to build (ie - koji) against a different target than what is default for the FedoraGit/DistGit branch currently being worked on, it can be done like the following example. π₯
Note The formatting ofbuild_targetsin the following example isgit_branch:koji_build_targetand the following custom build targets are just place holders for the example and aren't likely to exist in Fedora's koji. don't come for me, they're fake bestie. π
[fedora-git-custom-target]
releaser = tito.release.FedoraGitReleaser
branches = master el6 f19
build_targets = master:custom-target el6:el6-custom-target f19:f19-custom-target
π tito.release.DistGitReleaser
Same as FedoraGitReleaser, but use rhpkg instead of fedpkg. that's it, that's the whole vibe. π«
π₯ tito.release.KojiReleaser
This releaser creates a src.rpm and submits it into Koji. It can submit more than one build at once β multitasking icon. π
Note This is targeted for private instances of Koji. You cannot submit regular builds into Fedora Koji using this releaser, because Fedora Koji does not allow builds from src.rpm β for building into Fedora see FedoraGitReleaser above. read the sign, bestie. π«
[koji]
releaser = tito.release.KojiReleaser
autobuild_tags = my-koji-tag-rhel6 my-koji-tag-fedora18
In this example, the releaser will create the src.rpm according to the definition of [my-koji-tag-rhel6] in tito.props. You usually want to set up there at least disttag. See the KOJI section in tito.props(5).
If the --scratch option or the SCRATCH environment variable is set, the package is built as scratch in Koji.
You can specify KOJI_OPTIONS in titorc(5) and it is passed to the koji command as an option. Usually you want to specify at least the --config option.
The variable autobuild_tags is required for KojiReleaser. no tag, no build, sorry angel. π
β tito.release.KojiGitReleaser
Build into Koji through dist-git. It behaves as KojiReleaser. The only difference is that the src.rpm is not passed to Koji. Instead it is sent to a koji git hash from which Koji should build the package. π
Note: This feature is not in upstream Koji (although it is submitted for a long time). it's been waiting in the queue like a text back. π
Please do not confuse this with FedoraGitReleaser. KojiGitReleaser is intended for private instances of Koji.
You need to specify git_url, which specifies the url of the git repository. This url needs to be reachable from Koji. π
π§ tito.release.ObsReleaser
Build into Open Build Service using the osc command.
You must specify project_name in the config. You can optionally specify package_name, but if it is not present, the name of the package directory is used.
This releaser assumes that you have ~/.oscrc correctly configured. get your config together first, queen. π
π tito.release.CoprReleaser
This releaser submits your src.rpm to Copr.
[my-copr]
releaser = tito.release.CoprReleaser
project_name = my-copr-project-name
upload_command = scp %(srpm)s my.web.com:public_html/my_srpm/
remote_location = http://my.web.com/~msuchy/my_srpm/
copr_options = --timeout 600
Variables are:
project_nameβ this is the name of your project on Copr.upload_commandβ this command is executed to upload the src.rpm to the internet. It can bescp,rsyncor justcp. It may contain the string"%(srpm)s"(even several times), which is substituted by the real srpm path. (optional)remote_locationβ how the location above can be accessed over www. (optional)copr_optionsβ space separated options to pass directly tocopr-cli build. Defaults to--nowait. (optional)
The releaser will publish your src.rpm to a remote server and then submit it into Copr via URL. If you would rather submit the package directly from your computer, just omit the upload_command and remote_location variables. choose your own adventure, bestie. π
project_name behaves exactly as autobuild_tags in KojiReleaser, and you can define various options for each project name in tito.props (e.g. disttag, whitelist, blacklist, scl). For more information see the man page of tito.props.
Note: this releaser assumes you havecopr-clicorrectly configured. See the API KEY section in thecopr-climan page. π
β¨ EXAMPLE β¨
okay bestie, this is the part where it all comes together π«Ά like, real, copy-pasteable config blocks that show you how these releasers and builders actually vibe together in the wild. every single one of these is straight from the page, so peek at the one that matches your situation and go.
π yum repo, fedora-15-x86_64
the classic. release into a fedora-15-x86_64 yum repo:
; Release into fedora-15-x86_64 yum repo
[yum-f15-x86_64]
releaser = tito.release.YumRepoReleaser
srpm_disttag = .fc15
builder = tito.builder.MockBuilder
builder.mock = fedora-15-x86_64
rsync = fedorapeople.org:/srv/repos/dgoodwin/tito/fedora-15/x86_64/ fedorapeople.org:/srv/repos/dgoodwin/tito/fedora-15/x86_64/
see how rsync has two destinations in there? yeah. it can do that. slay.
πΈ el6 yum repository
and here's the el6 one, where the comment literally tells you to specify builder.test=1 so that we build on the latest commit instead of the latest tito tag (iykyk):
; Release into el6 yum repository. specify builder.test=1 so that
; we build on latest commit (instead of latest tito tag)
[yum-el6-x86_64]
releaser = tito.release.YumRepoReleaser
srpm_disttag = .el6
builder = tito.builder.MockBuilder
builder.mock = epel-6-x86_64
builder.test = 1
scl = ruby193
rsync = remoteserver.org:/srv/repos/el6/testing/x86_64
also scl = ruby193 is hanging out in there, just doing its thing π
π uploading into a source repository
when you just want the source bits up on the server:
; Upload into source repository
[yum-fc15-sources]
releaser = tito.release.YumRepoReleaser
srpm_disttag = .fc15
builder = tito.builder.MockBuilder
builder.mock = fedora-15-x86_64
filetypes = srpm
rsync = remoteserver.org:/srv/repos/fedora-15/SRPMS
filetypes = srpm, so it's srpms only. minimal. focused. main character energy. β¨
π₯ el5 yum repository (overloading createrepo_command)
the el5 one, where the config overloads createrepo_command to make an el5-compatible repo:
; el5 yum repository. Overloading createrepo_command to make
; el5 compatible repo.
[yum-el5-i386]
releaser = tito.release.YumRepoReleaser
srpm_disttag = .el5
builder = tito.builder.MockBuilder
builder.mock = epel-5-i386
createrepo_command = createrepo_c -s sha1
rsync = remoteserver.org:/srv/repos/rhel5/i386
look at createrepo_c -s sha1 doing the absolute most for backwards compatibility. iconic honestly.
π¦ rsync a tgz with custom rsync args
this one rsyncs a tgz file to a remote site, and it brings its own rsync arguments along for the ride:
; rsync tgz file to remote site with custom rsync arguments
[rsync]
releaser = tito.release.RsyncReleaser
srpm_disttag = .fc15
builder = tito.builder.MockBuilder
builder.mock = fedora-15-x86_64
filetypes = tgz
rsync = remoteserver.org:/srv/tarballs/
rsync_args = -rlvzpt
filetypes = tgz + rsync_args = -rlvzpt. that's it. that's the whole vibe. π
π releasing with OBS
releasing via OBS, which is so short and sweet compared to the others:
; Release using OBS
[obs-project]
releaser=tito.release.ObsReleaser
project_name=home:xsuchy
no builder, no rsync, nothing extra. just the releaser and a project_name. lowkey elegant.
π Copr: upload the src.rpm, then submit it by URL
okay so this one uploads the src.rpm to a remote server first, and then submits it into Copr via a URL:
; Upload src.rpm to remote server and then submit it into Copr via URL
[copr-project]
releaser = tito.release.CoprReleaser
project_name = my-copr-project-name another-project
upload_command = cp %(srpm)s /home/msuchy/public_html/my_srpm/
remote_location = http://my.web.com/~msuchy/my_srpm/
not me noticing project_name can hold two project names (my-copr-project-name another-project) π and yes %(srpm)s is doing substitution magic inside upload_command. keep it exactly like that bestie, don't touch it.
π Copr: straight from your computer, no upload step
and if you'd rather skip the whole remote-upload situation and submit the src.rpm from your computer directly to Copr:
; Submit src.rpm from your computer directly to Copr
[copr-project]
releaser = tito.release.CoprReleaser
project_name = my-copr-project-name another-project
two lines of actual config. periodt. β¨
π Copr: same thing but with a timeout
and finally, the same direct-to-Copr setup, except it times out after 10 minutes:
; Submit src.rpm from your computer directly to Copr, timeout after 10 minutes
[copr-project]
releaser = tito.release.CoprReleaser
project_name = my-copr-project-name another-project
copr_options = --timeout 600
600 seconds = 10 minutes, so copr_options = --timeout 600 is literally the "bestie I am NOT waiting forever" setting π
that's the whole page, you made it π₯³ this was RELEASERS.CONF(5), brought to you by tito, dated 08/26/2026 β go forth and release your software, bestie, you're gonna eat π
πβ¨
π¦ where this page comes from
- epel 9: tito 0.6.28-1.el9 Β· GPL-2.0-only
- fedora 43: tito 0.6.28-1.fc43 Β· GPL-2.0-only
- fedora 44: tito 0.6.28-1.fc44 Β· GPL-2.0-only
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms