1PUNGI(1) Pungi PUNGI(1)
2
3
4
6 pungi - Pungi Documentation
7
8 Contents:
9
11 [image: Pungi Logo] [image]
12
13 Pungi is a distribution compose tool.
14
15 Composes are release snapshots that contain release deliverables such
16 as:
17
18 • installation trees
19
20 • RPMs
21
22 • repodata
23
24 • comps
25
26 • (bootable) ISOs
27
28 • kickstart trees
29
30 • anaconda images
31
32 • images for PXE boot
33
34 Tool overview
35 Pungi consists of multiple separate executables backed by a common li‐
36 brary.
37
38 The main entry-point is the pungi-koji script. It loads the compose
39 configuration and kicks off the process. Composing itself is done in
40 phases. Each phase is responsible for generating some artifacts on
41 disk and updating the compose object that is threaded through all the
42 phases.
43
44 Pungi itself does not actually do that much. Most of the actual work is
45 delegated to separate executables. Pungi just makes sure that all the
46 commands are invoked in the appropriate order and with correct argu‐
47 ments. It also moves the artifacts to correct locations.
48
49 The executable name pungi-koji comes from the fact that most of those
50 separate executables submit tasks to Koji that does the actual work in
51 an auditable way.
52
53 However unlike doing everything manually in Koji, Pungi will make sure
54 you are building all images from the same package set, and will produce
55 even deliverables that Koji can not create like YUM repos and installer
56 ISOs.
57
58 Links
59 • Upstream GIT: https://pagure.io/pungi/
60
61 • Issue tracker: https://pagure.io/pungi/issues
62
63 • Questions can be asked on #fedora-releng IRC channel on FreeNode
64
65 Origin of name
66 The name Pungi comes from the instrument used to charm snakes. Anaconda
67 being the software Pungi was manipulating, and anaconda being a snake,
68 led to the referential naming.
69
70 The first name, which was suggested by Seth Vidal, was FIST, Fedora In‐
71 stallation <Something> Tool. That name was quickly discarded and re‐
72 placed with Pungi.
73
74 There was also a bit of an inside joke that when said aloud, it could
75 sound like punji, which is a sharpened stick at the bottom of a trap.
76 Kind of like software…
77
79 Each invocation of pungi-koji consists of a set of phases. [image:
80 phase diagram] [image]
81
82 Most of the phases run sequentially (left-to-right in the diagram), but
83 there are use cases where multiple phases run in parallel. This happens
84 for phases whose main point is to wait for a Koji task to finish.
85
86 Init
87 The first phase to ever run. Can not be skipped. It prepares the comps
88 files for variants (by filtering out groups and packages that should
89 not be there). See Processing comps files for details about how this
90 is done.
91
92 Pkgset
93 This phase loads a set of packages that should be composed. It has two
94 separate results: it prepares repos with packages in work/ directory
95 (one per arch) for further processing, and it returns a data structure
96 with mapping of packages to architectures.
97
98 Buildinstall
99 Spawns a bunch of threads, each of which runs either lorax or buildin‐
100 stall command (the latter coming from anaconda package). The commands
101 create boot.iso and other boot configuration files. The image is fi‐
102 nally linked into the compose/ directory as netinstall media.
103
104 The created images are also needed for creating live media or other im‐
105 ages in later phases.
106
107 With lorax this phase runs one task per variant.arch combination. For
108 buildinstall command there is only one task per architecture and prod‐
109 uct.img should be used to customize the results.
110
111 Gather
112 This phase uses data collected by pkgset phase and figures out what
113 packages should be in each variant. The basic mapping can come from
114 comps file, a JSON mapping or additional_packages config option. This
115 inputs can then be enriched by adding all dependencies. See Gathering
116 packages for details.
117
118 Once the mapping is finalized, the packages are linked to appropriate
119 places and the rpms.json manifest is created.
120
121 ExtraFiles
122 This phase collects extra files from the configuration and copies them
123 to the compose directory. The files are described by a JSON file in the
124 compose subtree where the files are copied. This metadata is meant to
125 be distributed with the data (on ISO images).
126
127 Createrepo
128 This phase creates RPM repositories for each variant.arch tree. It is
129 actually reading the rpms.json manifest to figure out which packages
130 should be included.
131
132 OSTree
133 Updates an ostree repository with a new commit with packages from the
134 compose. The repository lives outside of the compose and is updated
135 immediately. If the compose fails in a later stage, the commit will not
136 be reverted.
137
138 Implementation wise, this phase runs rpm-ostree command in Koji runroot
139 (to allow running on different arches).
140
141 Createiso
142 Generates ISO files and accumulates enough metadata to be able to cre‐
143 ate image.json manifest. The file is however not created in this phase,
144 instead it is dumped in the pungi-koji script itself.
145
146 The files include a repository with all RPMs from the variant. There
147 will be multiple images if the packages do not fit on a single image.
148
149 The image will be bootable if buildinstall phase is enabled and the
150 packages fit on a single image.
151
152 There can also be images with source repositories. These are never
153 bootable.
154
155 ExtraIsos
156 This phase is very similar to createiso, except it combines content
157 from multiple variants onto a single image. Packages, repodata and ex‐
158 tra files from each configured variant are put into a subdirectory. Ad‐
159 ditional extra files can be put into top level of the image. The image
160 will be bootable if the main variant is bootable.
161
162 LiveImages, LiveMedia
163 Creates media in Koji with koji spin-livecd, koji spin-appliance or
164 koji spin-livemedia command. When the media are finished, the images
165 are copied into the compose/ directory and metadata for images is up‐
166 dated.
167
168 ImageBuild
169 This phase wraps up koji image-build. It also updates the metadata ul‐
170 timately responsible for images.json manifest.
171
172 OSBuild
173 Similarly to image build, this phases creates a koji osbuild task. In
174 the background it uses OSBuild Composer to create images.
175
176 OSBS
177 This phase builds container base images in OSBS.
178
179 The finished images are available in registry provided by OSBS, but not
180 downloaded directly into the compose. The is metadata about the created
181 image in compose/metadata/osbs.json.
182
183 ImageContainer
184 This phase builds a container image in OSBS, and stores the metadata in
185 the same file as OSBS phase. The container produced here wraps a dif‐
186 ferent image, created it ImageBuild or OSBuild phase. It can be useful
187 to deliver a VM image to containerized environments.
188
189 OSTreeInstaller
190 Creates bootable media that carry an ostree repository as a payload.
191 These images are created by running lorax with special templates. Again
192 it runs in Koji runroot.
193
194 Repoclosure
195 Run repoclosure on each repository. By default errors are only reported
196 in the log, the compose will still be considered a success. The actual
197 error has to be looked up in the compose logs directory. Configuration
198 allows customizing this.
199
200 ImageChecksum
201 Responsible for generating checksums for the images. The checksums are
202 stored in image manifest as well as files on disk. The list of images
203 to be processed is obtained from the image manifest. This way all im‐
204 ages will get the same checksums irrespective of the phase that created
205 them.
206
207 Test
208 This phase is supposed to run some sanity checks on the finished com‐
209 pose.
210
211 The only test is to check all images listed the metadata and verify
212 that they look sane. For ISO files headers are checked to verify the
213 format is correct, and for bootable media a check is run to verify they
214 have properties that allow booting.
215
217 The configuration file parser is provided by kobo
218
219 The file follows a Python-like format. It consists of a sequence of
220 variables that have a value assigned to them.
221
222 variable = value
223
224 The variable names must follow the same convention as Python code:
225 start with a letter and consist of letters, digits and underscores
226 only.
227
228 The values can be either an integer, float, boolean (True or False), a
229 string or None. Strings must be enclosed in either single or double
230 quotes.
231
232 Complex types are supported as well.
233
234 A list is enclosed in square brackets and items are separated with com‐
235 mas. There can be a comma after the last item as well.
236
237 a_list = [1,
238 2,
239 3,
240 ]
241
242 A tuple works like a list, but is enclosed in parenthesis.
243
244 a_tuple = (1, "one")
245
246 A dictionary is wrapped in brackets, and consists of key: value pairs
247 separated by commas. The keys can only be formed from basic types (int,
248 float, string).
249
250 a_dict = {
251 'foo': 'bar',
252 1: None
253 }
254
255 The value assigned to a variable can also be taken from another vari‐
256 able.
257
258 one = 1
259 another = one
260
261 Anything on a line after a # symbol is ignored and functions as a com‐
262 ment.
263
264 Importing other files
265 It is possible to include another configuration file. The files are
266 looked up relative to the currently processed file.
267
268 The general structure of import is:
269
270 from FILENAME import WHAT
271
272 The FILENAME should be just the base name of the file without extension
273 (which must be .conf). WHAT can either be a comma separated list of
274 variables or *.
275
276 # Opens constants.conf and brings PI and E into current scope.
277 from constants import PI, E
278
279 # Opens common.conf and brings everything defined in that file into current
280 # file as well.
281 from common import *
282
283 NOTE:
284 Pungi will copy the configuration file given on command line into
285 the logs/ directory. Only this single file will be copied, not any
286 included ones. (Copying included files requires a fix in kobo li‐
287 brary.)
288
289 The JSON-formatted dump of configuration is correct though.
290
291 Formatting strings
292 String interpolation is available as well. It uses a %-encoded format.
293 See Python documentation for more details.
294
295 joined = "%s %s" % (var_a, var_b)
296
297 a_dict = {
298 "fst": 1,
299 "snd": 2,
300 }
301 another = "%(fst)s %(snd)s" % a_dict
302
304 Please read productmd documentation for terminology and other release
305 and compose related details.
306
307 Minimal Config Example
308 # RELEASE
309 release_name = "Fedora"
310 release_short = "Fedora"
311 release_version = "23"
312
313 # GENERAL SETTINGS
314 comps_file = "comps-f23.xml"
315 variants_file = "variants-f23.xml"
316
317 # KOJI
318 koji_profile = "koji"
319 runroot = False
320
321 # PKGSET
322 sigkeys = [None]
323 pkgset_source = "koji"
324 pkgset_koji_tag = "f23"
325
326 # GATHER
327 gather_method = "deps"
328 greedy_method = "build"
329 check_deps = False
330
331 # BUILDINSTALL
332 buildinstall_method = "lorax"
333
334 Release
335 Following mandatory options describe a release.
336
337 Options
338 release_name [mandatory]
339 (str) – release name
340
341 release_short [mandatory]
342 (str) – release short name, without spaces and special charac‐
343 ters
344
345 release_version [mandatory]
346 (str) – release version
347
348 release_type = “ga” (str) – release type, for example ga,
349 updates or updates-testing. See list of all valid values in pro‐
350 ductmd documentation.
351
352 release_internal = False
353 (bool) – whether the compose is meant for public consumption
354
355 treeinfo_version
356 (str) Version to display in .treeinfo files. If not configured,
357 the value from release_version will be used.
358
359 Example
360 release_name = "Fedora"
361 release_short = "Fedora"
362 release_version = "23"
363 # release_type = "ga"
364
365 Base Product
366 Base product options are optional and we need to them only if we’re
367 composing a layered product built on another (base) product.
368
369 Options
370 base_product_name
371 (str) – base product name
372
373 base_product_short
374 (str) – base product short name, without spaces and special
375 characters
376
377 base_product_version
378 (str) – base product major version
379
380 base_product_type = “ga”
381 (str) – base product type, “ga”, “updates” etc., for full list
382 see documentation of productmd.
383
384 Example
385 release_name = "RPM Fusion"
386 release_short = "rf"
387 release_version = "23.0"
388
389 base_product_name = "Fedora"
390 base_product_short = "Fedora"
391 base_product_version = "23"
392
393 General Settings
394 Options
395 comps_file [mandatory]
396 (scm_dict, str or None) – reference to comps XML file with in‐
397 stallation groups
398
399 variants_file [mandatory]
400 (scm_dict or str) – reference to variants XML file that defines
401 release variants and architectures
402
403 module_defaults_dir [optional]
404 (scm_dict or str) – reference the module defaults directory con‐
405 taining modulemd-defaults YAML documents. Files relevant for
406 modules included in the compose will be embedded in the gener‐
407 ated repodata and available for DNF.
408
409 module_defaults_dir = {
410 "scm": "git",
411 "repo": "https://pagure.io/releng/fedora-module-defaults.git",
412 "dir": ".",
413 }
414
415 failable_deliverables [optional]
416 (list) – list which deliverables on which variant and architec‐
417 ture can fail and not abort the whole compose. This only applies
418 to buildinstall and iso parts. All other artifacts can be con‐
419 figured in their respective part of configuration.
420
421 Please note that * as a wildcard matches all architectures but
422 src.
423
424 comps_filter_environments [optional]
425 (bool) – When set to False, the comps files for variants will
426 not have their environments filtered to match the variant.
427
428 tree_arches
429 ([str]) – list of architectures which should be included; if un‐
430 defined, all architectures from variants.xml will be included
431
432 tree_variants
433 ([str]) – list of variants which should be included; if unde‐
434 fined, all variants from variants.xml will be included
435
436 repoclosure_strictness
437 (list) – variant/arch mapping describing how repoclosure should
438 run. Possible values are
439
440 • off – do not run repoclosure
441
442 • lenient – (default) run repoclosure and write results to
443 logs, but detected errors are only reported in logs
444
445 • fatal – abort compose when any issue is detected
446
447 When multiple blocks in the mapping match a variant/arch combi‐
448 nation, the last value will win.
449
450 repoclosure_backend
451 (str) – Select which tool should be used to run repoclosure over
452 created repositories. By default yum is used, but you can switch
453 to dnf. Please note that when dnf is used, the build dependen‐
454 cies check is skipped. On Python 3, only dnf backend is avail‐
455 able.
456
457 See also: the gather_backend setting for Pungi’s gather phase.
458
459 cts_url
460 (str) – URL to Compose Tracking Service. If defined, Pungi will
461 add the compose to Compose Tracking Service and ge the compose
462 ID from it. For example https://cts.localhost.tld/
463
464 cts_keytab
465 (str) – Path to Kerberos keytab which will be used for Compose
466 Tracking Service Kerberos authentication. If not defined, the
467 default Kerberos principal is used.
468
469 compose_type
470 (str) – Allows to set default compose type. Type set via a com‐
471 mand-line option overwrites this.
472
473 mbs_api_url
474 (str) – URL to Module Build Service (MBS) API. For example
475 https://mbs.example.com/module-build-service/2. This is re‐
476 quired by pkgset_scratch_modules.
477
478 Example
479 comps_file = {
480 "scm": "git",
481 "repo": "https://git.fedorahosted.org/git/comps.git",
482 "branch": None,
483 "file": "comps-f23.xml.in",
484 }
485
486 variants_file = {
487 "scm": "git",
488 "repo": "https://pagure.io/pungi-fedora.git ",
489 "branch": None,
490 "file": "variants-fedora.xml",
491 }
492
493 failable_deliverables = [
494 ('^.*$', {
495 # Buildinstall can fail on any variant and any arch
496 '*': ['buildinstall'],
497 'src': ['buildinstall'],
498 # Nothing on i386 blocks the compose
499 'i386': ['buildinstall', 'iso', 'live'],
500 })
501 ]
502
503 tree_arches = ["x86_64"]
504 tree_variants = ["Server"]
505
506 repoclosure_strictness = [
507 # Make repoclosure failures fatal for compose on all variants …
508 ('^.*$', {'*': 'fatal'}),
509 # … except for Everything where it should not run at all.
510 ('^Everything$', {'*': 'off'})
511 ]
512
513 Image Naming
514 Both image name and volume id are generated based on the configuration.
515 Since the volume id is limited to 32 characters, there are more set‐
516 tings available. The process for generating volume id is to get a list
517 of possible formats and try them sequentially until one fits in the
518 length limit. If substitutions are configured, each attempted volume id
519 will be modified by it.
520
521 For layered products, the candidate formats are first image_volid_lay‐
522 ered_product_formats followed by image_volid_formats. Otherwise, only
523 image_volid_formats are tried.
524
525 If no format matches the length limit, an error will be reported and
526 compose aborted.
527
528 Options
529 There a couple common format specifiers available for both the options:
530
531 • compose_id
532
533 • release_short
534
535 • version
536
537 • date
538
539 • respin
540
541 • type
542
543 • type_suffix
544
545 • label
546
547 • label_major_version
548
549 • variant
550
551 • arch
552
553 • disc_type
554
555 image_name_format [optional]
556 (str|dict) – Python’s format string to serve as template for im‐
557 age names. The value can also be a dict mapping variant UID
558 regexes to the format string. The pattern should not overlap,
559 otherwise it is undefined which one will be used.
560
561 This format will be used for all phases generating images. Cur‐
562 rently that means createiso, live_images and buildinstall.
563
564 Available extra keys are:
565
566 • disc_num
567
568 • suffix
569
570 image_volid_formats [optional]
571 (list) – A list of format strings for generating volume id.
572
573 The extra available keys are:
574
575 • base_product_short
576
577 • base_product_version
578
579 image_volid_layered_product_formats [optional]
580 (list) – A list of format strings for generating volume id for
581 layered products. The keys available are the same as for im‐
582 age_volid_formats.
583
584 restricted_volid = False
585 (bool) – New versions of lorax replace all non-alphanumerical
586 characters with dashes (underscores are preserved). This option
587 will mimic similar behaviour in Pungi.
588
589 volume_id_substitutions [optional]
590 (dict) – A mapping of string replacements to shorten the volume
591 id.
592
593 disc_types [optional]
594 (dict) – A mapping for customizing disc_type used in image
595 names.
596
597 Available keys are:
598
599 • boot – for boot.iso images created in buildinstall
600 phase
601
602 • live – for images created by live_images phase
603
604 • dvd – for images created by createiso phase
605
606 • ostree – for ostree installer images
607
608 Default values are the same as the keys.
609
610 Example
611 # Image name respecting Fedora's image naming policy
612 image_name_format = "%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s%(suffix)s"
613 # Use the same format for volume id
614 image_volid_formats = [
615 "%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s"
616 ]
617 # No special handling for layered products, use same format as for regular images
618 image_volid_layered_product_formats = []
619 # Replace "Cloud" with "C" in volume id etc.
620 volume_id_substitutions = {
621 'Cloud': 'C',
622 'Alpha': 'A',
623 'Beta': 'B',
624 'TC': 'T',
625 }
626
627 disc_types = {
628 'boot': 'netinst',
629 'live': 'Live',
630 'dvd': 'DVD',
631 }
632
633 Signing
634 If you want to sign deliverables generated during pungi run like RPM
635 wrapped images. You must provide few configuration options:
636
637 signing_command [optional]
638 (str) – Command that will be run with a koji build as a single
639 argument. This command must not require any user interaction.
640 If you need to pass a password for a signing key to the command,
641 do this via command line option of the command and use string
642 formatting syntax %(signing_key_password)s. (See sign‐
643 ing_key_password_file).
644
645 signing_key_id [optional]
646 (str) – ID of the key that will be used for the signing. This
647 ID will be used when crafting koji paths to signed files (kojip‐
648 kgs.fedoraproject.org/pack‐
649 ages/NAME/VER/REL/data/signed/KEYID/..).
650
651 signing_key_password_file [optional]
652 (str) – Path to a file with password that will be formatted into
653 signing_command string via %(signing_key_password)s string for‐
654 mat syntax (if used). Because pungi config is usually stored in
655 git and is part of compose logs we don’t want password to be in‐
656 cluded directly in the config. Note: If - string is used in‐
657 stead of a filename, then you will be asked for the password in‐
658 teractivelly right after pungi starts.
659
660 Example
661 signing_command = '~/git/releng/scripts/sigulsign_unsigned.py -vv --password=%(signing_key_password)s fedora-24'
662 signing_key_id = '81b46521'
663 signing_key_password_file = '~/password_for_fedora-24_key'
664
665 Git URLs
666 In multiple places the config requires URL of a Git repository to down‐
667 load some file from. This URL is passed on to Koji. It is possible to
668 specify which commit to use using this syntax:
669
670 git://git.example.com/git/repo-name.git?#<rev_spec>
671
672 The <rev_spec> pattern can be replaced with actual commit SHA, a tag
673 name, HEAD to indicate that tip of default branch should be used or
674 origin/<branch_name> to use tip of arbitrary branch.
675
676 If the URL specifies a branch or HEAD, Pungi will replace it with the
677 actual commit SHA. This will later show up in Koji tasks and help with
678 tracing what particular inputs were used.
679
680 NOTE:
681 The origin must be specified because of the way Koji works with the
682 repository. It will clone the repository then switch to requested
683 state with git reset --hard REF. Since no local branches are cre‐
684 ated, we need to use full specification including the name of the
685 remote.
686
687 Createrepo Settings
688 Options
689 createrepo_checksum
690 (str) – specify checksum type for createrepo; expected values:
691 sha512, sha256, sha1. Defaults to sha256.
692
693 createrepo_c = True
694 (bool) – use createrepo_c (True) or legacy createrepo (False)
695
696 createrepo_deltas = False
697 (list) – generate delta RPMs against an older compose. This
698 needs to be used together with --old-composes command line argu‐
699 ment. The value should be a mapping of variants and architec‐
700 tures that should enable creating delta RPMs. Source and debug‐
701 info repos never have deltas.
702
703 createrepo_use_xz = False
704 (bool) – whether to pass --xz to the createrepo command. This
705 will cause the SQLite databases to be compressed with xz.
706
707 createrepo_num_threads
708 (int) – how many concurrent createrepo process to run. The de‐
709 fault is to use one thread per CPU available on the machine.
710
711 createrepo_num_workers
712 (int) – how many concurrent createrepo workers to run. Value de‐
713 faults to 3.
714
715 createrepo_database
716 (bool) – whether to create SQLite database as part of the repo‐
717 data. This is only useful as an optimization for clients using
718 Yum to consume to the repo. Default value depends on gather
719 backend. For DNF it’s turned off, for Yum the default is True.
720
721 createrepo_extra_args
722 ([str]) – a list of extra arguments passed on to createrepo or
723 createrepo_c executable. This could be useful for enabling
724 zchunk generation and pointing it to correct dictionaries.
725
726 createrepo_extra_modulemd
727 (dict) – a mapping of variant UID to an scm dict. If specified,
728 it should point to a directory with extra module metadata YAML
729 files that will be added to the repository for this variant. The
730 cloned files should be split into subdirectories for each archi‐
731 tecture of the variant.
732
733 createrepo_enable_cache = True
734 (bool) – whether to use --cachedir option of createrepo. It will
735 cache and reuse checksum vaules to speed up createrepo phase.
736 The cache dir is located at /var/cache/pungi/createrepo_c/$re‐
737 lease_short-$uid e.g. /var/cache/pungi/createrepo_c/Fedora-1000
738
739 product_id = None
740 (scm_dict) – If specified, it should point to a directory with
741 certificates *<variant_uid>-<arch>-*.pem. Pungi will copy each
742 certificate file into the relevant Yum repositories as a produc‐
743 tid file in the repodata directories. The purpose of these pro‐
744 ductid files is to expose the product data to
745 subscription-manager. subscription-manager includes a “prod‐
746 uct-id” Yum plugin that can read these productid certificate
747 files from each Yum repository.
748
749 product_id_allow_missing = False
750 (bool) – When product_id is used and a certificate for some
751 variant and architecture is missing, Pungi will exit with an er‐
752 ror by default. When you set this option to True, Pungi will
753 ignore the missing certificate and simply log a warning message.
754
755 product_id_allow_name_prefix = True
756 (bool) – Allow arbitrary prefix for the certificate file name
757 (see leading * in the pattern above). Setting this option to
758 False will make the pattern more strict by requiring the file
759 name to start directly with variant name.
760
761 Example
762 createrepo_checksum = "sha"
763 createrepo_deltas = [
764 # All arches for Everything should have deltas.
765 ('^Everything$', {'*': True}),
766 # Also Server.x86_64 should have them (but not on other arches).
767 ('^Server$', {'x86_64': True}),
768 ]
769 createrepo_extra_modulemd = {
770 "Server": {
771 "scm": "git",
772 "repo": "https://example.com/extra-server-modulemd.git",
773 "dir": ".",
774 # The directory should have this layout. Each architecture for the
775 # variant should be included (even if the directory is empty.
776 # .
777 # ├── aarch64
778 # │ ├── some-file.yaml
779 # │ └ ...
780 # └── x86_64
781 }
782 }
783
784 Package Set Settings
785 Options
786 sigkeys
787 ([str or None]) – priority list of signing key IDs. These key
788 IDs match the key IDs for the builds in Koji. Pungi will choose
789 signed packages according to the order of the key IDs that you
790 specify here. Use one single key in this list to ensure that all
791 RPMs are signed by one key. If the list includes an empty string
792 or None, Pungi will allow unsigned packages. If the list only
793 includes None, Pungi will use all unsigned packages.
794
795 pkgset_source [mandatory]
796 (str) – “koji” (any koji instance) or “repos” (arbitrary yum
797 repositories)
798
799 pkgset_koji_tag
800 (str|[str]) – tag(s) to read package set from. This option can
801 be omitted for modular composes.
802
803 pkgset_koji_builds
804 (str|[str]) – extra build(s) to include in a package set defined
805 as NVRs.
806
807 pkgset_koji_scratch_tasks
808 (str|[str]) – RPM scratch build task(s) to include in a package
809 set, defined as task IDs. This option can be used only when com‐
810 pose_type is set to test. The RPM still needs to have higher NVR
811 than any other RPM with the same name coming from other sources
812 in order to appear in the resulting compose.
813
814 pkgset_koji_module_tag
815 (str|[str]) – tags to read module from. This option works simi‐
816 larly to listing tags in variants XML. If tags are specified and
817 variants XML specifies some modules via NSVC (or part of), only
818 modules matching that list will be used (and taken from the
819 tag). Inheritance is used automatically.
820
821 pkgset_koji_module_builds
822 (dict) – A mapping of variants to extra module builds to include
823 in a package set: {variant: [N:S:V:C]}.
824
825 pkgset_koji_inherit = True
826 (bool) – inherit builds from parent tags; we can turn it off
827 only if we have all builds tagged in a single tag
828
829 pkgset_koji_inherit_modules = False
830 (bool) – the same as above, but this only applies to modular
831 tags. This option applies to the content tags that contain the
832 RPMs.
833
834 pkgset_repos
835 (dict) – A mapping of architectures to repositories with RPMs:
836 {arch: [repo]}. Only use when pkgset_source = "repos".
837
838 pkgset_scratch_modules
839 (dict) – A mapping of variants to scratch module builds: {vari‐
840 ant: [N:S:V:C]}. Requires mbs_api_url.
841
842 pkgset_exclusive_arch_considers_noarch = True
843 (bool) – If a package includes noarch in its ExclusiveArch tag,
844 it will be included in all architectures since noarch is compat‐
845 ible with everything. Set this option to False to ignore noarch
846 in ExclusiveArch and always consider only binary architectures.
847
848 pkgset_allow_reuse = True
849 (bool) – When set to True, Pungi will try to reuse pkgset data
850 from the old composes specified by --old-composes. When enabled,
851 this option can speed up new composes because it does not need
852 to calculate the pkgset data from Koji. However, if you block or
853 unblock a package in Koji (for example) between composes, then
854 Pungi may not respect those changes in your new compose.
855
856 signed_packages_retries = 0
857 (int) – In automated workflows, you might start a compose before
858 Koji has completely written all signed packages to disk. In this
859 case you may want Pungi to wait for the package to appear in
860 Koji’s storage. This option controls how many times Pungi will
861 retry looking for the signed copy.
862
863 signed_packages_wait = 30
864 (int) – Interval in seconds for how long to wait between at‐
865 tempts to find signed packages. This option only makes sense
866 when signed_packages_retries is set higher than 0.
867
868 Example
869 sigkeys = [None]
870 pkgset_source = "koji"
871 pkgset_koji_tag = "f23"
872
873 Buildinstall Settings
874 Script or process that creates bootable images with Anaconda installer
875 is historically called buildinstall.
876
877 Options
878 buildinstall_method
879 (str) – “lorax” (f16+, rhel7+) or “buildinstall” (older re‐
880 leases)
881
882 lorax_options
883 (list) – special options passed on to lorax.
884
885 Format: [(variant_uid_regex, {arch|*: {option: name}})].
886
887 Recognized options are:
888
889 • bugurl – str (default None)
890
891 • nomacboot – bool (default True)
892
893 • noupgrade – bool (default True)
894
895 • add_template – [str] (default empty)
896
897 • add_arch_template – [str] (default empty)
898
899 • add_template_var – [str] (default empty)
900
901 • add_arch_template_var – [str] (default empty)
902
903 • rootfs_size – [int] (default empty)
904
905 • version – [str] (default from treeinfo_version or re‐
906 lease_version) – used as --version and --release argu‐
907 ment on the lorax command line
908
909 • dracut_args – [[str]] (default empty) override argu‐
910 ments for dracut. Please note that if this option is
911 used, lorax will not use any other arguments, so you
912 have to provide a full list and can not just add some‐
913 thing.
914
915 • skip_branding – bool (default False)
916
917 • squashfs_only – bool (default False) pass the
918 –squashfs_only to Lorax.
919
920 • configuration_file – (scm_dict) (default empty) pass
921 the specified configuration file to Lorax using the -c
922 option.
923
924 lorax_extra_sources
925 (list) – a variant/arch mapping with urls for extra source
926 repositories added to Lorax command line. Either one repo or a
927 list can be specified.
928
929 lorax_use_koji_plugin = False
930 (bool) – When set to True, the Koji pungi_buildinstall task will
931 be used to execute Lorax instead of runroot. Use only if the
932 Koji instance has the pungi_buildinstall plugin installed.
933
934 buildinstall_kickstart
935 (scm_dict) – If specified, this kickstart file will be copied
936 into each file and pointed to in boot configuration.
937
938 buildinstall_topdir
939 (str) – Full path to top directory where the runroot buildin‐
940 stall Koji tasks output should be stored. This is useful in sit‐
941 uation when the Pungi compose is not generated on the same stor‐
942 age as the Koji task is running on. In this case, Pungi can pro‐
943 vide input repository for runroot task using HTTP and set the
944 output directory for this task to buildinstall_topdir. Once the
945 runroot task finishes, Pungi will copy the results of runroot
946 tasks to the compose working directory.
947
948 buildinstall_skip
949 (list) – mapping that defines which variants and arches to skip
950 during buildinstall; format: [(variant_uid_regex, {arch|*:
951 True})]. This is only supported for lorax.
952
953 buildinstall_allow_reuse = False
954 (bool) – When set to True, Pungi will try to reuse buildinstall
955 results from old compose specified by --old-composes.
956
957 buildinstall_packages
958 (list) – Additional packages to be installed in the runroot en‐
959 vironment where lorax will run to create installer. Format:
960 [(variant_uid_regex, {arch|*: [package_globs]})].
961
962 Example
963 buildinstall_method = "lorax"
964
965 # Enables macboot on x86_64 for all variants and builds upgrade images
966 # everywhere.
967 lorax_options = [
968 ("^.*$", {
969 "x86_64": {
970 "nomacboot": False
971 }
972 "*": {
973 "noupgrade": False
974 }
975 })
976 ]
977
978 # Don't run buildinstall phase for Modular variant
979 buildinstall_skip = [
980 ('^Modular', {
981 '*': True
982 })
983 ]
984
985 # Add another repository for lorax to install packages from
986 lorax_extra_sources = [
987 ('^Simple$', {
988 '*': 'https://example.com/repo/$basearch/',
989 })
990 ]
991
992 # Additional packages to be installed in the Koji runroot environment where
993 # lorax will run.
994 buildinstall_packages = [
995 ('^Simple$', {
996 '*': ['dummy-package'],
997 })
998 ]
999
1000 NOTE:
1001 It is advised to run buildinstall (lorax) in koji, i.e. with runroot
1002 enabled for clean build environments, better logging, etc.
1003
1004 WARNING:
1005 Lorax installs RPMs into a chroot. This involves running %post
1006 scriptlets and they frequently run executables in the chroot. If
1007 we’re composing for multiple architectures, we must use runroot for
1008 this reason.
1009
1010 Gather Settings
1011 Options
1012 gather_method [mandatory]
1013 (str*|*dict) – Options are deps, nodeps and hybrid. Specifies
1014 whether and how package dependencies should be pulled in. Pos‐
1015 sible configuration can be one value for all variants, or if
1016 configured per-variant it can be a simple string hybrid or a a
1017 dictionary mapping source type to a value of deps or nodeps.
1018 Make sure only one regex matches each variant, as there is no
1019 guarantee which value will be used if there are multiple match‐
1020 ing ones. All used sources must have a configured method unless
1021 hybrid solving is used.
1022
1023 gather_fulltree = False
1024 (bool) – When set to True all RPMs built from an SRPM will al‐
1025 ways be included. Only use when gather_method = "deps".
1026
1027 gather_selfhosting = False
1028 (bool) – When set to True, Pungi will build a self-hosting tree
1029 by following build dependencies. Only use when gather_method =
1030 "deps".
1031
1032 gather_allow_reuse = False
1033 (bool) – When set to True, Pungi will try to reuse gather re‐
1034 sults from old compose specified by --old-composes.
1035
1036 greedy_method = none
1037 (str) – This option controls how package requirements are satis‐
1038 fied in case a particular Requires has multiple candidates.
1039
1040 • none – the best packages is selected to satisfy the dependency
1041 and only that one is pulled into the compose
1042
1043 • all – packages that provide the symbol are pulled in
1044
1045 • build – the best package is selected, and then all packages
1046 from the same build that provide the symbol are pulled in
1047
1048 NOTE:
1049 As an example let’s work with this situation: a package in
1050 the compose has Requires: foo. There are three packages with
1051 Provides: foo: pkg-a, pkg-b-provider-1 and pkg-b-provider-2.
1052 The pkg-b-* packages are build from the same source package.
1053 Best match determines pkg-b-provider-1 as best matching pack‐
1054 age.
1055
1056 • With greedy_method = "none" only pkg-b-provider-1 will be
1057 pulled in.
1058
1059 • With greedy_method = "all" all three packages will be
1060 pulled in.
1061
1062 • With greedy_method = "build" pkg-b-provider-1 and
1063 pkg-b-provider-2 will be pulled in.
1064
1065 gather_backend
1066 (str) –This changes the entire codebase doing dependency solv‐
1067 ing, so it can change the result in unpredictable ways.
1068
1069 On Python 2, the choice is between yum or dnf and defaults to
1070 yum. On Python 3 dnf is the only option and default.
1071
1072 Particularly the multilib work is performed differently by using
1073 python-multilib library. Please refer to multilib option to see
1074 the differences.
1075
1076 See also: the repoclosure_backend setting for Pungi’s repoclo‐
1077 sure phase.
1078
1079 multilib
1080 (list) – mapping of variant regexes and arches to list of multi‐
1081 lib methods
1082
1083 Available methods are:
1084
1085 • none – no package matches this method
1086
1087 • all – all packages match this method
1088
1089 • runtime – packages that install some shared object file
1090 (*.so.*) will match.
1091
1092 • devel – packages whose name ends with -devel or
1093 --static suffix will be matched. When dnf is used, this
1094 method automatically enables runtime method as well.
1095 With yum backend this method also uses a hardcoded
1096 blacklist and whitelist.
1097
1098 • kernel – packages providing kernel or kernel-devel
1099 match this method (only in yum backend)
1100
1101 • yaboot – only yaboot package on ppc arch matches this
1102 (only in yum backend)
1103
1104 additional_packages
1105 (list) – additional packages to be included in a variant and ar‐
1106 chitecture; format: [(variant_uid_regex, {arch|*: [pack‐
1107 age_globs]})]
1108
1109 In contrast to the comps_file setting, the additional_packages
1110 setting merely adds the list of packages to the compose. When a
1111 package is in a comps group, it is visible to users via dnf
1112 groupinstall and Anaconda’s Groups selection, but addi‐
1113 tional_packages does not affect DNF groups.
1114
1115 The packages specified here are matched against RPM names, not
1116 any other provides in the package nor the name of source pack‐
1117 age. Shell globbing is used, so wildcards are possible. The
1118 package can be specified as name only or name.arch.
1119
1120 With dnf gathering backend, you can specify a debuginfo package
1121 to be included. This is meant to include a package if autodetec‐
1122 tion does not get it. If you add a debuginfo package that does
1123 not have anything else from the same build included in the com‐
1124 pose, the sources will not be pulled in.
1125
1126 If you list a package in additional_packages but Pungi cannot
1127 find it (for example, it’s not available in the Koji tag), Pungi
1128 will log a warning in the “work” or “logs” directories and con‐
1129 tinue without aborting.
1130
1131 Example: This configuration will add all packages in a Koji tag
1132 to an “Everything” variant:
1133
1134 additional_packages = [
1135 ('^Everything$', {
1136 '*': [
1137 '*',
1138 ],
1139 })
1140 ]
1141
1142 filter_packages
1143 (list) – packages to be excluded from a variant and architec‐
1144 ture; format: [(variant_uid_regex, {arch|*: [package_globs]})]
1145
1146 See additional_packages for details about package specification.
1147
1148 filter_modules
1149 (list) – modules to be excluded from a variant and architecture;
1150 format: [(variant_uid_regex, {arch|*: [name:stream]})]
1151
1152 Both name and stream can use shell-style globs. If stream is
1153 omitted, all streams are removed.
1154
1155 This option only applies to modules taken from Koji tags, not
1156 modules explicitly listed in variants XML without any tags.
1157
1158 filter_system_release_packages
1159 (bool) – for each variant, figure out the best system release
1160 package and filter out all others. This will not work if a vari‐
1161 ant needs more than one system release package. In such case,
1162 set this option to False.
1163
1164 gather_prepopulate = None
1165 (scm_dict) – If specified, you can use this to add additional
1166 packages. The format of the file pointed to by this option is a
1167 JSON mapping {variant_uid: {arch: {build: [package]}}}. Packages
1168 added through this option can not be removed by filter_packages.
1169
1170 multilib_blacklist
1171 (dict) – multilib blacklist; format: {arch|*: [package_globs]}.
1172
1173 See additional_packages for details about package specification.
1174
1175 multilib_whitelist
1176 (dict) – multilib blacklist; format: {arch|*: [package_names]}.
1177 The whitelist must contain exact package names; there are no
1178 wildcards or pattern matching.
1179
1180 gather_lookaside_repos = []
1181 (list) – lookaside repositories used for package gathering; for‐
1182 mat: [(variant_uid_regex, {arch|*: [repo_urls]})]
1183
1184 The repo_urls are passed to the depsolver, which can use pack‐
1185 ages in the repos for satisfying dependencies, but the packages
1186 themselves are not pulled into the compose. The repo_urls can
1187 contain $basearch variable, which will be substituted with
1188 proper value by the depsolver.
1189
1190 The repo_urls are used by repoclosure too, but it can’t parse
1191 $basearch currently and that will cause Repoclosure phase
1192 crashed. repoclosure_strictness option could be used to stop
1193 running repoclosure.
1194
1195 Please note that * as a wildcard matches all architectures but
1196 src.
1197
1198 hashed_directories = False
1199 (bool) – put packages into “hashed” directories, for example
1200 Packages/k/kernel-4.0.4-301.fc22.x86_64.rpm
1201
1202 check_deps = True
1203 (bool) – Set to False if you don’t want the compose to abort
1204 when some package has broken dependencies.
1205
1206 require_all_comps_packages = False
1207 (bool) – Set to True to abort compose when package mentioned in
1208 comps file can not be found in the package set. When disabled
1209 (the default), such cases are still reported as warnings in the
1210 log.
1211
1212 gather_source_mapping
1213 (str) – JSON mapping with initial packages for the compose. The
1214 value should be a path to JSON file with following mapping:
1215 {variant: {arch: {rpm_name: [rpm_arch|None]}}}. Relative paths
1216 are interpreted relative to the location of main config file.
1217
1218 gather_profiler = False
1219 (bool) – When set to True the gather tool will produce addi‐
1220 tional performance profiling information at the end of its logs.
1221 Only takes effect when gather_backend = "dnf".
1222
1223 variant_as_lookaside
1224 (list) – a variant/variant mapping that tells one or more vari‐
1225 ants in compose has other variant(s) in compose as a lookaside.
1226 Only top level variants are supported (not addons/layered prod‐
1227 ucts). Format: [(variant_uid, variant_uid)]
1228
1229 Example
1230 gather_method = "deps"
1231 greedy_method = "build"
1232 check_deps = False
1233 hashed_directories = True
1234
1235 gather_method = {
1236 "^Everything$": {
1237 "comps": "deps" # traditional content defined by comps groups
1238 },
1239 "^Modular$": {
1240 "module": "nodeps" # Modules do not need dependencies
1241 },
1242 "^Mixed$": { # Mixed content in one variant
1243 "comps": "deps",
1244 "module": "nodeps"
1245 }
1246 "^OtherMixed$": "hybrid", # Using hybrid depsolver
1247 }
1248
1249 additional_packages = [
1250 # bz#123456
1251 ('^(Workstation|Server)$', {
1252 '*': [
1253 'grub2',
1254 'kernel',
1255 ],
1256 }),
1257 ]
1258
1259 filter_packages = [
1260 # bz#111222
1261 ('^.*$', {
1262 '*': [
1263 'kernel-doc',
1264 ],
1265 }),
1266 ]
1267
1268 multilib = [
1269 ('^Server$', {
1270 'x86_64': ['devel', 'runtime']
1271 })
1272 ]
1273
1274 multilib_blacklist = {
1275 "*": [
1276 "gcc",
1277 ],
1278 }
1279
1280 multilib_whitelist = {
1281 "*": [
1282 "alsa-plugins-*",
1283 ],
1284 }
1285
1286 # gather_lookaside_repos = [
1287 # ('^.*$', {
1288 # '*': [
1289 # "https://dl.fedoraproject.org/pub/fedora/linux/releases/22/Everything/$basearch/os/",
1290 # ],
1291 # 'x86_64': [
1292 # "https://dl.fedoraproject.org/pub/fedora/linux/releases/22/Everything/source/SRPMS/",
1293 # ]
1294 # }),
1295 # ]
1296
1297 NOTE:
1298 It is a good practice to attach bug/ticket numbers to addi‐
1299 tional_packages, filter_packages, multilib_blacklist and multi‐
1300 lib_whitelist to track decisions.
1301
1302 Koji Settings
1303 Options
1304 koji_profile
1305 (str) – koji profile name. This tells Pungi how to communicate
1306 with your chosen Koji instance. See Koji’s documentation about
1307 profiles for more information about how to set up your Koji
1308 client profile. In the examples, the profile name is “koji”,
1309 which points to Fedora’s koji.fedoraproject.org.
1310
1311 global_runroot_method
1312 (str) – global runroot method to use. If runroot_method is set
1313 per Pungi phase using a dictionary, this option defines the de‐
1314 fault runroot method for phases not mentioned in the run‐
1315 root_method dictionary.
1316
1317 runroot_method
1318 (str*|*dict) – Runroot method to use. It can further specify the
1319 runroot method in case the runroot is set to True.
1320
1321 Available methods are:
1322
1323 • local – runroot tasks are run locally
1324
1325 • koji – runroot tasks are run in Koji
1326
1327 • openssh – runroot tasks are run on remote machine con‐
1328 nected using OpenSSH. The runroot_ssh_hostnames for
1329 each architecture must be set and the user under which
1330 Pungi runs must be configured to login as run‐
1331 root_ssh_username using the SSH key.
1332
1333 The runroot method can also be set per Pungi phase using the
1334 dictionary with phase name as key and runroot method as value.
1335 The default runroot method is in this case defined by the
1336 global_runroot_method option.
1337
1338 Example
1339 global_runroot_method = "koji"
1340 runroot_method = {
1341 "createiso": "local"
1342 }
1343
1344 runroot_channel
1345 (str) – name of koji channel
1346
1347 runroot_tag
1348 (str) – name of koji build tag used for runroot
1349
1350 runroot_weights
1351 (dict) – customize task weights for various runroot tasks. The
1352 values in the mapping should be integers, the keys can be se‐
1353 lected from the following list. By default no weight is assigned
1354 and Koji picks the default one according to policy.
1355
1356 • buildinstall
1357
1358 • createiso
1359
1360 • ostree
1361
1362 • ostree_installer
1363
1364 Example
1365 koji_profile = "koji"
1366 runroot_channel = "runroot"
1367 runroot_tag = "f23-build"
1368
1369 Runroot “openssh” method settings
1370 Options
1371 runroot_ssh_username
1372 (str) – For openssh runroot method, configures the username used
1373 to login the remote machine to run the runroot task. Defaults to
1374 “root”.
1375
1376 runroot_ssh_hostnames
1377 (dict) – For openssh runroot method, defines the hostname for
1378 each architecture on which the runroot task should be running.
1379 Format: {"x86_64": "runroot-x86-64.localhost.tld", ...}
1380
1381 runroot_ssh_init_template
1382 (str) [optional] – For openssh runroot method, defines the com‐
1383 mand to initializes the runroot task on the remote machine. This
1384 command is executed as first command for each runroot task exe‐
1385 cuted.
1386
1387 The command can print a string which is then available as {run‐
1388 root_key} for other SSH commands. This string might be used to
1389 keep the context across different SSH commands executed for sin‐
1390 gle runroot task.
1391
1392 The goal of this command is setting up the environment for real
1393 runroot commands. For example preparing the unique mock environ‐
1394 ment, mounting the desired file-systems, …
1395
1396 The command string can contain following variables which are re‐
1397 placed by the real values before executing the init command:
1398
1399 • {runroot_tag} - Tag to initialize the runroot environment
1400 from.
1401
1402 When not set, no init command is executed.
1403
1404 runroot_ssh_install_packages_template
1405 (str) [optional] – For openssh runroot method, defines the tem‐
1406 plate for command to install the packages requested to run the
1407 runroot task.
1408
1409 The template string can contain following variables which are
1410 replaced by the real values before executing the install com‐
1411 mand:
1412
1413 • {runroot_key} - Replaced with the string returned by run‐
1414 root_ssh_init_template if used. This can be used to keep the
1415 track of context of SSH commands belonging to single runroot
1416 task.
1417
1418 • {packages} - White-list separated list of packages to install.
1419
1420 Example (The {runroot_key} is expected to be set to mock config
1421 file using the runroot_ssh_init_template command.): "mock -r
1422 {runroot_key} --install {packages}"
1423
1424 When not set, no command to install packages on remote machine
1425 is executed.
1426
1427 runroot_ssh_run_template
1428 (str) [optional] – For openssh runroot method, defines the tem‐
1429 plate for the main runroot command.
1430
1431 The template string can contain following variables which are
1432 replaced by the real values before executing the install com‐
1433 mand:
1434
1435 • {runroot_key} - Replaced with the string returned by run‐
1436 root_ssh_init_template if used. This can be used to keep the
1437 track of context of SSH commands belonging to single runroot
1438 task.
1439
1440 • {command} - Command to run.
1441
1442 Example (The {runroot_key} is expected to be set to mock config
1443 file using the runroot_ssh_init_template command.): "mock -r
1444 {runroot_key} chroot -- {command}"
1445
1446 When not set, the runroot command is run directly.
1447
1448 Extra Files Settings
1449 Options
1450 extra_files
1451 (list) – references to external files to be placed in os/ direc‐
1452 tory and media; format: [(variant_uid_regex, {arch|*:
1453 [scm_dict]})]. See Exporting files from SCM for details. If the
1454 dict specifies a target key, an additional subdirectory will be
1455 used.
1456
1457 Example
1458 extra_files = [
1459 ('^.*$', {
1460 '*': [
1461 # GPG keys
1462 {
1463 "scm": "rpm",
1464 "repo": "fedora-repos",
1465 "branch": None,
1466 "file": [
1467 "/etc/pki/rpm-gpg/RPM-GPG-KEY-22-fedora",
1468 ],
1469 "target": "",
1470 },
1471 # GPL
1472 {
1473 "scm": "git",
1474 "repo": "https://pagure.io/pungi-fedora",
1475 "branch": None,
1476 "file": [
1477 "GPL",
1478 ],
1479 "target": "",
1480 },
1481 ],
1482 }),
1483 ]
1484
1485 Extra Files Metadata
1486 If extra files are specified a metadata file, extra_files.json, is
1487 placed in the os/ directory and media. The checksums generated are de‐
1488 termined by media_checksums option. This metadata file is in the for‐
1489 mat:
1490
1491 {
1492 "header": {"version": "1.0},
1493 "data": [
1494 {
1495 "file": "GPL",
1496 "checksums": {
1497 "sha256": "8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643"
1498 },
1499 "size": 18092
1500 },
1501 {
1502 "file": "release-notes/notes.html",
1503 "checksums": {
1504 "sha256": "82b1ba8db522aadf101dca6404235fba179e559b95ea24ff39ee1e5d9a53bdcb"
1505 },
1506 "size": 1120
1507 }
1508 ]
1509 }
1510
1511 CreateISO Settings
1512 Options
1513 createiso_skip = False
1514 (list) – mapping that defines which variants and arches to skip
1515 during createiso; format: [(variant_uid_regex, {arch|*: True})]
1516
1517 createiso_max_size
1518 (list) – mapping that defines maximum expected size for each
1519 variant and arch. If the ISO is larger than the limit, a warning
1520 will be issued.
1521
1522 Format: [(variant_uid_regex, {arch|*: number})]
1523
1524 createiso_max_size_is_strict
1525 (list) – Set the value to True to turn the warning from cre‐
1526 ateiso_max_size into a hard error that will abort the compose.
1527 If there are multiple matches in the mapping, the check will be
1528 strict if at least one match says so.
1529
1530 Format: [(variant_uid_regex, {arch|*: bool})]
1531
1532 create_jigdo = False
1533 (bool) – controls the creation of jigdo from ISO
1534
1535 create_optional_isos = False
1536 (bool) – when set to True, ISOs will be created even for op‐
1537 tional variants. By default only variants with type variant or
1538 layered-product will get ISOs.
1539
1540 createiso_break_hardlinks = False
1541 (bool) – when set to True, all files that should go on the ISO
1542 and have a hardlink will be first copied into a staging direc‐
1543 tory. This should work around a bug in genisoimage including in‐
1544 correct link count in the image, but it is at the cost of having
1545 to copy a potentially significant amount of data.
1546
1547 The staging directory is deleted when ISO is successfully cre‐
1548 ated. In that case the same task to create the ISO will not be
1549 re-runnable.
1550
1551 createiso_use_xorrisofs = False
1552 (bool) – when set to True, use xorrisofs for creating ISOs in‐
1553 stead of genisoimage.
1554
1555 iso_size = 4700000000
1556 (int|str) – size of ISO image. The value should either be an in‐
1557 teger meaning size in bytes, or it can be a string with k, M, G
1558 suffix (using multiples of 1024).
1559
1560 iso_level
1561 (int|list) [optional] – Set the ISO9660 conformance level. This
1562 is either a global single value (a number from 1 to 4), or a
1563 variant/arch mapping.
1564
1565 split_iso_reserve = 10MiB
1566 (int|str) – how much free space should be left on each disk. The
1567 format is the same as for iso_size option.
1568
1569 iso_hfs_ppc64le_compatible = True
1570 (bool) – when set to False, the Apple/HFS compatibility is
1571 turned off for ppc64le ISOs. This option only makes sense for
1572 bootable products, and affects images produced in createiso and
1573 extra_isos phases.
1574
1575 NOTE:
1576 Source architecture needs to be listed explicitly. Excluding ‘*’
1577 applies only on binary arches. Jigdo causes significant increase of
1578 time to ISO creation.
1579
1580 Example
1581 createiso_skip = [
1582 ('^Workstation$', {
1583 '*': True,
1584 'src': True
1585 }),
1586 ]
1587
1588 Automatic generation of version and release
1589 Version and release values for certain artifacts can be generated auto‐
1590 matically based on release version, compose label, date, type and
1591 respin. This can be used to shorten the config and keep it the same for
1592 multiple uses.
1593
1594┌───────────────────────┬───────────────┬──────────┬──────────┬────────┬──────────────┐
1595│Compose ID │ Label │ Version │ Date │ Respin │ Release │
1596├───────────────────────┼───────────────┼──────────┼──────────┼────────┼──────────────┤
1597│F-Rawhide-20170406.n.0 │ - │ Rawhide │ 20170406 │ 0 │ 20170406.n.0 │
1598├───────────────────────┼───────────────┼──────────┼──────────┼────────┼──────────────┤
1599│F-26-20170329.1 │ Alpha-1.6 │ 26_Alpha │ 20170329 │ 1 │ 1.6 │
1600├───────────────────────┼───────────────┼──────────┼──────────┼────────┼──────────────┤
1601│F-Atomic-25-20170407.0 │ RC-20170407.0 │ 25 │ 20170407 │ 0 │ 20170407.0 │
1602├───────────────────────┼───────────────┼──────────┼──────────┼────────┼──────────────┤
1603│F-Atomic-25-20170407.0 │ - │ 25 │ 20170407 │ 0 │ 20170407.0 │
1604└───────────────────────┴───────────────┴──────────┴──────────┴────────┴──────────────┘
1605
1606 All non-RC milestones from label get appended to the version. For re‐
1607 lease either label is used or date, type and respin.
1608
1609 Common options for Live Images, Live Media and Image Build
1610 All images can have ksurl, version, release and target specified. Since
1611 this can create a lot of duplication, there are global options that can
1612 be used instead.
1613
1614 For each of the phases, if the option is not specified for a particular
1615 deliverable, an option named <PHASE_NAME>_<OPTION> is checked. If that
1616 is not specified either, the last fallback is global_<OPTION>. If even
1617 that is unset, the value is considered to not be specified.
1618
1619 The kickstart URL is configured by these options.
1620
1621 • global_ksurl – global fallback setting
1622
1623 • live_media_ksurl
1624
1625 • image_build_ksurl
1626
1627 • live_images_ksurl
1628
1629 Target is specified by these settings.
1630
1631 • global_target – global fallback setting
1632
1633 • live_media_target
1634
1635 • image_build_target
1636
1637 • live_images_target
1638
1639 • osbuild_target
1640
1641 Version is specified by these options. If no version is set, a default
1642 value will be provided according to automatic versioning.
1643
1644 • global_version – global fallback setting
1645
1646 • live_media_version
1647
1648 • image_build_version
1649
1650 • live_images_version
1651
1652 • osbuild_version
1653
1654 Release is specified by these options. If set to a magic value to !RE‐
1655 LEASE_FROM_LABEL_DATE_TYPE_RESPIN, a value will be generated according
1656 to automatic versioning.
1657
1658 • global_release – global fallback setting
1659
1660 • live_media_release
1661
1662 • image_build_release
1663
1664 • live_images_release
1665
1666 • osbuild_release
1667
1668 Each configuration block can also optionally specify a failable key.
1669 For live images it should have a boolean value. For live media and im‐
1670 age build it should be a list of strings containing architectures that
1671 are optional. If any deliverable fails on an optional architecture, it
1672 will not abort the whole compose. If the list contains only "*", all
1673 arches will be substituted.
1674
1675 Live Images Settings
1676 live_images
1677 (list) – Configuration for the particular image. The elements of
1678 the list should be tuples (variant_uid_regex, {arch|*: config}).
1679 The config should be a dict with these keys:
1680
1681 • kickstart (str)
1682
1683 • ksurl (str) [optional] – where to get the kickstart from
1684
1685 • name (str)
1686
1687 • version (str)
1688
1689 • target (str)
1690
1691 • repo (str|[str]) – repos specified by URL or variant UID
1692
1693 • specfile (str) – for images wrapped in RPM
1694
1695 • scratch (bool) – only RPM-wrapped images can use scratch
1696 builds, but by default this is turned off
1697
1698 • type (str) – what kind of task to start in Koji. Defaults
1699 to live meaning koji spin-livecd will be used. Alternative
1700 option is appliance corresponding to koji spin-appliance.
1701
1702 • sign (bool) – only RPM-wrapped images can be signed
1703
1704 live_images_no_rename
1705 (bool) – When set to True, filenames generated by Koji will be
1706 used. When False, filenames will be generated based on im‐
1707 age_name_format configuration option.
1708
1709 Live Media Settings
1710 live_media
1711 (dict) – configuration for koji spin-livemedia; format: {vari‐
1712 ant_uid_regex: [{opt:value}]}
1713
1714 Required options:
1715
1716 • name (str)
1717
1718 • version (str)
1719
1720 • arches ([str]) – what architectures to build the media for;
1721 by default uses all arches for the variant.
1722
1723 • kickstart (str) – name of the kickstart file
1724
1725 Available options:
1726
1727 • ksurl (str)
1728
1729 • ksversion (str)
1730
1731 • scratch (bool)
1732
1733 • target (str)
1734
1735 • release (str) – a string with the release, or !RE‐
1736 LEASE_FROM_LABEL_DATE_TYPE_RESPIN to automatically generate
1737 a suitable value. See automatic versioning for details.
1738
1739 • skip_tag (bool)
1740
1741 • repo (str|[str]) – repos specified by URL or variant UID
1742
1743 • title (str)
1744
1745 • install_tree_from (str) – variant to take install tree from
1746
1747 • nomacboot (bool)
1748
1749 Image Build Settings
1750 image_build
1751 (dict) – config for koji image-build; format: {vari‐
1752 ant_uid_regex: [{opt: value}]}
1753
1754 By default, images will be built for each binary arch valid for
1755 the variant. The config can specify a list of arches to narrow
1756 this down.
1757
1758 NOTE:
1759 Config can contain anything what is accepted by koji image-build
1760 --config configfile.ini
1761
1762 Repo can be specified either as a string or a list of strings. It
1763 will be automatically transformed into format suitable for koji. A
1764 repo for the currently built variant will be added as well.
1765
1766 If you explicitly set release to !RELEASE_FROM_LA‐
1767 BEL_DATE_TYPE_RESPIN, it will be replaced with a value generated as
1768 described in automatic versioning.
1769
1770 If you explicitly set release to !RELEASE_FROM_DATE_RESPIN, it will
1771 be replaced with a value generated as described in automatic ver‐
1772 sioning.
1773
1774 If you explicitly set version to !VERSION_FROM_VERSION, it will be
1775 replaced with a value generated as described in automatic version‐
1776 ing.
1777
1778 Please don’t set install_tree. This gets automatically set by pungi
1779 based on current variant. You can use install_tree_from key to use
1780 install tree from another variant.
1781
1782 Both the install tree and repos can use one of following formats:
1783
1784 • URL to the location
1785
1786 • name of variant in the current compose
1787
1788 • absolute path on local filesystem (which will be translated
1789 using configured mappings or used unchanged, in which case you
1790 have to ensure the koji builders can access it)
1791
1792 You can set either a single format, or a list of formats. For avail‐
1793 able values see help output for koji image-build command.
1794
1795 If ksurl ends with #HEAD, Pungi will figure out the SHA1 hash of
1796 current HEAD and use that instead.
1797
1798 Setting scratch to True will run the koji tasks as scratch builds.
1799
1800 Example
1801 image_build = {
1802 '^Server$': [
1803 {
1804 'image-build': {
1805 'format': ['docker', 'qcow2']
1806 'name': 'fedora-qcow-and-docker-base',
1807 'target': 'koji-target-name',
1808 'ksversion': 'F23', # value from pykickstart
1809 'version': '23',
1810 # correct SHA1 hash will be put into the URL below automatically
1811 'ksurl': 'https://git.fedorahosted.org/git/spin-kickstarts.git?somedirectoryifany#HEAD',
1812 'kickstart': "fedora-docker-base.ks",
1813 'repo': ["http://someextrarepos.org/repo", "ftp://rekcod.oi/repo"],
1814 'distro': 'Fedora-20',
1815 'disk_size': 3,
1816
1817 # this is set automatically by pungi to os_dir for given variant
1818 # 'install_tree': 'http://somepath',
1819 },
1820 'factory-parameters': {
1821 'docker_cmd': "[ '/bin/bash' ]",
1822 'docker_env': "[ 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' ]",
1823 'docker_labels': "{'Name': 'fedora-docker-base', 'License': u'GPLv2', 'RUN': 'docker run -it --rm ${OPT1} --privileged -v \`pwd\`:/atomicapp -v /run:/run -v /:/host --net=host --name ${NAME} -e NAME=${NAME} -e IMAGE=${IMAGE} ${IMAGE} -v ${OPT2} run ${OPT3} /atomicapp', 'Vendor': 'Fedora Project', 'Version': '23', 'Architecture': 'x86_64' }",
1824 }
1825 },
1826 {
1827 'image-build': {
1828 'format': ['docker', 'qcow2']
1829 'name': 'fedora-qcow-and-docker-base',
1830 'target': 'koji-target-name',
1831 'ksversion': 'F23', # value from pykickstart
1832 'version': '23',
1833 # correct SHA1 hash will be put into the URL below automatically
1834 'ksurl': 'https://git.fedorahosted.org/git/spin-kickstarts.git?somedirectoryifany#HEAD',
1835 'kickstart': "fedora-docker-base.ks",
1836 'repo': ["http://someextrarepos.org/repo", "ftp://rekcod.oi/repo"],
1837 'distro': 'Fedora-20',
1838 'disk_size': 3,
1839
1840 # this is set automatically by pungi to os_dir for given variant
1841 # 'install_tree': 'http://somepath',
1842 }
1843 },
1844 {
1845 'image-build': {
1846 'format': 'qcow2',
1847 'name': 'fedora-qcow-base',
1848 'target': 'koji-target-name',
1849 'ksversion': 'F23', # value from pykickstart
1850 'version': '23',
1851 'ksurl': 'https://git.fedorahosted.org/git/spin-kickstarts.git?somedirectoryifany#HEAD',
1852 'kickstart': "fedora-docker-base.ks",
1853 'distro': 'Fedora-23',
1854
1855 # only build this type of image on x86_64
1856 'arches': ['x86_64']
1857
1858 # Use install tree and repo from Everything variant.
1859 'install_tree_from': 'Everything',
1860 'repo': ['Everything'],
1861
1862 # Set release automatically.
1863 'release': '!RELEASE_FROM_LABEL_DATE_TYPE_RESPIN',
1864 }
1865 }
1866 ]
1867 }
1868
1869 OSBuild Composer for building images
1870 osbuild
1871 (dict) – configuration for building images in OSBuild Composer
1872 service fronted by a Koji plugin. Pungi will trigger a Koji task
1873 delegating to the OSBuild Composer, which will build the image,
1874 import it to Koji via content generators.
1875
1876 Format: {variant_uid_regex: [{...}]}.
1877
1878 Required keys in the configuration dict:
1879
1880 • name – name of the Koji package
1881
1882 • distro – image for which distribution should be build TODO ex‐
1883 amples
1884
1885 • image_types – a list with a single image type string or just a
1886 string representing the image type to build (e.g. qcow2). In
1887 any case, only a single image type can be provided as an argu‐
1888 ment.
1889
1890 Optional keys:
1891
1892 • target – which build target to use for the task. Either this
1893 option or the global osbuild_target is required.
1894
1895 • version – version for the final build (as a string). This op‐
1896 tion is required if the global osbuild_version is not speci‐
1897 fied.
1898
1899 • release – release part of the final NVR. If neither this op‐
1900 tion nor the global osbuild_release is set, Koji will automat‐
1901 ically generate a value.
1902
1903 • repo – a list of repositories from which to consume packages
1904 for building the image. By default only the variant repository
1905 is used. The list items may use one of the following formats:
1906
1907 • String with just the repository URL.
1908
1909 • Dictionary with the following keys:
1910
1911 • baseurl – URL of the repository.
1912
1913 •
1914
1915 package_sets – a list of package set names to use for this
1916 repository. Package sets are an internal concept of
1917 Image Builder and are used in image definitions. If
1918 specified, the repository is used by Image Builder
1919 only for the pipeline with the same name. For ex‐
1920 ample, specifying the build package set name will
1921 make the repository to be used only for the build
1922 environment in which the image will be built. (op‐
1923 tional)
1924
1925 • arches – list of architectures for which to build the image.
1926 By default, the variant arches are used. This option can only
1927 restrict it, not add a new one.
1928
1929 • ostree_url – URL of the repository that’s used to fetch the
1930 parent commit from.
1931
1932 • ostree_ref – name of the ostree branch
1933
1934 • ostree_parent – commit hash or a a branch-like reference to
1935 the parent commit.
1936
1937 • upload_options – a dictionary with upload options specific to
1938 the target cloud environment. If provided, the image will be
1939 uploaded to the cloud environment, in addition to the Koji
1940 server. One can’t combine arbitrary image types with arbitrary
1941 upload options. The dictionary keys differ based on the tar‐
1942 get cloud environment. The following keys are supported:
1943
1944 • AWS EC2 upload options – upload to Amazon Web Services.
1945
1946 • region – AWS region to upload the image to
1947
1948 • share_with_accounts – list of AWS account IDs to share the
1949 image with
1950
1951 • snapshot_name – Snapshot name of the uploaded EC2 image
1952 (optional)
1953
1954 • AWS S3 upload options – upload to Amazon Web Services S3.
1955
1956 • region – AWS region to upload the image to
1957
1958 • Azure upload options – upload to Microsoft Azure.
1959
1960 • tenant_id – Azure tenant ID to upload the image to
1961
1962 • subscription_id – Azure subscription ID to upload the im‐
1963 age to
1964
1965 • resource_group – Azure resource group to upload the image
1966 to
1967
1968 • location – Azure location of the resource group (optional)
1969
1970 • image_name – Image name of the uploaded Azure image (op‐
1971 tional)
1972
1973 • GCP upload options – upload to Google Cloud Platform.
1974
1975 • region – GCP region to upload the image to
1976
1977 • bucket – GCP bucket to upload the image to (optional)
1978
1979 • share_with_accounts – list of GCP accounts to share the
1980 image with
1981
1982 • image_name – Image name of the uploaded GCP image (op‐
1983 tional)
1984
1985 • Container upload options – upload to a container registry.
1986
1987 • name – name of the container image (optional)
1988
1989 • tag – container tag to upload the image to (optional)
1990
1991 NOTE:
1992 There is initial support for having this task as failable without
1993 aborting the whole compose. This can be enabled by setting "fail‐
1994 able": ["*"] in the config for the image. It is an on/off switch
1995 without granularity per arch.
1996
1997 Image container
1998 This phase supports building containers in OSBS that embed an image
1999 created in the same compose. This can be useful for delivering the im‐
2000 age to users running in containerized environments.
2001
2002 Pungi will start a buildContainer task in Koji with configured source
2003 repository. The Dockerfile can expect that a repo file will be injected
2004 into the container that defines a repo named image-to-include, and its
2005 baseurl will point to the image to include. It is possible to extract
2006 the URL with a command like dnf config-manager --dump image-to-include
2007 | awk '/baseurl =/{print $3}'`
2008
2009 image_container
2010 (dict) – configuration for building containers embedding an im‐
2011 age.
2012
2013 Format: {variant_uid_regex: [{...}]}.
2014
2015 The inner object will define a single container. These keys are
2016 required:
2017
2018 • url, target, git_branch. See OSBS section for definition of
2019 these.
2020
2021 • image_spec – (object) A string mapping of filters used to se‐
2022 lect the image to embed. All images listed in metadata for the
2023 variant will be processed. The keys of this filter are used to
2024 select metadata fields for the image, and values are regular
2025 expression that need to match the metadata value.
2026
2027 The filter should match exactly one image.
2028
2029 Example config
2030 image_container = {
2031 "^Server$": [{
2032 "url": "git://example.com/dockerfiles.git?#HEAD",
2033 "target": "f24-container-candidate",
2034 "git_branch": "f24",
2035 "image_spec": {
2036 "format": "qcow2",
2037 "arch": "x86_64",
2038 "path": ".*/guest-image-.*$",
2039 }
2040 }]
2041 }
2042
2043 OSTree Settings
2044 The ostree phase of Pungi can create and update ostree repositories.
2045 This is done by running rpm-ostree compose in a Koji runroot environ‐
2046 ment. The ostree repository itself is not part of the compose and
2047 should be located in another directory. Any new packages in the compose
2048 will be added to the repository with a new commit.
2049
2050 ostree (dict) – a mapping of configuration for each. The format should
2051 be {variant_uid_regex: config_dict}. It is possible to use a
2052 list of configuration dicts as well.
2053
2054 The configuration dict for each variant arch pair must have
2055 these keys:
2056
2057 • treefile – (str) Filename of configuration for rpm-ostree.
2058
2059 • config_url – (str) URL for Git repository with the treefile.
2060
2061 • repo – (str|dict|[str|dict]) repos specified by URL or variant
2062 UID or a dict of repo options, baseurl is required in the
2063 dict.
2064
2065 • ostree_repo – (str) Where to put the ostree repository
2066
2067 These keys are optional:
2068
2069 • keep_original_sources – (bool) Keep the existing source repos
2070 in the tree config file. If not enabled, all the original
2071 source repos will be removed from the tree config file.
2072
2073 • config_branch – (str) Git branch of the repo to use. Defaults
2074 to master.
2075
2076 • arches – ([str]) List of architectures for which to update os‐
2077 tree. There will be one task per architecture. By default all
2078 architectures in the variant are used.
2079
2080 • failable – ([str]) List of architectures for which this deliv‐
2081 erable is not release blocking.
2082
2083 • update_summary – (bool) Update summary metadata after tree
2084 composing. Defaults to False.
2085
2086 • force_new_commit – (bool) Do not use rpm-ostree’s built-in
2087 change detection. Defaults to False.
2088
2089 • unified_core – (bool) Use rpm-ostree in unified core mode for
2090 composes. Defaults to False.
2091
2092 • version – (str) Version string to be added as versioning meta‐
2093 data. If this option is set to !OSTREE_VERSION_FROM_LA‐
2094 BEL_DATE_TYPE_RESPIN, a value will be generated automatically
2095 as $VERSION.$RELEASE. If this option is set to !VER‐
2096 SION_FROM_VERSION_DATE_RESPIN, a value will be generated auto‐
2097 matically as $VERSION.$DATE.$RESPIN. See how those values are
2098 created.
2099
2100 • tag_ref – (bool, default True) If set to False, a git refer‐
2101 ence will not be created.
2102
2103 • ostree_ref – (str) To override value ref from treefile.
2104
2105 Example config
2106 ostree = {
2107 "^Atomic$": {
2108 "treefile": "fedora-atomic-docker-host.json",
2109 "config_url": "https://git.fedorahosted.org/git/fedora-atomic.git",
2110 "repo": [
2111 "Server",
2112 "http://example.com/repo/x86_64/os",
2113 {"baseurl": "Everything"},
2114 {"baseurl": "http://example.com/linux/repo", "exclude": "systemd-container"},
2115 ],
2116 "keep_original_sources": True,
2117 "ostree_repo": "/mnt/koji/compose/atomic/Rawhide/",
2118 "update_summary": True,
2119 # Automatically generate a reasonable version
2120 "version": "!OSTREE_VERSION_FROM_LABEL_DATE_TYPE_RESPIN",
2121 # Only run this for x86_64 even if Atomic has more arches
2122 "arches": ["x86_64"],
2123 }
2124 }
2125
2126 ostree_use_koji_plugin = False
2127 (bool) – When set to True, the Koji pungi_ostree task will be
2128 used to execute rpm-ostree instead of runroot. Use only if the
2129 Koji instance has the pungi_ostree plugin installed.
2130
2131 Ostree Installer Settings
2132 The ostree_installer phase of Pungi can produce installer image
2133 bundling an OSTree repository. This always runs in Koji as a runroot
2134 task.
2135
2136 ostree_installer
2137 (dict) – a variant/arch mapping of configuration. The format
2138 should be [(variant_uid_regex, {arch|*: config_dict})].
2139
2140 The configuration dict for each variant arch pair must have this
2141 key:
2142
2143 These keys are optional:
2144
2145 • repo – (str|[str]) repos specified by URL or variant UID
2146
2147 • release – (str) Release value to set for the installer image.
2148 Set to !RELEASE_FROM_LABEL_DATE_TYPE_RESPIN to generate the
2149 value automatically.
2150
2151 • failable – ([str]) List of architectures for which this deliv‐
2152 erable is not release blocking.
2153
2154 These optional keys are passed to lorax to customize the build.
2155
2156 • installpkgs – ([str])
2157
2158 • add_template – ([str])
2159
2160 • add_arch_template – ([str])
2161
2162 • add_template_var – ([str])
2163
2164 • add_arch_template_var – ([str])
2165
2166 • rootfs_size – ([str])
2167
2168 • template_repo – (str) Git repository with extra templates.
2169
2170 • template_branch – (str) Branch to use from template_repo.
2171
2172 The templates can either be absolute paths, in which case they
2173 will be used as configured; or they can be relative paths, in
2174 which case template_repo needs to point to a Git repository from
2175 which to take the templates.
2176
2177 If the templates need to run with additional dependencies, that
2178 can be configured with the optional key:
2179
2180 • extra_runroot_pkgs – ([str])
2181
2182 • skip_branding – (bool) Stops lorax to install packages with
2183 branding. Defaults to False.
2184
2185 ostree_installer_overwrite = False
2186 (bool) – by default if a variant including OSTree installer also
2187 creates regular installer images in buildinstall phase, there
2188 will be conflicts (as the files are put in the same place) and
2189 Pungi will report an error and fail the compose.
2190
2191 With this option it is possible to opt-in for the overwriting.
2192 The traditional boot.iso will be in the iso/ subdirectory.
2193
2194 ostree_installer_use_koji_plugin = False
2195 (bool) – When set to True, the Koji pungi_buildinstall task will
2196 be used to execute Lorax instead of runroot. Use only if the
2197 Koji instance has the pungi_buildinstall plugin installed.
2198
2199 Example config
2200 ostree_installer = [
2201 ("^Atomic$", {
2202 "x86_64": {
2203 "repo": [
2204 "Everything",
2205 "https://example.com/extra-repo1.repo",
2206 "https://example.com/extra-repo2.repo",
2207 ],
2208 "release": "!RELEASE_FROM_LABEL_DATE_TYPE_RESPIN",
2209 "installpkgs": ["fedora-productimg-atomic"],
2210 "add_template": ["atomic-installer/lorax-configure-repo.tmpl"],
2211 "add_template_var": [
2212 "ostree_osname=fedora-atomic",
2213 "ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
2214 ],
2215 "add_arch_template": ["atomic-installer/lorax-embed-repo.tmpl"],
2216 "add_arch_template_var": [
2217 "ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/",
2218 "ostree_osname=fedora-atomic",
2219 "ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
2220 ]
2221 'template_repo': 'https://git.fedorahosted.org/git/spin-kickstarts.git',
2222 'template_branch': 'f24',
2223 }
2224 })
2225 ]
2226
2227 OSBS Settings
2228 Pungi can build container images in OSBS. The build is initiated
2229 through Koji container-build plugin. The base image will be using RPMs
2230 from the current compose and a Dockerfile from specified Git reposi‐
2231 tory.
2232
2233 Please note that the image is uploaded to a registry and not exported
2234 into compose directory. There will be a metadata file in compose/meta‐
2235 data/osbs.json with details about the built images (assuming they are
2236 not scratch builds).
2237
2238 osbs (dict) – a mapping from variant regexes to configuration blocks.
2239 The format should be {variant_uid_regex: [config_dict]}.
2240
2241 The configuration for each image must have at least these keys:
2242
2243 • url – (str) URL pointing to a Git repository with Dockerfile.
2244 Please see Git URLs section for more details.
2245
2246 • target – (str) A Koji target to build the image for.
2247
2248 • git_branch – (str) A branch in SCM for the Dockerfile. This is
2249 required by OSBS to avoid race conditions when multiple builds
2250 from the same repo are submitted at the same time. Please note
2251 that url should contain the branch or tag name as well, so
2252 that it can be resolved to a particular commit hash.
2253
2254 Optionally you can specify failable. If it has a truthy value,
2255 failure to create the image will not abort the whole compose.
2256
2257 The configuration will pass other attributes directly to the
2258 Koji task. This includes scratch and priority. See koji
2259 list-api buildContainer for more details about these options.
2260
2261 A value for yum_repourls will be created automatically and point
2262 at a repository in the current compose. You can add extra repos‐
2263 itories with repo key having a list of urls pointing to .repo
2264 files or just variant uid, Pungi will create the .repo file for
2265 that variant. If specific URL is used in the repo, the $COM‐
2266 POSE_ID variable in the repo string will be replaced with the
2267 real compose ID. gpgkey can be specified to enable gpgcheck in
2268 repo files for variants.
2269
2270 osbs_registries
2271 (dict) – Use this optional setting to emit osbs-request-push
2272 messages for each non-scratch container build. These messages
2273 can guide other tools how to push the images to other reg‐
2274 istries. For example, an external tool might trigger on these
2275 messages and copy the images from OSBS’s registry to a staging
2276 or production registry.
2277
2278 For each completed container build, Pungi will try to match the
2279 NVR against a key in osbs_registries mapping (using shell-style
2280 globbing) and take the corresponding value and collect them
2281 across all built images. Pungi will save this data into
2282 logs/global/osbs-registries.json, mapping each Koji NVR to the
2283 registry data. Pungi will also send this data to the message bus
2284 on the osbs-request-push topic once the compose finishes suc‐
2285 cessfully.
2286
2287 Pungi simply logs the mapped data and emits the messages. It
2288 does not handle the messages or push images. A separate tool
2289 must do that.
2290
2291 Example config
2292 osbs = {
2293 "^Server$": {
2294 # required
2295 "url": "git://example.com/dockerfiles.git?#HEAD",
2296 "target": "f24-docker-candidate",
2297 "git_branch": "f24-docker",
2298
2299 # optional
2300 "repo": ["Everything", "https://example.com/extra-repo.repo"],
2301 # This will result in three repo urls being passed to the task.
2302 # They will be in this order: Server, Everything, example.com/
2303 "gpgkey": 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release',
2304 }
2305 }
2306
2307 Extra ISOs
2308 Create an ISO image that contains packages from multiple variants. Such
2309 ISO always belongs to one variant, and will be stored in ISO directory
2310 of that variant.
2311
2312 The ISO will be bootable if buildinstall phase runs for the parent
2313 variant. It will reuse boot configuration from that variant.
2314
2315 extra_isos
2316 (dict) – a mapping from variant UID regex to a list of configu‐
2317 ration blocks.
2318
2319 • include_variants – (list) list of variant UIDs from which con‐
2320 tent should be added to the ISO; the variant of this image is
2321 added automatically.
2322
2323 Rest of configuration keys is optional.
2324
2325 • filename – (str) template for naming the image. In addition to
2326 the regular placeholders filename is available with the name
2327 generated using image_name_format option.
2328
2329 • volid – (str) template for generating volume ID. Again volid
2330 placeholder can be used similarly as for file name. This can
2331 also be a list of templates that will be tried sequentially
2332 until one generates a volume ID that fits into 32 character
2333 limit.
2334
2335 • extra_files – (list) a list of scm_dict objects. These files
2336 will be put in the top level directory of the image.
2337
2338 • arches – (list) a list of architectures for which to build
2339 this image. By default all arches from the variant will be
2340 used. This option can be used to limit them.
2341
2342 • failable_arches – (list) a list of architectures for which the
2343 image can fail to be generated and not fail the entire com‐
2344 pose.
2345
2346 • skip_src – (bool) allows to disable creating an image with
2347 source packages.
2348
2349 • inherit_extra_files – (bool) by default extra files in vari‐
2350 ants are ignored. If you want to include them in the ISO, set
2351 this option to True.
2352
2353 • max_size – (int) expected maximum size in bytes. If the final
2354 image is larger, a warning will be issued.
2355
2356 Example config
2357 extra_isos = {
2358 'Server': [{
2359 # Will generate foo-DP-1.0-20180510.t.43-Server-x86_64-dvd1.iso
2360 'filename': 'foo-{filename}',
2361 'volid': 'foo-{arch}',
2362
2363 'extra_files': [{
2364 'scm': 'git',
2365 'repo': 'https://pagure.io/pungi.git',
2366 'file': 'setup.py'
2367 }],
2368
2369 'include_variants': ['Client']
2370 }]
2371 }
2372 # This should create image with the following layout:
2373 # .
2374 # ├── Client
2375 # │ ├── Packages
2376 # │ │ ├── a
2377 # │ │ └── b
2378 # │ └── repodata
2379 # ├── Server
2380 # │ ├── Packages
2381 # │ │ ├── a
2382 # │ │ └── b
2383 # │ └── repodata
2384 # └── setup.py
2385
2386 Media Checksums Settings
2387 media_checksums
2388 (list) – list of checksum types to compute, allowed values are
2389 anything supported by Python’s hashlib module (see documentation
2390 for details).
2391
2392 media_checksum_one_file
2393 (bool) – when True, only one CHECKSUM file will be created per
2394 directory; this option requires media_checksums to only specify
2395 one type
2396
2397 media_checksum_base_filename
2398 (str) – when not set, all checksums will be save to a file named
2399 either CHECKSUM or based on the digest type; this option allows
2400 adding any prefix to that name
2401
2402 It is possible to use format strings that will be replace by ac‐
2403 tual values. The allowed keys are:
2404
2405 • arch
2406
2407 • compose_id
2408
2409 • date
2410
2411 • label
2412
2413 • label_major_version
2414
2415 • release_short
2416
2417 • respin
2418
2419 • type
2420
2421 • type_suffix
2422
2423 • version
2424
2425 • dirname (only if media_checksum_one_file is enabled)
2426
2427 For example, for Fedora the prefix should be %(re‐
2428 lease_short)s-%(variant)s-%(version)s-%(date)s%(type_suf‐
2429 fix)s.%(respin)s.
2430
2431 Translate Paths Settings
2432 translate_paths
2433 (list) – list of paths to translate; format: [(path, trans‐
2434 lated_path)]
2435
2436 NOTE:
2437 This feature becomes useful when you need to transform compose loca‐
2438 tion into e.g. a HTTP repo which is can be passed to koji im‐
2439 age-build. The path part is normalized via os.path.normpath().
2440
2441 Example config
2442 translate_paths = [
2443 ("/mnt/a", "http://b/dir"),
2444 ]
2445
2446 Example usage
2447 >>> from pungi.util import translate_paths
2448 >>> print translate_paths(compose_object_with_mapping, "/mnt/a/c/somefile")
2449 http://b/dir/c/somefile
2450
2451 Miscellaneous Settings
2452 paths_module
2453 (str) – Name of Python module implementing the same interface as
2454 pungi.paths. This module can be used to override where things
2455 are placed.
2456
2457 link_type = hardlink-or-copy
2458 (str) – Method of putting packages into compose directory.
2459
2460 Available options:
2461
2462 • hardlink-or-copy
2463
2464 • hardlink
2465
2466 • copy
2467
2468 • symlink
2469
2470 • abspath-symlink
2471
2472 skip_phases
2473 (list) – List of phase names that should be skipped. The same
2474 functionality is available via a command line option.
2475
2476 release_discinfo_description
2477 (str) – Override description in .discinfo files. The value is a
2478 format string accepting %(variant_name)s and %(arch)s placehold‐
2479 ers.
2480
2481 symlink_isos_to
2482 (str) – If set, the ISO files from buildinstall, createiso and
2483 live_images phases will be put into this destination, and a sym‐
2484 link pointing to this location will be created in actual compose
2485 directory.
2486
2487 dogpile_cache_backend
2488 (str) – If set, Pungi will use the configured Dogpile cache
2489 backend to cache various data between multiple Pungi calls. This
2490 can make Pungi faster in case more similar composes are running
2491 regularly in short time.
2492
2493 For list of available backends, please see the
2494 https://dogpilecache.readthedocs.io documentation.
2495
2496 Most typical configuration uses the dogpile.cache.dbm backend.
2497
2498 dogpile_cache_arguments
2499 (dict) – Arguments to be used when creating the Dogpile cache
2500 backend. See the particular backend’s configuration for the
2501 list of possible key/value pairs.
2502
2503 For the dogpile.cache.dbm backend, the value can be for example
2504 following:
2505
2506 {
2507 "filename": "/tmp/pungi_cache_file.dbm"
2508 }
2509
2510 dogpile_cache_expiration_time
2511 (int) – Defines the default expiration time in seconds of data
2512 stored in the Dogpile cache. Defaults to 3600 seconds.
2513
2515 Actual Pungi configuration files can get very large. This pages brings
2516 two examples of (almost) full configuration for two different composes.
2517
2518 Fedora Rawhide compose
2519 This is a shortened configuration for Fedora Radhide compose as of
2520 2019-10-14.
2521
2522 release_name = 'Fedora'
2523 release_short = 'Fedora'
2524 release_version = 'Rawhide'
2525 release_is_layered = False
2526
2527 bootable = True
2528 comps_file = {
2529 'scm': 'git',
2530 'repo': 'https://pagure.io/fedora-comps.git',
2531 'branch': 'master',
2532 'file': 'comps-rawhide.xml',
2533 # Merge translations by running make. This command will generate the file.
2534 'command': 'make comps-rawhide.xml'
2535 }
2536 module_defaults_dir = {
2537 'scm': 'git',
2538 'repo': 'https://pagure.io/releng/fedora-module-defaults.git',
2539 'branch': 'main',
2540 'dir': '.'
2541 }
2542 # Optional module obsoletes configuration which is merged
2543 # into the module index and gets resolved
2544 module_obsoletes_dir = {
2545 'scm': 'git',
2546 'repo': 'https://pagure.io/releng/fedora-module-defaults.git',
2547 'branch': 'main',
2548 'dir': 'obsoletes'
2549 }
2550
2551 variants_file='variants-fedora.xml'
2552 sigkeys = ['12C944D0']
2553
2554 # Put packages into subdirectories hashed by their initial letter.
2555 hashed_directories = True
2556
2557 # There is a special profile for use with compose. It makes Pungi
2558 # authenticate automatically as rel-eng user.
2559 koji_profile = 'compose_koji'
2560
2561 # RUNROOT settings
2562 runroot = True
2563 runroot_channel = 'compose'
2564 runroot_tag = 'f32-build'
2565
2566 # PKGSET
2567 pkgset_source = 'koji'
2568 pkgset_koji_tag = 'f32'
2569 pkgset_koji_inherit = False
2570
2571 filter_system_release_packages = False
2572
2573 # GATHER
2574 gather_method = {
2575 '^.*': { # For all variants
2576 'comps': 'deps', # resolve dependencies for packages from comps file
2577 'module': 'nodeps', # but not for packages from modules
2578 }
2579 }
2580 gather_backend = 'dnf'
2581 gather_profiler = True
2582 check_deps = False
2583 greedy_method = 'build'
2584
2585 repoclosure_backend = 'dnf'
2586
2587 # CREATEREPO
2588 createrepo_deltas = False
2589 createrepo_database = True
2590 createrepo_use_xz = True
2591 createrepo_extra_args = ['--zck', '--zck-dict-dir=/usr/share/fedora-repo-zdicts/rawhide']
2592
2593 # CHECKSUMS
2594 media_checksums = ['sha256']
2595 media_checksum_one_file = True
2596 media_checksum_base_filename = '%(release_short)s-%(variant)s-%(version)s-%(arch)s-%(date)s%(type_suffix)s.%(respin)s'
2597
2598 # CREATEISO
2599 iso_hfs_ppc64le_compatible = False
2600
2601 # BUILDINSTALL
2602 buildinstall_method = 'lorax'
2603 buildinstall_skip = [
2604 # No installer for Modular variant
2605 ('^Modular$', {'*': True}),
2606 # No 32 bit installer for Everything.
2607 ('^Everything$', {'i386': True}),
2608 ]
2609
2610 # Enables macboot on x86_64 for all variants and disables upgrade image building
2611 # everywhere.
2612 lorax_options = [
2613 ('^.*$', {
2614 'x86_64': {
2615 'nomacboot': False
2616 },
2617 'ppc64le': {
2618 # Use 3GB image size for ppc64le.
2619 'rootfs_size': 3
2620 },
2621 '*': {
2622 'noupgrade': True
2623 }
2624 })
2625 ]
2626
2627 additional_packages = [
2628 ('^(Server|Everything)$', {
2629 '*': [
2630 # Add all architectures of dracut package.
2631 'dracut.*',
2632 # All all packages matching this pattern
2633 'autocorr-*',
2634 ],
2635 }),
2636
2637 ('^Everything$', {
2638 # Everything should include all packages from the tag. This only
2639 # applies to the native arch. Multilib will still be pulled in
2640 # according to multilib rules.
2641 '*': ['*'],
2642 }),
2643 ]
2644
2645 filter_packages = [
2646 ("^.*$", {"*": ["glibc32", "libgcc32"]}),
2647 ('(Server)$', {
2648 '*': [
2649 'kernel*debug*',
2650 'kernel-kdump*',
2651 ]
2652 }),
2653 ]
2654
2655 multilib = [
2656 ('^Everything$', {
2657 'x86_64': ['devel', 'runtime'],
2658 })
2659 ]
2660
2661 # These packages should never be multilib on any arch.
2662 multilib_blacklist = {
2663 '*': [
2664 'kernel', 'kernel-PAE*', 'kernel*debug*', 'java-*', 'php*', 'mod_*', 'ghc-*'
2665 ],
2666 }
2667
2668 # These should be multilib even if they don't match the rules defined above.
2669 multilib_whitelist = {
2670 '*': ['wine', '*-static'],
2671 }
2672
2673 createiso_skip = [
2674 # Keep binary ISOs for Server, but not source ones.
2675 ('^Server$', {'src': True}),
2676
2677 # Remove all other ISOs.
2678 ('^Everything$', {'*': True, 'src': True}),
2679 ('^Modular$', {'*': True, 'src': True}),
2680 ]
2681
2682 # Image name respecting Fedora's image naming policy
2683 image_name_format = '%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s-%(date)s%(type_suffix)s.%(respin)s.iso'
2684 # Use the same format for volume id
2685 image_volid_formats = [
2686 '%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s'
2687 ]
2688 # Used by Pungi to replace 'Cloud' with 'C' (etc.) in ISO volume IDs.
2689 # There is a hard 32-character limit on ISO volume IDs, so we use
2690 # these to try and produce short enough but legible IDs. Note this is
2691 # duplicated in Koji for live images, as livemedia-creator does not
2692 # allow Pungi to tell it what volume ID to use. Note:
2693 # https://fedoraproject.org/wiki/User:Adamwill/Draft_fedora_image_naming_policy
2694 volume_id_substitutions = {
2695 'Beta': 'B',
2696 'Rawhide': 'rawh',
2697 'Silverblue': 'SB',
2698 'Cinnamon': 'Cinn',
2699 'Cloud': 'C',
2700 'Design_suite': 'Dsgn',
2701 'Electronic_Lab': 'Elec',
2702 'Everything': 'E',
2703 'Scientific_KDE': 'SciK',
2704 'Security': 'Sec',
2705 'Server': 'S',
2706 'Workstation': 'WS',
2707 }
2708
2709 disc_types = {
2710 'boot': 'netinst',
2711 'live': 'Live',
2712 }
2713
2714 translate_paths = [
2715 ('/mnt/koji/compose/', 'https://kojipkgs.fedoraproject.org/compose/'),
2716 ]
2717
2718 # These will be inherited by live_media, live_images and image_build
2719 global_ksurl = 'git+https://pagure.io/fedora-kickstarts.git?#HEAD'
2720 global_release = '!RELEASE_FROM_LABEL_DATE_TYPE_RESPIN'
2721 global_version = 'Rawhide'
2722 # live_images ignores this in favor of live_target
2723 global_target = 'f32'
2724
2725 image_build = {
2726 '^Container$': [
2727 {
2728 'image-build': {
2729 'format': [('docker', 'tar.xz')],
2730 'name': 'Fedora-Container-Base',
2731 'kickstart': 'fedora-container-base.ks',
2732 'distro': 'Fedora-22',
2733 'disk_size': 5,
2734 'arches': ['armhfp', 'aarch64', 'ppc64le', 's390x', 'x86_64'],
2735 'repo': 'Everything',
2736 'install_tree_from': 'Everything',
2737 'subvariant': 'Container_Base',
2738 'failable': ['*'],
2739 },
2740 'factory-parameters': {
2741 'dockerversion': "1.10.1",
2742 'docker_cmd': '[ "/bin/bash" ]',
2743 'docker_env': '[ "DISTTAG=f32container", "FGC=f32", "container=oci" ]',
2744 'docker_label': '{ "name": "fedora", "license": "MIT", "vendor": "Fedora Project", "version": "32"}',
2745 },
2746 },
2747 ],
2748 }
2749
2750 live_media = {
2751 '^Workstation$': [
2752 {
2753 'name': 'Fedora-Workstation-Live',
2754 'kickstart': 'fedora-live-workstation.ks',
2755 # Variants.xml also contains aarch64 and armhfp, but there
2756 # should be no live media for those arches.
2757 'arches': ['x86_64', 'ppc64le'],
2758 'failable': ['ppc64le'],
2759 # Take packages and install tree from Everything repo.
2760 'repo': 'Everything',
2761 'install_tree_from': 'Everything',
2762 }
2763 ],
2764 '^Spins': [
2765 # There are multiple media for Spins variant. They use subvariant
2766 # field so that they can be identified in the metadata.
2767 {
2768 'name': 'Fedora-KDE-Live',
2769 'kickstart': 'fedora-live-kde.ks',
2770 'arches': ['x86_64'],
2771 'repo': 'Everything',
2772 'install_tree_from': 'Everything',
2773 'subvariant': 'KDE'
2774
2775 },
2776 {
2777 'name': 'Fedora-Xfce-Live',
2778 'kickstart': 'fedora-live-xfce.ks',
2779 'arches': ['x86_64'],
2780 'failable': ['*'],
2781 'repo': 'Everything',
2782 'install_tree_from': 'Everything',
2783 'subvariant': 'Xfce'
2784 },
2785 ],
2786 }
2787
2788 failable_deliverables = [
2789 # Installer and ISOs for server failing do not abort the compose.
2790 ('^Server$', {
2791 '*': ['buildinstall', 'iso'],
2792 }),
2793 ('^.*$', {
2794 # Buildinstall is not blocking
2795 'src': ['buildinstall'],
2796 # Nothing on i386, ppc64le blocks the compose
2797 'i386': ['buildinstall', 'iso'],
2798 'ppc64le': ['buildinstall', 'iso'],
2799 's390x': ['buildinstall', 'iso'],
2800 })
2801 ]
2802
2803 live_target = 'f32'
2804 live_images_no_rename = True
2805 live_images = [
2806 ('^Workstation$', {
2807 'armhfp': {
2808 'kickstart': 'fedora-arm-workstation.ks',
2809 'name': 'Fedora-Workstation-armhfp',
2810 # Again workstation takes packages from Everything.
2811 'repo': 'Everything',
2812 'type': 'appliance',
2813 'failable': True,
2814 }
2815 }),
2816 ('^Server$', {
2817 # But Server has its own repo.
2818 'armhfp': {
2819 'kickstart': 'fedora-arm-server.ks',
2820 'name': 'Fedora-Server-armhfp',
2821 'type': 'appliance',
2822 'failable': True,
2823 }
2824 }),
2825 ]
2826
2827 ostree = {
2828 "^Silverblue$": {
2829 "version": "!OSTREE_VERSION_FROM_LABEL_DATE_TYPE_RESPIN",
2830 # To get config, clone master branch from this repo and take
2831 # treefile from there.
2832 "treefile": "fedora-silverblue.yaml",
2833 "config_url": "https://pagure.io/workstation-ostree-config.git",
2834 "config_branch": "master",
2835 # Consume packages from Everything
2836 "repo": "Everything",
2837 # Don't create a reference in the ostree repo (signing automation does that).
2838 "tag_ref": False,
2839 # Don't use change detection in ostree.
2840 "force_new_commit": True,
2841 # Use unified core mode for rpm-ostree composes
2842 "unified_core": True,
2843 # This is the location for the repo where new commit will be
2844 # created. Note that this is outside of the compose dir.
2845 "ostree_repo": "/mnt/koji/compose/ostree/repo/",
2846 "ostree_ref": "fedora/rawhide/${basearch}/silverblue",
2847 "arches": ["x86_64", "ppc64le", "aarch64"],
2848 "failable": ['*'],
2849 }
2850 }
2851
2852 ostree_installer = [
2853 ("^Silverblue$", {
2854 "x86_64": {
2855 "repo": "Everything",
2856 "release": None,
2857 "rootfs_size": "8",
2858 # Take templates from this repository.
2859 'template_repo': 'https://pagure.io/fedora-lorax-templates.git',
2860 'template_branch': 'master',
2861 # Use following templates.
2862 "add_template": ["ostree-based-installer/lorax-configure-repo.tmpl",
2863 "ostree-based-installer/lorax-embed-repo.tmpl",
2864 "ostree-based-installer/lorax-embed-flatpaks.tmpl"],
2865 # And add these variables for the templates.
2866 "add_template_var": [
2867 "ostree_install_repo=https://kojipkgs.fedoraproject.org/compose/ostree/repo/",
2868 "ostree_update_repo=https://ostree.fedoraproject.org",
2869 "ostree_osname=fedora",
2870 "ostree_oskey=fedora-32-primary",
2871 "ostree_contenturl=mirrorlist=https://ostree.fedoraproject.org/mirrorlist",
2872 "ostree_install_ref=fedora/rawhide/x86_64/silverblue",
2873 "ostree_update_ref=fedora/rawhide/x86_64/silverblue",
2874 "flatpak_remote_name=fedora",
2875 "flatpak_remote_url=oci+https://registry.fedoraproject.org",
2876 "flatpak_remote_refs=runtime/org.fedoraproject.Platform/x86_64/f30 app/org.gnome.Baobab/x86_64/stable",
2877 ],
2878 'failable': ['*'],
2879 },
2880 })
2881 ]
2882
2883 RCM Tools compose
2884 This is a small compose used to deliver packages to Red Hat internal
2885 users. The configuration is split into two files.
2886
2887 # rcmtools-common.conf
2888
2889 release_name = "RCM Tools"
2890 release_short = "RCMTOOLS"
2891 release_version = "2.0"
2892 release_type = "updates"
2893 release_is_layered = True
2894 createrepo_c = True
2895 createrepo_checksum = "sha256"
2896
2897 # PKGSET
2898 pkgset_source = "koji"
2899 koji_profile = "brew"
2900 pkgset_koji_inherit = True
2901
2902
2903 # GENERAL SETTINGS
2904 bootable = False
2905 comps_file = "rcmtools-comps.xml"
2906 variants_file = "rcmtools-variants.xml"
2907 sigkeys = ["3A3A33A3"]
2908
2909
2910 # RUNROOT settings
2911 runroot = False
2912
2913
2914 # GATHER
2915 gather_method = "deps"
2916 check_deps = True
2917
2918 additional_packages = [
2919 ('.*', {
2920 '*': ['puddle', 'rcm-nexus'],
2921 }
2922 ),
2923 ]
2924
2925 # Set repoclosure_strictness to fatal to avoid installation dependency
2926 # issues in production composes
2927 repoclosure_strictness = [
2928 ("^.*$", {
2929 "*": "fatal"
2930 })
2931 ]
2932
2933 Configuration specific for different base products is split into sepa‐
2934 rate files.
2935
2936 # rcmtools-common.conf
2937 from rcmtools-common import *
2938
2939 # BASE PRODUCT
2940 base_product_name = "Red Hat Enterprise Linux"
2941 base_product_short = "RHEL"
2942 base_product_version = "7"
2943
2944 # PKGSET
2945 pkgset_koji_tag = "rcmtools-rhel-7-compose"
2946
2947 # remove i386 arch on rhel7
2948 tree_arches = ["aarch64", "ppc64le", "s390x", "x86_64"]
2949
2950 check_deps = False
2951
2952 # Packages in these repos are available to satisfy dependencies inside the
2953 # compose, but will not be pulled in.
2954 gather_lookaside_repos = [
2955 ("^Client|Client-optional$", {
2956 "x86_64": [
2957 "http://example.redhat.com/rhel/7/Client/x86_64/os/",
2958 "http://example.redhat.com/rhel/7/Client/x86_64/optional/os/",
2959 ],
2960 }),
2961 ("^Workstation|Workstation-optional$", {
2962 "x86_64": [
2963 "http://example.redhat.com/rhel/7/Workstation/x86_64/os/",
2964 "http://example.redhat.com/rhel/7/Workstation/x86_64/optional/os/",
2965 ],
2966 }),
2967 ("^Server|Server-optional$", {
2968 "aarch64": [
2969 "http://example.redhat.com/rhel/7/Server/aarch64/os/",
2970 "http://example.redhat.com/rhel/7/Server/aarch64/optional/os/",
2971 ],
2972 "ppc64": [
2973 "http://example.redhat.com/rhel/7/Server/ppc64/os/",
2974 "http://example.redhat.com/rhel/7/Server/ppc64/optional/os/",
2975 ],
2976 "ppc64le": [
2977 "http://example.redhat.com/rhel/7/Server/ppc64le/os/",
2978 "http://example.redhat.com/rhel/7/Server/ppc64le/optional/os/",
2979 ],
2980 "s390x": [
2981 "http://example.redhat.com/rhel/7/Server/s390x/os/",
2982 "http://example.redhat.com/rhel/7/Server/s390x/optional/os/",
2983 ],
2984 "x86_64": [
2985 "http://example.redhat.com/rhel/7/Server/x86_64/os/",
2986 "http://example.redhat.com/rhel/7/Server/x86_64/optional/os/",
2987 ],
2988 })
2989 ]
2990
2992 Multiple places in Pungi can use files from external storage. The con‐
2993 figuration is similar independently of the backend that is used, al‐
2994 though some features may be different.
2995
2996 The so-called scm_dict is always put into configuration as a dictio‐
2997 nary, which can contain following keys.
2998
2999 • scm – indicates which SCM system is used. This is always required.
3000 Allowed values are:
3001
3002 • file – copies files from local filesystem
3003
3004 • git – copies files from a Git repository
3005
3006 • cvs – copies files from a CVS repository
3007
3008 • rpm – copies files from a package in the compose
3009
3010 • koji – downloads archives from a given build in Koji build system
3011
3012 • repo
3013
3014 • for Git and CVS backends this should be URL to the repository
3015
3016 • for RPM backend this should be a shell style glob matching package
3017 names (or a list of such globs)
3018
3019 • for file backend this should be empty
3020
3021 • for Koji backend this should be an NVR or package name
3022
3023 • branch
3024
3025 • branch name for Git and CVS backends, with master and HEAD as de‐
3026 faults
3027
3028 • Koji tag for koji backend if only package name is given
3029
3030 • otherwise should not be specified
3031
3032 • file – a list of files that should be exported.
3033
3034 • dir – a directory that should be exported. All its contents will be
3035 exported. This option is mutually exclusive with file.
3036
3037 • command – defines a shell command to run after Git clone to generate
3038 the needed file (for example to run make). Only supported in Git
3039 backend.
3040
3041 Koji examples
3042 There are two different ways how to configure the Koji backend.
3043
3044 {
3045 # Download all *.tar files from build my-image-1.0-1.
3046 "scm": "koji",
3047 "repo": "my-image-1.0-1",
3048 "file": "*.tar",
3049 }
3050
3051 {
3052 # Find latest build of my-image in tag my-tag and take files from
3053 # there.
3054 "scm": "koji",
3055 "repo": "my-image",
3056 "branch": "my-tag",
3057 "file": "*.tar",
3058 }
3059
3060 Using both tag name and exact NVR will result in error: the NVR would
3061 be interpreted as a package name, and would not match anything.
3062
3063 file vs. dir
3064 Exactly one of these two options has to be specified. Documentation for
3065 each configuration option should specify whether it expects a file or a
3066 directory.
3067
3068 For extra_files phase either key is valid and should be chosen depend‐
3069 ing on what the actual use case.
3070
3071 Caveats
3072 The rpm backend can only be used in phases that would extract the files
3073 after pkgset phase finished. You can’t get comps file from a package.
3074
3075 Depending on Git repository URL configuration Pungi can only export the
3076 requested content using git archive. When a command should run this is
3077 not possible and a clone is always needed.
3078
3079 When using koji backend, it is required to provide configuration for
3080 Koji profile to be used (koji_profile). It is not possible to contact
3081 multiple different Koji instances.
3082
3084 Pungi has the ability to emit notification messages about progress and
3085 general status of the compose. These can be used to e.g. send messages
3086 to fedmsg. This is implemented by actually calling a separate script.
3087
3088 The script will be called with one argument describing action that just
3089 happened. A JSON-encoded object will be passed to standard input to
3090 provide more information about the event. At the very least, the object
3091 will contain a compose_id key.
3092
3093 The notification script inherits working directory from the parent
3094 process and it can be called from the same directory pungi-koji is
3095 called from. The working directory is listed at the start of main log.
3096
3097 Currently these messages are sent:
3098
3099 • status-change – when composing starts, finishes or fails; a status
3100 key is provided to indicate details
3101
3102 • phase-start – on start of a phase
3103
3104 • phase-stop – when phase is finished
3105
3106 • createiso-targets – with a list of images to be created
3107
3108 • createiso-imagedone – when any single image is finished
3109
3110 • createiso-imagefail – when any single image fails to create
3111
3112 • fail-to-start – when there are incorrect CLI options or errors in
3113 configuration file; this message does not contain compose_id nor
3114 is it started in the compose directory (which does not exist yet)
3115
3116 • ostree – when a new commit is created, this message will announce
3117 its hash and the name of ref it is meant for.
3118
3119 For phase related messages phase_name key is provided as well.
3120
3121 A pungi-fedmsg-notification script is provided and understands this in‐
3122 terface.
3123
3124 Setting it up
3125 The script should be provided as a command line argument --notifica‐
3126 tion-script.
3127
3128 --notification-script=pungi-fedmsg-notification
3129
3131 A compose created by Pungi consists of one or more variants. A variant
3132 contains a subset of the content targeted at a particular use case.
3133
3134 There are different types of variants. The type affects how packages
3135 are gathered into the variant.
3136
3137 The inputs for gathering are defined by various gather sources. Pack‐
3138 ages from all sources are collected to create a big list of package
3139 names, comps groups names and a list of packages that should be fil‐
3140 tered out.
3141
3142 NOTE:
3143 The inputs for both explicit package list and comps file are inter‐
3144 preted as RPM names, not any arbitrary provides nor source package
3145 name.
3146
3147 Next, gather_method defines how the list is processed. For nodeps, the
3148 results from source are used pretty much as is [1]. For deps method, a
3149 process will be launched to figure out what dependencies are needed and
3150 those will be pulled in.
3151
3152 [1] The lists are filtered based on what packages are available in the
3153 package set, but nothing else will be pulled in.
3154
3155 Variant types
3156 Variant
3157 is a base type that has no special behaviour.
3158
3159 Addon is built on top of a regular variant. Any packages that should
3160 go to both the addon and its parent will be removed from addon.
3161 Packages that are only in addon but pulled in because of
3162 gather_fulltree option will be moved to parent.
3163
3164 Integrated Layered Product
3165 works similarly to addon. Additionally, all packages from addons
3166 on the same parent variant are removed integrated layered prod‐
3167 ucts.
3168
3169 The main difference between an addon and integrated layered
3170 product is that integrated layered product has its own identity
3171 in the metadata (defined with product name and version).
3172
3173 NOTE:
3174 There’s also Layered Product as a term, but this is not re‐
3175 lated to variants. It’s used to describe a product that is
3176 not a standalone operating system and is instead meant to be
3177 used on some other base system.
3178
3179 Optional
3180 contains packages that complete the base variants’ package set.
3181 It always has fulltree and selfhosting enabled, so it contains
3182 build dependencies and packages which were not specifically re‐
3183 quested for base variant.
3184
3185 Some configuration options are overridden for particular variant types.
3186
3187 Depsolving configuration
3188 ┌──────────┬──────────────┬──────────────┐
3189 │Variant │ Fulltree │ Selfhosting │
3190 ├──────────┼──────────────┼──────────────┤
3191 │base │ configurable │ configurable │
3192 ├──────────┼──────────────┼──────────────┤
3193 │addon/ILP │ enabled │ disabled │
3194 ├──────────┼──────────────┼──────────────┤
3195 │optional │ enabled │ enabled │
3196 └──────────┴──────────────┴──────────────┘
3197
3198 Profiling
3199 Profiling data on the pungi-gather tool can be enabled by setting the
3200 gather_profiler configuration option to True.
3201
3202 Modular compose
3203 A compose with gather_source set to module is called modular. The pack‐
3204 age list is determined by a list of modules.
3205
3206 The list of modules that will be put into a variant is defined in the
3207 variants.xml file. The file can contain either Name:Stream or
3208 Name:Stream:Version references. See Module Naming Policy for details.
3209 When Version is missing from the specification, Pungi will ask PDC for
3210 the latest one.
3211
3212 The module metadata in PDC contains a list of RPMs in the module as
3213 well as Koji tag from which the packages can be retrieved.
3214
3215 Restrictions
3216 • A modular compose must always use Koji as a package set source.
3217
3219 The comps file that Pungi takes as input is not really pure comps as
3220 used by tools like DNF. There are extensions used to customize how the
3221 file is processed.
3222
3223 The first step of Pungi processing is to retrieve the actual file. This
3224 can use anything that Exporting files from SCM supports.
3225
3226 Pungi extensions are arch attribute on packageref, group and environ‐
3227 ment tags. The value of this attribute is a comma separated list of ar‐
3228 chitectures.
3229
3230 Second step Pungi performs is creating a file for each architecture.
3231 This is done by removing all elements with incompatible arch attribute.
3232 No additional clean up is performed on this file. The resulting file is
3233 only used internally for the rest of the compose process.
3234
3235 Third and final step is to create comps file for each Variant.Arch com‐
3236 bination. This is the actual file that will be included in the com‐
3237 pose. The start file is the original input file, from which all ele‐
3238 ments with incompatible architecture are removed. Then clean up is per‐
3239 formed by removing all empty groups, removing non-existing groups from
3240 environments and categories and finally removing empty environments and
3241 categories. As a last step groups not listed in the variants file are
3242 removed.
3243
3245 Set up development environment
3246 In order to work on Pungi, you should install recent version of Fedora.
3247
3248 Python2
3249 Fedora 29 is recommended because some packages are not available in
3250 newer Fedora release, e.g. python2-libcomps.
3251
3252 Install required packages
3253
3254 $ sudo dnf install -y krb5-devel gcc make libcurl-devel python2-devel python2-createrepo_c kobo-rpmlib yum python2-libcomps python2-libselinx
3255
3256 Python3
3257 Install required packages
3258
3259 $ sudo dnf install -y krb5-devel gcc make libcurl-devel python3-devel python3-createrepo_c python3-libcomps
3260
3261 Developing
3262 Currently the development workflow for Pungi is on master branch:
3263
3264 • Make your own fork at https://pagure.io/pungi
3265
3266 • Clone your fork locally (replacing $USERNAME with your own):
3267
3268 git clone git@pagure.io:forks/$USERNAME/pungi.git
3269
3270 • cd into your local clone and add the remote upstream for rebasing:
3271
3272 cd pungi
3273 git remote add upstream git@pagure.io:pungi.git
3274
3275 NOTE:
3276 This workflow assumes that you never git commit directly to the
3277 master branch of your fork. This will make more sense when we
3278 cover rebasing below.
3279
3280 • create a topic branch based on master:
3281
3282 git branch my_topic_branch master
3283 git checkout my_topic_branch
3284
3285 • Make edits, changes, add new features, etc. and then make sure to
3286 pull from upstream master and rebase before submitting a pull re‐
3287 quest:
3288
3289 # lets just say you edited setup.py for sake of argument
3290 git checkout my_topic_branch
3291
3292 # make changes to setup.py
3293 black setup.py
3294 tox
3295 git add setup.py
3296 git commit -s -m "added awesome feature to setup.py"
3297
3298 # now we rebase
3299 git checkout master
3300 git pull --rebase upstream master
3301 git push origin master
3302 git push origin --tags
3303 git checkout my_topic_branch
3304 git rebase master
3305
3306 # resolve merge conflicts if any as a result of your development in
3307 # your topic branch
3308 git push origin my_topic_branch
3309
3310 NOTE:
3311 In order to for your commit to be merged:
3312
3313 • you must sign-off on it. Use -s option when running git commit.
3314
3315 • The code must be well formatted via black and pass flake8 check‐
3316 ing. Run tox -e black,flake8 to do the check.
3317
3318 • Create pull request in the pagure.io web UI
3319
3320 • For convenience, here is a bash shell function that can be placed in
3321 your ~/.bashrc and called such as pullupstream pungi-4-devel that
3322 will automate a large portion of the rebase steps from above:
3323
3324 pullupstream () {
3325 if [[ -z "$1" ]]; then
3326 printf "Error: must specify a branch name (e.g. - master, devel)\n"
3327 else
3328 pullup_startbranch=$(git describe --contains --all HEAD)
3329 git checkout $1
3330 git pull --rebase upstream master
3331 git push origin $1
3332 git push origin --tags
3333 git checkout ${pullup_startbranch}
3334 fi
3335 }
3336
3337 Testing
3338 You must write unit tests for any new code (except for trivial
3339 changes). Any code without sufficient test coverage may not be merged.
3340
3341 To run all existing tests, suggested method is to use tox.
3342
3343 $ sudo dnf install python3-tox -y
3344
3345 $ tox -e py3
3346 $ tox -e py27
3347
3348 Alternatively you could create a vitualenv, install deps and run tests
3349 manually if you don’t want to use tox.
3350
3351 $ sudo dnf install python3-virtualenvwrapper -y
3352 $ mkvirtualenv --system-site-packages py3
3353 $ workon py3
3354 $ pip install -r requirements.txt -r test-requirements.txt
3355 $ make test
3356
3357 # or with coverage
3358 $ make test-coverage
3359
3360 If you need to run specified tests, pytest is recommended.
3361
3362 # Activate virtualenv first
3363
3364 # Run tests
3365 $ pytest tests/test_config.py
3366 $ pytest tests/test_config.py -k test_pkgset_mismatch_repos
3367
3368 In the tests/ directory there is a shell script test_compose.sh that
3369 you can use to try and create a miniature compose on dummy data. The
3370 actual data will be created by running make test-data in project root.
3371
3372 $ sudo dnf -y install rpm-build createrepo_c isomd5sum genisoimage syslinux
3373
3374 # Activate virtualenv (the one created by tox could be used)
3375 $ source .tox/py3/bin/activate
3376
3377 $ python setup.py develop
3378 $ make test-data
3379 $ make test-compose
3380
3381 This testing compose does not actually use all phases that are avail‐
3382 able, and there is no checking that the result is correct. It only
3383 tells you whether it crashed or not.
3384
3385 NOTE:
3386 Even when it finishes successfully, it may print errors about re‐
3387 poclosure on Server-Gluster.x86_64 in test phase. This is not a bug.
3388
3389 Documenting
3390 You must write documentation for any new features and functional
3391 changes. Any code without sufficient documentation may not be merged.
3392
3393 To generate the documentation, run make doc in project root.
3394
3396 Test Data
3397 Tests require test data and not all of it is available in git. You
3398 must create test repositories before running the tests:
3399
3400 make test-data
3401
3402 Requirements: createrepo_c, rpmbuild
3403
3404 Unit Tests
3405 Unit tests cover functionality of Pungi python modules. You can run
3406 all of them at once:
3407
3408 make test
3409
3410 which is shortcut to:
3411
3412 python2 setup.py test
3413 python3 setup.py test
3414
3415 You can alternatively run individual tests:
3416
3417 cd tests
3418 ./<test>.py [<class>[.<test>]]
3419
3420 Functional Tests
3421 Because compose is quite complex process and not everything is covered
3422 with unit tests yet, the easiest way how to test if your changes did
3423 not break anything badly is to start a compose on a relatively small
3424 and well defined package set:
3425
3426 cd tests
3427 ./test_compose.sh
3428
3430 There may be cases where it makes sense to split a big compose into
3431 separate parts, but create a compose output that links all output into
3432 one familiar structure.
3433
3434 The pungi-orchestrate tools allows that.
3435
3436 It works with an INI-style configuration file. The [general] section
3437 contains information about identity of the main compose. Other sections
3438 define individual parts.
3439
3440 The parts are scheduled to run in parallel, with the minimal amount of
3441 serialization. The final compose directory will contain hard-links to
3442 the files.
3443
3444 General settings
3445 target Path to directory where the final compose should be created.
3446
3447 compose_type
3448 Type of compose to make.
3449
3450 release_name
3451 Name of the product for the final compose.
3452
3453 release_short
3454 Short name of the product for the final compose.
3455
3456 release_version
3457 Version of the product for the final compose.
3458
3459 release_type
3460 Type of the product for the final compose.
3461
3462 extra_args
3463 Additional arguments that will be passed to the child Pungi pro‐
3464 cesses.
3465
3466 koji_profile
3467 If specified, a current event will be retrieved from the Koji
3468 instance and used for all parts.
3469
3470 kerberos
3471 If set to yes, a kerberos ticket will be automatically created
3472 at the start. Set keytab and principal as well.
3473
3474 kerberos_keytab
3475 Path to keytab file used to create the kerberos ticket.
3476
3477 kerberos_principal
3478 Kerberos principal for the ticket
3479
3480 pre_compose_script
3481 Commands to execute before first part is started. Can contain
3482 multiple commands on separate lines.
3483
3484 post_compose_script
3485 Commands to execute after the last part finishes and final sta‐
3486 tus is updated. Can contain multiple commands on separate lines.
3487
3488 post_compose_script =
3489 compose-latest-symlink $COMPOSE_PATH
3490 custom-post-compose-script.sh
3491
3492 Multiple environment variables are defined for the scripts:
3493
3494 • COMPOSE_PATH
3495
3496 • COMPOSE_ID
3497
3498 • COMPOSE_DATE
3499
3500 • COMPOSE_TYPE
3501
3502 • COMPOSE_RESPIN
3503
3504 • COMPOSE_LABEL
3505
3506 • RELEASE_ID
3507
3508 • RELEASE_NAME
3509
3510 • RELEASE_SHORT
3511
3512 • RELEASE_VERSION
3513
3514 • RELEASE_TYPE
3515
3516 • RELEASE_IS_LAYERED – YES for layered products, empty other‐
3517 wise
3518
3519 • BASE_PRODUCT_NAME – only set for layered products
3520
3521 • BASE_PRODUCT_SHORT – only set for layered products
3522
3523 • BASE_PRODUCT_VERSION – only set for layered products
3524
3525 • BASE_PRODUCT_TYPE – only set for layered products
3526
3527 notification_script
3528 Executable name (or path to a script) that will be used to send
3529 a message once the compose is finished. In order for a valid URL
3530 to be included in the message, at least one part must configure
3531 path translation that would apply to location of main compose.
3532
3533 Only two messages will be sent, one for start and one for finish
3534 (either successful or not).
3535
3536 Partial compose settings
3537 Each part should have a separate section in the config file.
3538
3539 It can specify these options:
3540
3541 config Path to configuration file that describes this part. If rela‐
3542 tive, it is resolved relative to the file with parts configura‐
3543 tion.
3544
3545 just_phase, skip_phase
3546 Customize which phases should run for this part.
3547
3548 depends_on
3549 A comma separated list of other parts that must be finished be‐
3550 fore this part starts.
3551
3552 failable
3553 A boolean toggle to mark a part as failable. A failure in such
3554 part will mark the final compose as incomplete, but still suc‐
3555 cessful.
3556
3558 Daniel Mach
3559
3561 2022, Red Hat, Inc.
3562
3563
3564
3565
35664.3 Dec 09, 2022 PUNGI(1)