SBR600 Mock and Koji Lab
Purpose
To use and become familiar with the mock and koji tools.
Mock is used to test that the BuildRequires for a package are complete and accurate, by creating a bare-bones chroot environment containing only the basic build packages plus any packages indicated by BuildRequires lines in the spec file.
Koji is a client-server system which allows you to queue builds within the Fedora build farm. This permits you to test whether your package builds on multiple different architectures, which is especially useful when you don't otherwise have access to the machines of each architecture. For example, if you are working on a 32-bit PC, you won't be able to directly test builds on a 64-bit PC architecture (x86_64), nor non-PC architectures such as ARM, MIPS, PA-Risc, IA64, S390, Sparc, and PowerPC.
Background Resources
Required Resources
Before starting this lab, you will need:
- A Fedora Account System (FAS2) account.
- The SRPMs from the previous lab.
Preparation
Mock
- Install the mock package:
yum install mock
- Add yourself to the mock group:
usermod -aG mock yourUserName
Koji
- Follow the procedure on the UsingKoji page on the Fedora wiki for setup instructions.
Steps
Testing BuildRequires with Mock
- Run this command for each of your SRPMs:
mock -r fedora-26-x86_64 yourSRPM
- Replace fedora-26-x86_64 with the appropriate distribution-release-arch values; the example is for Fedora 26 on 64-bit AMD/Intel systems. This must correspond to a config file in
/etc/mock
(without the.cfg
extension). - Replace yourSRPM with the filename of the SRPM you wish to test.
- Replace fedora-26-x86_64 with the appropriate distribution-release-arch values; the example is for Fedora 26 on 64-bit AMD/Intel systems. This must correspond to a config file in
- If there are errors, they will be recorded in the results directory. Refer to the mock output for the location of the results directory, which will vary according to the mock configuration file used (if the configuration is fedora-26-x86_64, the results will be in
/var/lib/mock/fedora-26-x86_64/result
). - Correct any errors by adding appropriate
BuildRequilres:
tags, build the source RPM, and then retest.
Testing Builds on Other Architectures using Koji
Koji is a client-server system. Your computer runs the client software, which will submit the build job to a koji build hub. The build task will go through several states as it is picked up from the koji hub by a builder (a separate server system which retrieves jobs from the koji-hub and builds them) and that build either succeeds or fails.
Queueing the Build Request
To queue the build request on the main koji server, used for primary architecture builds (i386 and x86_64):
- Issue the command:
koji build f17 --scratch yourSRPM
- f17 (called the Target) instructs koji to build the package using the packages available in the Fedora 17 distribution, and prepare it for inclusion in that distribution. Note: for versions of Fedora prior to f16, use dist-fXX where XX is the release.
- The --scratch option causes koji to build the package but not tag it for the target (i.e., not to include it in Fedora). To perform a build that will be passed to Bodhi for distribution, substitute
--rebuild
for--scratch
and use a git URL for the package (do not do this until you have passed the package review and sponsor procedures!).
- You can either follow the progress of the build by leaving the command running, or you may interrupt the
koji
command by pressing Ctrl-C once the message "this may be safely interrupted" is printed. Record the taskID printed for future reference.
To queue the build request on the koji server for another architecture, substitute arch-koji
for the koji
command. For example: arm-koji build dist-f18 --scratch foo*.src.rpm
Use Koji to build a scratch package for each of the following architectures:
- Primary architectures (submit using the "koji" command):
- i386 (32-bit AMD/Intel)
- x86_64 (64-bit AMD/Intel)
- ARM architectures:
- armv5tel (ARM architecture version 5 with "soft fp" ABI)
- armv7hl (ARM architecture verison 7 with "hard fp" ABI)
- s390 mainframe architectures:
- s390
- s390x
- PowerPC architectures:
- ppc (32-bit)
- ppc64 (64-bit)
Viewing the Build Request Status
You can view the status of a task through:
- The original koji command, if you did not interrupt it.
- The command:
koji watch-task taskID
- Using the web interface.
- For the primary arch koji system, go to https://koji.fedoraproject.org
- For any of the secondary arch koji system, go to https://arch.koji.fedoraproject.org (e.g., http://arm.koji.fedoraproject.org for the ARM koji web interface)
Solving Architecture-Specific Errors Identified with Koji
Arch-Specific Conditionals
If your package does not build on a particular architecture using the same spec file contents as on the primary architectures, you can use architecture-specific conditionals to include or exclude parts of the spec file.
To include parts of a specfile only on a particular architecture (ppc in this example):
%ifarch ppc BuildRequires: foo %endif
To exclude parts of a specfile only on a particular architecture:
%ifnarch ppc BuildRequires: bar %endif
You can also use %else
to specify alternation:
%ifarch ppc %configure --baz %else %configure --qux %endif
Excluding an Architecture
If a package will not build on a particular architecture, perhaps because the BuildRequires are not available on that arch, you can specify that the package should be excluded from that arch:
ExcludeArch: ppc
If a package only applies to a certain architecture -- for example, it is CPU-specific microcode -- it can be marked as such:
ExclusiveArch: x86_64
Note that ExcludeArch is preferred over ExclusiveArch except where the package is definitely architecture-specific.
Deliverable
Create a blog post describing your experience. Include:
- Notes on what you did, and what worked and didn't work.
- How long the overall process took -- the mock build and the koji build for each architecture.
- The results, including a link to your SRPM if it was modified from your previous lab.
- Your reflections on the tools, process, and experience.