<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Copr blog</title>
    <description>Copr is a service that builds your application as an RPM and provides you with your own Dnf/Yum repository.
</description>
    <link>https://fedora-copr.github.io//</link>
    <atom:link href="https://fedora-copr.github.io//feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Thu, 02 Apr 2026 18:03:28 +0000</pubDate>
    <lastBuildDate>Thu, 02 Apr 2026 18:03:28 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>First look at the Copr MCP server</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/first-look-at-the-copr-mcp-server</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/first-look-at-the-copr-mcp-server</guid>
        
        
      </item>
    
      <item>
        <title>Fedora RISC-V 64-bit now available in Copr</title>
        <author>Copr Team</author>
        <description>&lt;p&gt;We are happy to announce that Fedora RISC-V 64-bit (riscv64) build targets are now available in Copr! The following chroots have been added to &lt;a href=&quot;https://rpm-software-management.github.io/mock/Release-Notes-Configs-43.4&quot;&gt;mock-core-configs&lt;/a&gt; and enabled in Copr:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fedora-42-riscv64&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fedora-43-riscv64&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;important-notes&quot;&gt;Important notes&lt;/h2&gt;

&lt;p&gt;We currently do not have native RISC-V hardware in our infrastructure. All riscv64 builds are performed using QEMU emulation on x86_64 machines. Because of this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Expect longer build times compared to native architectures&lt;/li&gt;
  &lt;li&gt;Only userspace calls are possible. If your package needs to make a kernelspace call during the build time or the check phase, then your build will fail. Only a few packages are limited by this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you encounter any issues, please &lt;a href=&quot;https://github.com/fedora-copr/copr/issues&quot;&gt;let us know&lt;/a&gt;!&lt;/p&gt;
</description>
        <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/riscv64-architecture-support</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/riscv64-architecture-support</guid>
        
        
      </item>
    
      <item>
        <title>CPT - look back at 2025</title>
        <author>Miroslav Suchý</author>
        <description>&lt;h1 id=&quot;cpt---look-back-at-2025&quot;&gt;CPT - look back at 2025&lt;/h1&gt;

&lt;p&gt;We did &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2025-12-10.html&quot;&gt;five releases&lt;/a&gt; of Copr that included these new features:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You can regenerate a token from the CLI&lt;/li&gt;
  &lt;li&gt;Anubis as protection from heartless AI crawlers&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://frostyx.cz/posts/copr-modularity-the-end-of-an-era&quot;&gt;Deprecation of modularity&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://fedora-copr.github.io/posts/migrating-copr-results-to-pulp&quot;&gt;Pulp as a backend storage&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Integration with &lt;a href=&quot;https://logdetective.com/&quot;&gt;the Log Detective&lt;/a&gt; service&lt;/li&gt;
  &lt;li&gt;Migration to OIDC authentication.&lt;/li&gt;
  &lt;li&gt;Custom webhooks add a record to the Webhook history table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We did &lt;a href=&quot;https://rpm-software-management.github.io/mock/#release-notes&quot;&gt;eight releases of Mock&lt;/a&gt; with these features:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Buildroot lockfile generator to enable hermetic builds.&lt;/li&gt;
  &lt;li&gt;New &lt;a href=&quot;https://rpm-software-management.github.io/mock/Plugin-Unbreq&quot;&gt;plugin unbreq&lt;/a&gt; to detect unused BuildRequires.&lt;/li&gt;
  &lt;li&gt;We passed `–suppress-sync=yes` to `systemd-nspawn` but then we disabled it as it caused problems to some packages. It is available as opt-in.&lt;/li&gt;
  &lt;li&gt;Automatic mapping to the appropriate user-static QEMU binary when building for new architectures (like RISC-V).&lt;/li&gt;
  &lt;li&gt;Numerous new configs have been added.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We wrote two articles for &lt;a href=&quot;https://fedoramagazine.org/?s=4+cool+new+projects+to+try+in+Copr&quot;&gt;Fedora Magazine&lt;/a&gt; and six other &lt;a href=&quot;https://fedora-copr.github.io/&quot;&gt;blogposts&lt;/a&gt;.&lt;br /&gt;
Pavel developed &lt;a href=&quot;https://github.com/praiskup/norpm&quot;&gt;norpm&lt;/a&gt;, which allows safe parsing of SPEC files.&lt;br /&gt;
We handled several issues in labs where Copr builders are: insufficient resources for s390x, problems with networking of ppc64le, moving x86_64 builders to a different datacenter, allocated high-performing builders for ppc64le…&lt;br /&gt;
Jakub added descriptions to &lt;a href=&quot;https://download.copr.fedorainfracloud.org/resalloc/pools&quot;&gt;resource pools&lt;/a&gt; so we can thank our donors.&lt;br /&gt;
Jakub wrote a nice page describing &lt;a href=&quot;https://rpm-software-management.github.io/mock/Why-Mock&quot;&gt;why you should use Mock&lt;/a&gt;.&lt;br /&gt;
Pavel upstreamed &lt;a href=&quot;https://github.com/konflux-ci/rpmbuild-pipeline&quot;&gt;Tekton Pipelines&lt;/a&gt; for Konflux.&lt;br /&gt;
You built 1.4 million packages in Copr in 2025. And Copr serves about 44TB of DNF repositories.&lt;/p&gt;

&lt;h2 id=&quot;released-sw&quot;&gt;Released SW&lt;/h2&gt;

&lt;p&gt;Besides Copr, we maintain several projects and this year we did these notable releases:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Five releases of &lt;a href=&quot;https://github.com/praiskup/resalloc/releases&quot;&gt;resalloc&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;We spent a lot of time maintaining llama-cpp-python in Fedora.&lt;/li&gt;
  &lt;li&gt;Three releases of &lt;a href=&quot;https://github.com/rpm-software-management/fedora-distro-aliases/releases&quot;&gt;fedora-distro-aliases&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;One release of &lt;a href=&quot;https://github.com/xsuchy/rpmconf/&quot;&gt;rpmconf&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Nine releases of &lt;a href=&quot;https://github.com/rpm-software-management/distribution-gpg-keys&quot;&gt;distribution-gpg-keys&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Three releases of &lt;a href=&quot;https://github.com/xsuchy/fedora-upgrade/&quot;&gt;fedora-upgrade&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;One release of &lt;a href=&quot;https://pagure.io/FedoraReview&quot;&gt;fedora-review&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;log-detective&quot;&gt;Log Detective&lt;/h2&gt;

&lt;p&gt;We successfully launched &lt;a href=&quot;https://logdetective.com/&quot;&gt;Log Detective&lt;/a&gt; as a prototype in January. Put it fully in production mode in May. And we have been improving it since then.&lt;br /&gt;
Jiri set up metrics to measure whether changes in LLM models are improving responses.&lt;/p&gt;

&lt;h2 id=&quot;spdx&quot;&gt;SPDX&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Miroslav continued working on &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_4&quot;&gt;SPDX Change&lt;/a&gt;:
    &lt;ul&gt;
      &lt;li&gt;With the help of Richard Fontana, Miroslav added 75 new entries to fedora-license-data.&lt;/li&gt;
      &lt;li&gt;Miroslav added (with the help of Jilayne Lovejoy) 24 new licenses to SPDX license-list’s upstream repository.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;talks&quot;&gt;Talks&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Pavel spoke at “&lt;a href=&quot;https://cfp.fedoraproject.org/flock-to-fedora-2025/talk/CLDGTL/&quot;&gt;specfile library + norpm&lt;/a&gt;” at Flock.&lt;/li&gt;
  &lt;li&gt;Jirka Podivin participated in a talk &lt;a href=&quot;https://cfp.fedoraproject.org/flock-to-fedora-2025/talk/ESQL98/&quot;&gt;We need a Detective to inspect these Logs :: Flock to Fedora 2025&lt;/a&gt; and in a workshop &lt;a href=&quot;https://cfp.fedoraproject.org/flock-to-fedora-2025/talk/38FEL9/&quot;&gt;Log Detective Workshop :: Flock to Fedora 2025&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Miroslav talked about “&lt;a href=&quot;https://www.youtube.com/live/VqsSQyoy9Vs?si=LaPi5azvmsLpIc2O&amp;amp;t=11270&quot;&gt;Real dangers of AI&lt;/a&gt;” at DevConf.cz.&lt;/li&gt;
  &lt;li&gt;Jiri Podivin presented LogDetective to a delegation from the European Parliament as one of the development projects in Brno.&lt;/li&gt;
  &lt;li&gt;Jakub did two presentations for &lt;a href=&quot;https://pyladies.cz/&quot;&gt;PyLadies&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-can-you-expect-from-us-in-2026&quot;&gt;What can you expect from us in 2026?&lt;/h2&gt;

&lt;p&gt;We finished the development phase of Pulp integration. The first month of 2026 will be focused on operation - migrating users’ data to the Pulp backend.&lt;/p&gt;

&lt;p&gt;We want to put &lt;a href=&quot;https://github.com/fedora-copr/rpmeta&quot;&gt;rpmeta&lt;/a&gt; in production and dynamically allocate &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/user_documentation/powerful_builders.html#high-performance-builders&quot;&gt;high-performance builders&lt;/a&gt; when your build will take too much time on a normal builder.&lt;/p&gt;

&lt;p&gt;If you want to affect what else we do in 2026, you can check our &lt;a href=&quot;https://github.com/orgs/fedora-copr/projects/1/views/5?filterQuery=status%3A%22In+2+years%22&quot;&gt;backlog&lt;/a&gt; and cast your vote (use an emoticon for comment #0) or add a comment on how much time the feature will save if implemented. And we will choose the card that will have the most significant impact.&lt;/p&gt;
</description>
        <pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/look-back-2025</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/look-back-2025</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2025-12-10 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Wed, 10 Dec 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Migrating Copr results to Pulp</title>
        <author>Jakub Kadlčík</author>
        <description>&lt;p&gt;Over the last year, the Copr team has put a lot of effort into supporting
&lt;a href=&quot;https://pulpproject.org/&quot;&gt;Pulp&lt;/a&gt; as a storage for Copr build results. It is now time to realize the
investment.&lt;/p&gt;

&lt;h2 id=&quot;status-quo&quot;&gt;Status Quo&lt;/h2&gt;

&lt;p&gt;At this very moment, Copr hosts ~35k projects from ~8k Fedora users. The data
consumption sits around ~37TB with only ~3TB of free disk space. With a very few
exceptions, everything is stored in our “Copr backend” storage.&lt;/p&gt;

&lt;p&gt;Our current storage is a RAID array of block devices with the Ext4
filesystem. For various reasons, AWS block devices larger than 16TB are either
hard to maintain or expensive. We plan to solve this problem by migrating to an
S3 object storage and Pulp, which is a mature and &lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/DataDurability.html&quot;&gt;durable-by-default&lt;/a&gt;
solution for managing software repositories.&lt;/p&gt;

&lt;p&gt;We have already migrated all Copr team projects to Pulp to dogfood the
integration on ourselves, and we have already migrated &lt;a href=&quot;https://copr.fedorainfracloud.org/coprs/xsnrg/indi-3rdparty-bleeding/&quot;&gt;one large project&lt;/a&gt;
to avoid running out of disk space.&lt;/p&gt;

&lt;h2 id=&quot;the-goal&quot;&gt;The Goal&lt;/h2&gt;

&lt;p&gt;Our goal is to stop using the current “Copr backend” storage for all new
projects and migrate all existing project results to Pulp.&lt;/p&gt;

&lt;h2 id=&quot;impact-on-users&quot;&gt;Impact On Users&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;No change to your workflows should be needed.&lt;/li&gt;
  &lt;li&gt;Copr repositories enabled on user machines should continue working.&lt;/li&gt;
  &lt;li&gt;While your projects are being migrated, all your builds and actions will be
stuck in the “pending” state until the migration is finished.&lt;/li&gt;
  &lt;li&gt;After the migration of your projects is finished, you shouldn’t notice any
difference from the status quo.&lt;/li&gt;
  &lt;li&gt;For technical reasons, we won’t notify users directly that their projects are
about to be migrated. Please see the &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1VNhH10UbisuUvS4xaZGXGClpBhjYODpxEdsTC7p4vzk/&quot;&gt;Pulp Migration Schedule&lt;/a&gt; to
get a rough estimate of when you could be affected.&lt;/li&gt;
  &lt;li&gt;Every user should be affected for at most 24 hours.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To summarize, the change should be transparent to you, there are no UI/UX
changes, and your builds may be paused while your project is being migrated.&lt;/p&gt;

&lt;h2 id=&quot;our-plan&quot;&gt;Our Plan&lt;/h2&gt;

&lt;p&gt;For a detailed, step-by-step plan with dates and tracked progress, please see
the &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1VNhH10UbisuUvS4xaZGXGClpBhjYODpxEdsTC7p4vzk/&quot;&gt;Pulp Migration Schedule&lt;/a&gt;. Roughly, the plan is as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Set the default storage for all new &lt;a href=&quot;https://packit.dev/&quot;&gt;Packit&lt;/a&gt; projects to Pulp.&lt;/li&gt;
  &lt;li&gt;Set the default storage for all new projects to Pulp.&lt;/li&gt;
  &lt;li&gt;Migrate large projects (17 projects that are 100GB+).&lt;/li&gt;
  &lt;li&gt;Migrate all projects with a few exceptions.
    &lt;ul&gt;
      &lt;li&gt;Migration will be done in alphabetical order by owner name.&lt;/li&gt;
      &lt;li&gt;Exceptions: Packit projects, &lt;a href=&quot;https://copr.fedorainfracloud.org/coprs/g/rubygems/rubygems/&quot;&gt;@rubygems/rubygems&lt;/a&gt;,
 &lt;a href=&quot;https://copr.fedorainfracloud.org/coprs/g/copr/PyPI/&quot;&gt;@copr/PyPI&lt;/a&gt;, and &lt;a href=&quot;https://copr.fedorainfracloud.org/coprs/g/copr/PyPI3/&quot;&gt;@copr/PyPI3&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Migrate everything that remains.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;contact&quot;&gt;Contact&lt;/h2&gt;

&lt;p&gt;If you have any questions or worries regarding our migration of data to Pulp,
please let us know:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://matrix.to/#/#buildsys:fedoraproject.org&quot;&gt;#buildsys:fedoraproject.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://lists.fedoraproject.org/archives/list/copr-devel@lists.fedorahosted.org/&quot;&gt;copr-devel mailing list&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/fedora-copr/copr/discussions&quot;&gt;https://github.com/fedora-copr/copr/discussions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/migrating-copr-results-to-pulp</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/migrating-copr-results-to-pulp</guid>
        
        
      </item>
    
      <item>
        <title>Generating dataset from Fedora packaging guidelines</title>
        <author>Jiri Podivin</author>
        <description>&lt;p&gt;Recently we have published a &lt;a href=&quot;https://huggingface.co/datasets/fedora-copr/packaging-qna&quot;&gt;dataset&lt;/a&gt; of sourced questions and answers about Fedora packaging &lt;a href=&quot;https://docs.fedoraproject.org/en-US/packaging-guidelines/&quot;&gt;guidelines&lt;/a&gt; to Hugging Face. With the intention of using it to fine tune LLMs.&lt;/p&gt;

&lt;p&gt;In this blog post, I will describe the approach I have taken to generate it. Focusing on matters of prompt construction, and response constraints.&lt;/p&gt;

&lt;h2 id=&quot;question-of-data&quot;&gt;Question of data&lt;/h2&gt;

&lt;p&gt;Fine tuning large language models to behave according to user instruction,
requires a very specific structure of training data used. One can not simply
take various documents, no matter how well formed or sourced, and use them
as targets for training algorithm.&lt;/p&gt;

&lt;p&gt;Doing so, would simply teach the model to reproduce the very same documents,
in the best case. Far more probably, the model would produce many variations
of the documents given during training. Some are more plausible than others.
But all invariably useless.&lt;/p&gt;

&lt;p&gt;Instead we need to provide model with inputs and outputs in the same format
that will be present, and expected, during operation.
That is, conversation samples. With questions, as if asked by user, and answers,
grounded in source documents.&lt;/p&gt;

&lt;p&gt;The question remains, how to accomplish this at scale. Fine tuning, while cheaper
than a full training run, does require many thousands of samples for stable results. Creating samples manually, is simply not viable, even under very optimistic assumptions.&lt;/p&gt;

&lt;h2 id=&quot;leveraging-llms&quot;&gt;Leveraging LLMs&lt;/h2&gt;

&lt;p&gt;The answer lies in using LLMs. Language manipulation is what they were created for, after all.
Having LLM generate enough samples is a simple matter of writing a prompt, setting a loop and going for a cup of coffee, or going to sleep. That depends on how many samples you want and what kind of hardware is available.&lt;/p&gt;

&lt;p&gt;But how can we be sure that model will produce samples that are grounded in reality?
After all, if the model already possessed the required domain knowledge, what purpose would any fine tuning serve?&lt;/p&gt;

&lt;p&gt;There is also a much more straightforward issue of controlling and parsing the output. The model has to be called many times, and each time the output has to be transformed into a training sample. This process has to be as reliable as possible. Every call costs us money, or time, and we don’t have an infinite supply of either.&lt;/p&gt;

&lt;h3 id=&quot;grounding-the-llm&quot;&gt;Grounding the LLM&lt;/h3&gt;

&lt;p&gt;To ensure that samples produced are grounded in truth, we need to provide a trustworthy source for model to use when generating them. This simplifies the task considerably, as the model is now merely transforming one kind of text into another.&lt;/p&gt;

&lt;p&gt;With a well structured prompt, we can put strong emphasis on the source, lowering the chance of the model producing ungrounded samples considerably.&lt;/p&gt;

&lt;p&gt;System prompt bears the most weight here, priming the model to provide responses we need. Emphasis has to be placed on source of knowledge to be used, and on contents of the output.&lt;/p&gt;

&lt;p&gt;At the same time, restrictions are placed on what must &lt;strong&gt;not&lt;/strong&gt; be included in model responses. Otherwise we may end up with samples that are seemingly reasonable, but providing no domain knowledge.&lt;/p&gt;

&lt;p&gt;Providing an example is another way to improve the quality of the output.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;EXTRACTION_SYSTEM_PROMPT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
You are a meticulous AI assistant designed for high-precision information extraction.
Your primary function is to create specific, fact-based question-and-answer pairs directly from a provided document.

Your task is to adhere to the following strict principles:

1.  **Absolute Grounding:** Every answer you provide MUST be a direct, verbatim quote from the source document. Do not summarize, paraphrase, or infer information.
2.  **Question Specificity:** Questions must be specific and target concrete details (e.g., names, numbers, locations, reasons, processes, definitions). Avoid overly broad or ambiguous questions that could have multiple interpretations. Questions should target information that is unique to the document.
3.  **Self-Contained Questions:** A question should be understandable on its own, but the answer must only be verifiable by consulting the provided document.
4.  **No External Knowledge:** You must operate exclusively on the information within the document. Do not use any prior knowledge.
5.  **Exclude Metadata:** Do not generate questions about the document&apos;s own properties, such as its author, title, filename, publication date, or revision history. Focus exclusively on the subject matter content within the text.
6.  **Output Format:** Your response will be a single JSON object containing a list of Q&amp;amp;A pairs. Each pair will have three keys: &quot;question&quot;, &quot;answer&quot;, and &quot;question_topic&quot;.

Example of a GOOD question:
- &quot;What specific percentage of the budget was allocated to research and development in the final quarter?&quot;

Example of a BAD (too vague) question:
- &quot;What does the document say about the budget?&quot;
&quot;&quot;&quot;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The source document can be used as part of much less complex, user level, prompt.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;BASE_EXTRACTION_PROMPT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;

Attempt to create as many high quality question / answer pairs from following document as possible.
Multiple variants of the same question / answer pair are allowed. As long as the meaning remains unchanged

Document:
&apos;&apos;&apos;
{document}
&apos;&apos;&apos;
&quot;&quot;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These principles are generally applicable to use of LLMs in various scenarios. Although there may be subtle differences in effectiveness of various approaches to prompting between models, the basic idea of stating purpose, setting constraints and providing examples, remains largely unchallenged.&lt;/p&gt;

&lt;h3 id=&quot;structuring-model-output&quot;&gt;Structuring model output&lt;/h3&gt;

&lt;p&gt;Structured output provides an easy solution to the second problem.
It allows users to specify an exact format which the LLM output must follow. This feature has been supported by OpenAI for some time, and it has proliferated among self-hosted, FOSS inference providers, such as vLLM or llama.cpp.&lt;/p&gt;

&lt;p&gt;The format can be specified as a JSON schema. With pydantic, we can create a model, which will provide us with both schema specification, and validation.&lt;/p&gt;

&lt;p&gt;While the set of JSON features supported by different providers differs, and is never complete, it is generally sufficient for most purposes.&lt;/p&gt;

&lt;p&gt;We can specify type and various constraints on fields, such as length or range of values.&lt;/p&gt;

&lt;p&gt;For example, this model sets the structure of a single question/answer pair. This would be one sample in our dataset.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;QnAPair&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BaseModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Single Q/A pair with topic.&quot;&quot;&quot;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Question about contents of the document.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;answer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Answer to the question&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;question_topic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Topic of the question.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can also request multiple samples at the same time.
By asking for a list of objects we have already defined.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;QnAList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BaseModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;List of Q/A pairs.&quot;&quot;&quot;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;questions_and_answers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QnAPair&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;List of questions and answers about given document.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;min_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;document_topic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Topic of the document&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;but-we-need-more&quot;&gt;But we need more&lt;/h3&gt;

&lt;p&gt;It is very unlikely that a single pass through source document would produce all the samples we need. At very least, we are likely to fill the model context at some point.
Simply executing the same call repeatedly, could work. But it would be liable to produce multiple samples with almost, or completely, identical contents.&lt;/p&gt;

&lt;p&gt;In order to reach a reasonable number of samples, we need a way to consistently generate multiple variants of those we already have. And again, LLMs can be leveraged to give us exactly that.&lt;/p&gt;

&lt;p&gt;This task is much easier than the original one. Because it isn’t strictly necessary to get more varied answers. Provided that those we have are of sufficiently high quality.&lt;/p&gt;

&lt;p&gt;If we want our fine tuned model to be robust enough for deployment, it needs to be able to respond to a wide variety of &lt;strong&gt;questions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With the new format for model responses, we can ensure that we only get questions. Sparing some tokens.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;QuestionVariant&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BaseModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Variant of base question&quot;&quot;&quot;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Variant of an existing question.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;QuestionVariantList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BaseModel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;List of question variants.&quot;&quot;&quot;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;question_variants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QuestionVariant&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Field&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;List of question variants.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;min_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The prompt also needs adjustments. But established principles still apply here.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&lt;span class=&quot;n&quot;&gt;VARIATION_SYSTEM_PROMPT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
You are an AI assistant specializing in linguistics and question reformulation. Your task is to rephrase a given question in multiple ways while strictly preserving its original intent and meaning.

Follow these rules:
1.  **Preserve Core Intent:** All generated questions must request the exact same piece of information as the original. The answer to all variants should be identical to the answer of the original question.
2.  **Maintain Specificity:** Do not make the questions more general or vague. If the original asks for a percentage, the variants must also ask for a percentage.
3.  **Vary Phrasing and Structure:** Use synonyms, change the sentence structure (e.g., active to passive), and reorder clauses to create natural-sounding alternatives.
4.  **Output Format:** Your response will be a single JSON object containing a list of dictionaries. Each dictionary will have only one key: &quot;question&quot;.
&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;VARIATION_USER_PROMPT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
Here is the original question:
{question}

Please generate {n_variants} distinct variants of this question.
&quot;&quot;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;sourcing-the-questions&quot;&gt;Sourcing the questions&lt;/h3&gt;

&lt;p&gt;Before we can get started with generating the dataset, we should ensure that all samples we create can be tracked back to source.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;qna&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parsed_response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;questions_and_answers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;base_qna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;SourcedQnAPair&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;answer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;answer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;question_topic&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;qna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;question_topic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;document_topic&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parsed_response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;document_topic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This will help us with quality control. As we can later track down the exact source document used, and verify that information in the answer is indeed accurate.&lt;/p&gt;

&lt;h3 id=&quot;putting-it-all-together&quot;&gt;Putting it all together&lt;/h3&gt;

&lt;p&gt;With model handling both knowledge extraction and dataset augmentation, the task of building a large Q/A dataset becomes much more tractable.&lt;/p&gt;

&lt;p&gt;All that remains is putting these tasks into loops. First for iterating over all source documents, deriving base questions. Second for deriving new question variants.&lt;/p&gt;

&lt;p&gt;Depending on structure of source documents, and context size of the LLM, it may be prudent to split documents in sections. A number of heuristics can be employed to that end, starting with simple splitting by certain number sentences, or by section headings.&lt;/p&gt;

&lt;p&gt;In the case of Fedora Packaging guidelines, all documents are nicely formatted &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.adoc&lt;/code&gt; files, of limited &lt;a href=&quot;https://pagure.io/packaging-committee/blob/master/f/guidelines/modules/ROOT/pages&quot;&gt;size&lt;/a&gt;, and we can use them without change.&lt;/p&gt;

&lt;p&gt;Created questions and answers, all &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SourcedQnAPair&lt;/code&gt; objects supporting &lt;a href=&quot;https://docs.pydantic.dev/latest/concepts/serialization/#modelmodel_dump&quot;&gt;serialization&lt;/a&gt;, can be easily converted into a list of dictionaries, and finally into a Hugging Face dataset.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Dicts to dataset
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tqdm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tqdm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;final_qna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;row&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_dump&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;datasets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Shuffling is largely optional, and can be left on the consumer of the dataset to be applied before the dataset is split into training and testing subsets.&lt;/p&gt;

&lt;p&gt;Apart from publishing dataset on Hugging Face, we can save it locally, in any of the supported formats.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;fedora_qna.parquet&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;limitations&quot;&gt;Limitations&lt;/h2&gt;

&lt;p&gt;While this approach is certainly powerful and useful, it is not perfect.
LLMs, even when grounded with source documents and well crafted prompts, are capable of producing text without foundation in input.&lt;/p&gt;

&lt;p&gt;Even when this is not the case. Source documents ought to be checked. To verify that no private or sensitive information is present. Otherwise they may leak into newly created dataset and any models trained using it.&lt;/p&gt;

&lt;p&gt;Finally, and this is the most important limitation of all. Even the best dataset can not supplant deficient fine tuning procedures. Nor can it balance issues caused by a model that is just too small for the task.&lt;/p&gt;

&lt;p&gt;It is always necessary to consider all aspects of fine tuning and setting expectations accordingly.&lt;/p&gt;
</description>
        <pubDate>Mon, 06 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/data-from-packaging-guidelines</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/data-from-packaging-guidelines</guid>
        
        
      </item>
    
      <item>
        <title>Fedora Copr builders - September 2025</title>
        <author>Pavel Raiskup</author>
        <description></description>
        <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/farm-of-builders</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/farm-of-builders</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2025-08-28 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Thu, 28 Aug 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Log Detective dataset has been published</title>
        <author>Jiri Podivin</author>
        <description>&lt;p&gt;Since the start of Log Detective project, we have been gathering annotations for failed RPM builds
on our website www.logdetective.com.
Our intention was always to publish the collected data under open license[1] and use it to improve
experience of packagers across Fedora ecosystem.&lt;/p&gt;

&lt;p&gt;After gathering slightly over 1000 contributions we have published our dataset[2]
on the Hugging Face platform in a QnA format, to facilitate its use in fine tuning LLMs.&lt;/p&gt;

&lt;p&gt;In this post I’ll outline the steps taken to create the dataset, and ways the dataset can be used.&lt;/p&gt;

&lt;h2 id=&quot;from-annotations-to-dataset&quot;&gt;From annotations to dataset&lt;/h2&gt;

&lt;p&gt;Before uploading the data, it was necessary to preprocess gathered annotations.
Comments on some of the submitted logs were exceedingly short and lacking meaningful information.
While other records were corrupted. The full source of script used to transform annotations into dataset is present in
the dataset repository on Hugging Face, but here we can go over the most pertinent parts.&lt;/p&gt;

&lt;p&gt;Individual &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.json&lt;/code&gt; files containing annotations were converted into rows of pandas DataFrame to simplify queries and manipulation. Each of the rows contained the name and contents of the parsed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.json&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;For each of the entries, several utility columns were calculated to facilitate further work.&lt;/p&gt;

&lt;h3 id=&quot;sanitizing-dataset&quot;&gt;Sanitizing dataset&lt;/h3&gt;

&lt;p&gt;Original setup of our annotation interface was too permissive, so some submissions were
not suitable for use. As a remedy, several simple rules were applied to remove annotations
that were unsuitable for further work:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Descriptions of issues and fixes shorter than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10&lt;/code&gt; characters are not useful.&lt;/li&gt;
  &lt;li&gt;Submissions without annotated snippets are not useful.&lt;/li&gt;
  &lt;li&gt;Submissions with total length of snippet annotations shorter than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;10&lt;/code&gt; characters are not useful.&lt;/li&gt;
  &lt;li&gt;Submissions with snippets set to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt; are not useful.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the last rule covering annotations that were corrupted.&lt;/p&gt;

&lt;p&gt;Pandas library allows us to define filters as simple conditionals.
Turning the aforementioned rule list into straightforward code:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;almost_empty_fix = dataset[&quot;how_to_fix_len&quot;] &amp;lt; min_how_to_fix_len
almost_empty_reason = dataset[&quot;fail_reason_len&quot;] &amp;lt; min_fail_reason_len
almost_empty_snippet_annotations = (
    dataset[&quot;tot_snippet_annot_len&quot;] &amp;lt; min_total_snippet_annot_len
)
none_snippets = dataset[&quot;logs&quot;].apply(none_snippet)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;All conditionals can then be used as part of a single formula, to filter out all annotations that satisfy any of them.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sparse_annotation_criteria = (
    almost_empty_snippet_annotations
    | almost_empty_reason
    | almost_empty_fix
    | none_snippets
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Inversion of the result will give us indices of all annotations that satisfy our minimal requirements.&lt;/p&gt;

&lt;h3 id=&quot;splitting-the-into-subsets&quot;&gt;Splitting the into subsets&lt;/h3&gt;

&lt;p&gt;The dataset was then split into two constituent parts, training and test, this is important for future use
in training of LLMs. The dataset was randomly shuffled before the split, to prevent bias in order of annotations.&lt;/p&gt;

&lt;p&gt;The seed was set, for replicability, to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;42&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;def split_dataset(dataset: pd.DataFrame, seed: int):
    &quot;&quot;&quot;Splits dataset into training and evaluation subset&quot;&quot;&quot;
    split = dataset.shape[0] // 5
    dataset = dataset.sample(frac=1.0, random_state=seed)
    train_dataset, test_dataset = dataset[split:], dataset[:split]

    return train_dataset, test_dataset
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;transformation-into-questionanswer-pairs&quot;&gt;Transformation into question/answer pairs&lt;/h3&gt;

&lt;p&gt;Training of models based on artificial neural networks, Large Language Models or otherwise,
involves formulating your data in form of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x -&amp;gt; y&lt;/code&gt; where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; is your expected input
and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt; is your expected output.&lt;/p&gt;

&lt;p&gt;Most obvious use of dataset, would be to fine tune an existing instruction tuned model, imbuing it with information about RPM build failures. Instruction tuned models, such as ibm-granite/granite-3.3-8b-instruct [3], are trained with data in a chat form. These often come in a form of answers and questions, or instructions and actions performed.&lt;/p&gt;

&lt;p&gt;If we want to appropriately leverage existing capabilities of the model, we must follow the same
form, or risk catastrophic forgetting.[4] This means that we need to transform our annotations into pairs of questions and answers. Prompts used by Log Detective [5] can serve as bases for these.&lt;/p&gt;

&lt;p&gt;Each of our annotations consists of explanation, proposed resolution and one or more log snippet annotations. We can turn each of the snippet annotations into it’s own question/answer pair, and create one more for the resolution and explanation.&lt;/p&gt;

&lt;p&gt;This means that our dataset will, effectively, contain more entries than we have annotated logs.&lt;/p&gt;

&lt;h3 id=&quot;uploading&quot;&gt;Uploading&lt;/h3&gt;

&lt;p&gt;Both training and test subsets are combined into a single object and uploaded to Hugging Face.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dataset = {
    &quot;train&quot;: datasets.Dataset.from_list(train_dataset),
    &quot;test&quot;: datasets.Dataset.from_list(test_dataset),
}

dataset = datasets.DatasetDict(dataset)

dataset.push_to_hub(repo_id=repo_id, private=True, token=hf_token)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Keeping the upload initially private is a good idea, unless you are absolutely certain about correctness of your data sanitation and formatting.&lt;/p&gt;

&lt;h2 id=&quot;how-to-use-the-dataset&quot;&gt;How to use the dataset&lt;/h2&gt;

&lt;p&gt;To use the new dataset, you can simply clone the repo using git, or access it using Hugging Face datasets library:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;from datasets import load_dataset

ds = load_dataset(&quot;fedora-copr/log_detective_qna&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;[1] https://cdla.dev/permissive-2-0/&lt;/p&gt;

&lt;p&gt;[2] https://huggingface.co/datasets/fedora-copr/log_detective_qna&lt;/p&gt;

&lt;p&gt;[3] https://huggingface.co/ibm-granite/granite-3.3-8b-instruct&lt;/p&gt;

&lt;p&gt;[4] https://en.wikipedia.org/wiki/Catastrophic_interference&lt;/p&gt;

&lt;p&gt;[5] https://github.com/fedora-copr/logdetective/blob/main/logdetective/prompts.yml&lt;/p&gt;
</description>
        <pubDate>Sat, 05 Jul 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/logdetective-dataset-published</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/logdetective-dataset-published</guid>
        
        
      </item>
    
      <item>
        <title>Copr builders powered by bootc</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Tue, 17 Jun 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-builders-powered-by-bootc</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-builders-powered-by-bootc</guid>
        
        
      </item>
    
      <item>
        <title>Log Detective Model Analysis</title>
        <author>Tomas Tomecek</author>
        <description>&lt;p&gt;Before we start with the comparison, let’s acknowledge a big milestone in the Log Detective project. Our tool now comments on Gitlab merge requests for failed CentOS Stream builds [1]. &lt;a href=&quot;https://gitlab.com/redhat/centos-stream/rpms/gimp/-/merge_requests/9#note_2514178124&quot;&gt;Here&lt;/a&gt; is an example of such a comment. I picked the first one from the list and in this case, the explanation is just wrong. However, upon examining the “Details”, which displays log lines annotated by the drain3 library, you can identify the root cause - files are not present on the expected paths.&lt;/p&gt;

&lt;p&gt;Back to the comparison. We have been using the &lt;em&gt;Mistral 0.2 7B&lt;/em&gt; model in Log Detective for quite some time. It was updated last time in December 2023. 1.5 years is a long time in the development of LLMs. Therefore we decided to compare how Mistral is doing against:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Gemma 3 12B&lt;/li&gt;
  &lt;li&gt;Gemini 2.5 flash&lt;/li&gt;
  &lt;li&gt;Granite 3.3 8B&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I published all the results in this Github repo: &lt;a href=&quot;https://github.com/TomasTomecek/logdetective-model-battleground&quot;&gt;TomasTomecek/logdetective-model-battleground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was my first time doing such an analysis. I collected 5 different build failures and compared the results on the same set of logs from different models. I haven’t done this in one session — it took me more than a week. I was also updating the code and configuration along the way. Unfortunately, it caused some of the results to be degraded. Please take these results with a grain of salt.&lt;/p&gt;

&lt;p&gt;We will use a failed build of &lt;em&gt;python-typing-extensions&lt;/em&gt; in this blog post. The package build runs a test suite in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%check&lt;/code&gt; section and this test suite has failed like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FAILED (failures=20, errors=12, skipped=15)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s see how these four models processed this build log. Brace yourself for a lot of text. My commentary follows these results.&lt;/p&gt;

&lt;h2 id=&quot;granite&quot;&gt;Granite&lt;/h2&gt;
&lt;p&gt;The provided snippets cover various aspects of an RPM build process, including testing failures, assertion errors, build completion, and a build error. Here’s a breakdown of each snippet:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Dictionary Analysis&lt;/strong&gt;: A Python dictionary named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_dict&lt;/code&gt; is defined with three key-value pairs. ‘label’ is associated with a string data type, while ‘x’ and ‘y’ are associated with integer data types. There are no errors or additional context mentioned.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Test Failure&lt;/strong&gt;: The test &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_regular_extra_items_legacy&lt;/code&gt; from the test suite &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_typing_extensions.TypedDictTests&lt;/code&gt; failed. The failure occurred at line 1844, but no further details about the cause of the failure are provided.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;AssertionError&lt;/strong&gt;: The failure in test &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_regular_extra_items_legacy&lt;/code&gt; resulted in an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AssertionError&lt;/code&gt; at line 1846, specifically due to a mismatch between expected and actual frozensets containing ‘log_path’ and ‘log_level’. The actual cause and location of this discrepancy require further investigation.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Multiple Test Failures&lt;/strong&gt;: The build process encountered 20 failures, 12 errors, and 15 skipped tests, as indicated by the ‘FAILED’ status with failure statistics at line 1877. This suggests various issues need addressing in the test suite.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Build Check Failure&lt;/strong&gt;: The build process failed during the ‘%check’ stage at line 1879, with the error message “Bad exit status from /var/tmp/rpm-tmp.5QvbcS (%check)”. This indicates a non-zero exit status from a script or command executed during the build process.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Build Success&lt;/strong&gt;: The build for ‘python-typing-extensions-4.13.2-1.fc43.src.rpm’ was completed successfully at line 1882, as signified by the build status code (1882,).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Configuration Error&lt;/strong&gt;: The build failed in the configuration stage for ‘fedora-rawhide-x86_64’ platform at line 1888, with the error message ‘ERROR: Exception(…)’. This suggests an unhandled exception occurred during this specific build attempt.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Command Failure&lt;/strong&gt;: An error occurred when executing the build command for ‘python-typing-extensions’ on Fedora Rawhide for the x86_64 architecture at line 1894. The command failed, and the build environment setup details are provided for context.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Copr Build Error&lt;/strong&gt;: The copr build for the package failed without providing further information at line 1897. This indicates that the build process hosted on Copr encountered an issue, resulting in a failure.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In summary, these snippets highlight multiple issues within the RPM build process, including test failures, assertion errors, build check failures, configuration errors, and a copr build error. Each snippet requires further investigation to pinpoint the root causes and develop appropriate solutions.&lt;/p&gt;

&lt;h2 id=&quot;mistral&quot;&gt;Mistral&lt;/h2&gt;
&lt;p&gt;The provided RPM build log snippets indicate several errors and failures during the build process of the python-typing-extensions package on the Fedora rawhide platform. Here’s a summary of the issues:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Testing phase failures and errors:
    &lt;ul&gt;
      &lt;li&gt;Multiple tests (both failures and errors) were encountered during the testing phase, making the testing process unsuccessful.&lt;/li&gt;
      &lt;li&gt;The specific tests that failed and the reasons for their failure are not provided in the log snippets.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Packaging issues:
    &lt;ul&gt;
      &lt;li&gt;The ‘rpmbuild’ command execution inside the container environment using systemd-nspawn failed, causing the build to fail. No information about the nature of the error is provided in the log snippets.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Copr build error:
    &lt;ul&gt;
      &lt;li&gt;The build process in the Copr repository also failed, but no error message is given in the provided log snippets.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To diagnose the issue, it is recommended to inspect the system logs and the RPM build output for any error messages that may have been generated during the build process. It’s also important to check if there are any updates or changes to the dependencies and the python-typing-extensions package itself that could cause these issues. Additionally, trying to build the package on a different platform or using a different build environment might help identify if the issue is specific to the Fedora rawhide platform or the systemd-nspawn containerization.&lt;/p&gt;

&lt;h2 id=&quot;gemma&quot;&gt;Gemma&lt;/h2&gt;
&lt;p&gt;The build of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python-typing-extensions&lt;/code&gt; package failed due to a series of test failures within the RPM build process. The core issue isn’t immediately clear from a single error message, but the numerous &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AssertionError&lt;/code&gt; exceptions across multiple test suites (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_stock_annotations&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_extra_items_class_arg&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_implicit_any_inheritance&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_regular_extra_items_legacy&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_total&lt;/code&gt;) strongly suggest a problem with the package’s type hinting and/or the interaction between different typed dict features. The specific assertion failures indicate discrepancies in expected versus actual set contents, pointing to potential logic errors in how type annotations are being handled or inherited. The final error points to a failing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%check&lt;/code&gt; script within the RPM build, which is triggered by these test failures.&lt;/p&gt;

&lt;p&gt;The root cause seems to lie within the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;typing_extensions&lt;/code&gt; codebase itself, rather than the build environment, although the complex setup of the mock chroot environment might expose these issues. The failure is likely related to a change in how type hints are processed or handled in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;typing_extensions&lt;/code&gt; library, which is then exposed by the tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most practical solution is to investigate the failing tests in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;typing_extensions&lt;/code&gt; source code (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/test_typing_extensions.py&lt;/code&gt;) and identify the underlying logic errors that are causing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AssertionError&lt;/code&gt;s.  Specifically, focus on the tests mentioned in the logs (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_stock_annotations&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_extra_items_class_arg&lt;/code&gt;, etc.) to understand the expected behavior versus the actual behavior.  Debugging the code, potentially with a local build and debugging environment, would be necessary to pinpoint the cause.  A fix might involve adjusting the expected values in the assertions or modifying the code under test to align with the intended behavior. After the underlying code is fixed, a new build should be triggered to confirm the fix resolves the test failures.&lt;/p&gt;

&lt;h2 id=&quot;gemini&quot;&gt;Gemini&lt;/h2&gt;
&lt;p&gt;Based on the log snippets, a failure occurred during the package build process. The build failed specifically during the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%check&lt;/code&gt; stage, which is where the package’s test suite is run. Multiple tests failed (indicated by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FAIL:&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AssertionError&lt;/code&gt; entries), resulting in the test suite reporting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FAILED (failures=20, errors=12, skipped=15)&lt;/code&gt;. This test failure caused the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%check&lt;/code&gt; stage script to exit with a bad status, leading to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RPM build errors: error: Bad exit status&lt;/code&gt; and the ultimate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Copr build error: Build failed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The recommended solution is to investigate the specific test failures reported in the log (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_stock_annotations&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_implicit_any_inheritance&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_regular_extra_items_legacy&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test_total&lt;/code&gt;) and fix the underlying code or test logic issues that are causing them to fail. Once the tests pass successfully, the build should complete without the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%check&lt;/code&gt; stage failure.&lt;/p&gt;

&lt;h2 id=&quot;commentary&quot;&gt;Commentary&lt;/h2&gt;
&lt;p&gt;As you can see, the results are different. One feedback we are already hearing from engineers is that shorter is better. LLMs can be pretty verbose, so even when we instruct the model to be concise, quite often it’s not.&lt;/p&gt;

&lt;p&gt;We’ll start with Gemini. The comment from this model is just perfect. Short, straight to the point, no extra sentences. If I asked a senior engineer for help, this is the message I would want to see.
Gemma is also pretty good though it lacks confidence, especially when you compare it to Gemini. They are similar but Gemma produced more words, lacks confidence, and clearly doesn’t understand the structure of the RPM build process.&lt;/p&gt;

&lt;p&gt;Let’s continue with Mistral. It reads pretty poor when compared to Gemma, and especially Gemini. It completely lacks details (names of tests), contains irrelevant information, and therefore provides very little value to an engineer. I would absolutely need to see the logs to understand what went wrong.&lt;/p&gt;

&lt;p&gt;Granite [2] results are interesting. They read as a summary of the log, which makes sense because that’s how we structure the final prompt. I can see value in this type of output, but at the same time it’s not the correct answer - telling me why the build has failed in a few clear sentences.&lt;/p&gt;

&lt;p&gt;Based on this analysis it’s clear to me that we need to upgrade our model. Soon!&lt;/p&gt;

&lt;p&gt;[1] This applies to RHEL as well since the builds are 99% identical, hence we decided to pick CS builds because they are completely open&lt;br /&gt;
[2] I also added results from Granite 3.1 in the Github repo, though unfortunately they are very poor compared to all the other models&lt;/p&gt;

</description>
        <pubDate>Mon, 26 May 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/logdetective-model-analysis</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/logdetective-model-analysis</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2025-03-26 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for March 2025</title>
        <author>Jiří Kyjovský</author>
        <description>
</description>
        <pubDate>Wed, 05 Mar 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-march-2025</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-march-2025</guid>
        
        
      </item>
    
      <item>
        <title>Log Detective can now explain build log failures</title>
        <author>Tomas Tomecek</author>
        <description>&lt;p&gt;We’re thrilled to announce the new functionality of &lt;a href=&quot;https://logdetective.com/&quot;&gt;Log
Detective&lt;/a&gt;. The service can now explain in detail a
build log of your choice. Click on
&lt;a href=&quot;https://logdetective.com/explain&quot;&gt;logdetective.com/explain&lt;/a&gt;, paste a
link to your log, wait one minute and you should see a description of important
lines with the overall explanation.&lt;/p&gt;

&lt;h2 id=&quot;disclaimer&quot;&gt;Disclaimer&lt;/h2&gt;

&lt;p&gt;This is our initial prototype of this functionality. We appreciate all your
feedback. Please be patient, as there will be service disruptions, instability,
and usability issues.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;1️⃣ The service can process only one request at a time.&lt;/strong&gt; We understand this
is very limiting, especially when multiple people will use the service at the
same time. You may need to wait several minutes to get a reply in such a case.
We are thankful to the Fedora Project for sponsoring our infrastructure needs.
Please, reach out to us if you have experience in running LLM inference in
parallel on a single GPU. We will scale the service later based on the demand
in usage.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;🌍 We are using a general-purpose LLM in the background.&lt;/strong&gt; The data we are
collecting are not being utilized just yet in the answers. We still don’t have
enough data to fine-tune a model that would provide high-quality answers. Our
goal for 2025 is to research and train such a model.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;🔬 The functionality is highly experimental.&lt;/strong&gt; Our team has worked
diligently to deliver this prototype. However, this represents only a fraction
of the service’s full potential. We eagerly welcome all feedback and would
greatly appreciate it if you could report any unusual behavior, errors, or
tracebacks that you encounter.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;step-by-step-guide&quot;&gt;Step-by-step guide&lt;/h2&gt;

&lt;p&gt;The new functionality is available under “Explain logs”.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://logdetective.com/explain&quot;&gt;https://logdetective.com/explain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/logdetective-explain.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The service only accepts links to raw logs; all of these are always available
for Copr and Koji builds.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/logdetective-explain-with-link.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Upon submission, Log Detective retrieves the log file and initiates the
processing phase. During this process, the service interacts with the
underlying LLM through multiple requests. It usually takes one minute to return
an answer.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/logdetective-explain-result.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The result is split into two sections:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;The left side contains an overall explanation for the whole log.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Log Detective uses &lt;a href=&quot;https://github.com/logpai/Drain3&quot;&gt;Drain&lt;/a&gt; to select
important lines from the log. You can see descriptions of them on the right
side after you expand them by clicking on a line.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our example here, we can see the build failed because a required library
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libtree-sitter.so.0.23()(64bit)&lt;/code&gt; is not available and cannot be installed. Log
Detective attempts to explain this issue, though it fails with the solution:
it’s not as easy as just installing the library with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnf&lt;/code&gt;. There is definitely
room for improvement in the final answer.&lt;/p&gt;

&lt;p&gt;This is where you can help. If you are not satisfied with the answer and know a
better one, head over to Log Detective website homepage, enter the log link and
annotate it for us. Once we fine-tune our own model, the service can provide
much better explanations thanks to you.&lt;/p&gt;

&lt;p&gt;You can reach us at the Fedora Copr build tools discussion Matrix channel: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#buildsys:fedoraproject.org&lt;/code&gt;.
Please open issues in: &lt;a href=&quot;https://github.com/fedora-copr/logdetective-website/issues/new/choose&quot;&gt;github.com/fedora-copr/logdetective-website/issues/new/choose&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/logdetective-explain</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/logdetective-explain</guid>
        
        
      </item>
    
      <item>
        <title>CPT - look back at 2024</title>
        <author>Miroslav Suchý</author>
        <description>&lt;p&gt;Let me sum up what the Community Packaging Team (CPT) did during 2024:&lt;/p&gt;

&lt;h2 id=&quot;copr&quot;&gt;Copr&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Most of our focus is on Copr build system. These are notable features and improvements we did in Copr:&lt;/li&gt;
  &lt;li&gt;IBM allowed us to use eighteen s390x machines for Fedora’s Copr. We added it to pool of builders.&lt;/li&gt;
  &lt;li&gt;Pavel finalized the “&lt;a href=&quot;https://docs.copr.fedorainfracloud.org/user_documentation/powerful_builders.html&quot;&gt;high-performance s390x builders&lt;/a&gt;” in Fedora’s Copr, which can be enabled as an opt-in. You can use this feature for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x86_64&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aarch64&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s390x&lt;/code&gt; architectures now. As of today several projects use this feature - that includes projects that build kernel, chromium, QT, texlive or AI packages.&lt;/li&gt;
  &lt;li&gt;At the February, we started working on &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/2533&quot;&gt;integrating Pulp into Copr&lt;/a&gt; (&lt;a href=&quot;https://pavel.raiskup.cz/blog/copr-and-pulp-content-hosting.html&quot;&gt;blogpost&lt;/a&gt;)
As of today, a project can be configured to use either the old backend or Pulp backend. We plan to dogfood this feature in December and migrate some of our repositories to Pulp. In January 2025 we plan to make it publicly available as opt-in for early testers (with a documented set of features that still does not work). Here is an example of a project that stores results in Pulp: https://copr.fedorainfracloud.org/coprs/g/copr/pulp-test/ You can try it live.&lt;/li&gt;
  &lt;li&gt;Jakub updated the Copr &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/screenshots_tutorial.html&quot;&gt;screenshot tutorial&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Jirka fixed a performance issue caused by a Power9 VM spawning issues in OSUOSL OpenStack&lt;/li&gt;
  &lt;li&gt;We had another round of discussion with TestingFarm and CKI about sharing the code that manages workers (short lived VMs).&lt;/li&gt;
  &lt;li&gt;Jakub created &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/video_tutorial.html#video-tutorial&quot;&gt;a video tutorial documentation page for Copr&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We wrote two articles for Fedora Magazine “4 cool new projects to try in Copr”: one in &lt;a href=&quot;https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-march-2024/&quot;&gt;March&lt;/a&gt; and second in &lt;a href=&quot;https://fedoramagazine.org/four-cool-new-projects-to-try-in-copr-for-october-2024/&quot;&gt;October&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We did four releases of Copr including these features:
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://frostyx.cz/posts/ssh-access-to-copr-builders&quot;&gt;SSH access to Copr builders&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://pavel.raiskup.cz/blog/custom-copr-builders.html&quot;&gt;Ability to use your own dedicated builders&lt;/a&gt; - no one used this so far.&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://fedora-copr.github.io/posts/flask-restx-migration&quot;&gt;Self documenting API using RestX&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Jakub wrote a blogpost describing to new contributors &lt;a href=&quot;https://frostyx.cz/posts/do-you-want-to-contribute-to-copr&quot;&gt;how they can start contributing&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Pavel wrote about our &lt;a href=&quot;https://fedora-copr.github.io/posts/cleanup-rawhide-builds&quot;&gt;new policy for rolling chroots&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jakub wrote down &lt;a href=&quot;https://frostyx.cz/posts/copr-modularity-the-end-of-an-era&quot;&gt;the plan of how we are going to EOL Modularity in Copr&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jakub started to investigate &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/2894&quot;&gt;an issue with prolonging RPM GPG keys&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We worked on lots of issues with Copr’s storage as current Copr storage usage is 33TB and weekly incremental diff is about 4TB.&lt;/li&gt;
  &lt;li&gt;We worked on [expired GPG keys issue](https://github.com/fedora-copr/copr/issues/2894#issuecomment-2454539349] that resulted in subsequent work in DNF and &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/Dnf5ExpiredPGPKeys&quot;&gt;Fedora Change proposal&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Copr built 1,640,000 builds during the whole year. That is about 3 builds every minute.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;fedora&quot;&gt;Fedora&lt;/h2&gt;

&lt;p&gt;Some of our side works has notable impact on Fedora Linux:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pavel and Evan (from DNF team) worked on Fedora Change &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/BuildWithDNF5&quot;&gt;Build Fedora with DNF 5&lt;/a&gt; - Fedora’s Koji started using DNF5 as base package manager during builds.&lt;/li&gt;
  &lt;li&gt;Miroslav cleaned 30k AMIs and 30k snapshots from Fedora’s AWS account and drafted next steps in cleanup of old stuff there.&lt;/li&gt;
  &lt;li&gt;Miroslav tagged all Fedora’s GA images in AWS (in all regions) with proper tag.&lt;/li&gt;
  &lt;li&gt;Jakub made several improvements to &lt;a href=&quot;https://docs.pagure.org/fedora-sponsors/&quot;&gt;the Fedora Packager Sponsors&lt;/a&gt; page.&lt;/li&gt;
  &lt;li&gt;Miroslav altered his &lt;a href=&quot;https://lists.fedoraproject.org/archives/list/infrastructure@lists.fedoraproject.org/message/I353ULYH6GPWLWO47PDQZJDBQ4M7XEBV/&quot;&gt;regular emails about Fedora’s cloud spending and resource usage&lt;/a&gt; to show dollars spent (believe or not, until now no one had a clue).&lt;/li&gt;
  &lt;li&gt;Jakub helped the Pulp team to package client tools for Fedora.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;spdx&quot;&gt;SPDX&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Miroslav continued working on &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_4&quot;&gt;SPDX Change&lt;/a&gt;:&lt;/li&gt;
  &lt;li&gt;We started the year with 60 % of Fedora packages converted to SPDX (out of 30067 license tags). And we closed the year with 99% tags converted.&lt;/li&gt;
  &lt;li&gt;Miroslav added 98 new licenses to fedora-license-data (with great help of Richard Fontana).&lt;/li&gt;
  &lt;li&gt;Miroslav added 70 new licenses to upstream project SPDX.org (with great help of Jilayne Lovejoy).&lt;/li&gt;
  &lt;li&gt;Miroslav made about 450 PR for Fedora packages correcting the License tags.&lt;/li&gt;
  &lt;li&gt;Jakub created &lt;a href=&quot;https://github.com/FrostyX/fedora-licensecheck-service&quot;&gt;a proof of concept&lt;/a&gt; for continuous license validation In case we need CI for licenses.&lt;/li&gt;
  &lt;li&gt;Miroslav did package reviews for &lt;a href=&quot;https://src.fedoraproject.org/rpms/scancode-toolkit&quot;&gt;scancode-toolkit&lt;/a&gt; and its dependencies (a lot of them).&lt;/li&gt;
  &lt;li&gt;Miroslav created script and gitlab action that produces &lt;a href=&quot;https://gitlab.com/fedora/legal/fedora-license-data#artifact&quot;&gt;License policy&lt;/a&gt; for Scancode Toolkit from Fedora’s data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/spdx-burndown.png&quot; alt=&quot;SPDX burndown chart&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;released-sw&quot;&gt;Released SW&lt;/h2&gt;

&lt;p&gt;Beside Copr, we maintain several project and this year we did these notable releases:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pavel did six releases of Mock and nine releases of Mock core configs. And configured Mock to use TestingFarm for CI. Notable new feature of Mock added this year:
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://rpm-software-management.github.io/mock/feature-hermetic-builds&quot;&gt;Hermetic builds&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Jakub did three releases of &lt;a href=&quot;https://github.com/rpm-software-management/tito&quot;&gt;Tito&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jakub created a new project &lt;a href=&quot;https://github.com/rpm-software-management/fedora-distro-aliases&quot;&gt;fedora-distro-aliases&lt;/a&gt; and packaged it for Fedora, This is shared code by several projects. Inspired by this, Dan Cermak from SUSE created &lt;a href=&quot;https://github.com/rpm-software-management/opensuse-distro-aliases&quot;&gt;opensuse-distro-aliases&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Pavel did new releases for &lt;a href=&quot;https://github.com/praiskup/resalloc/&quot;&gt;resalloc&lt;/a&gt; (v5.2 and v5.3), &lt;a href=&quot;https://github.com/praiskup/resalloc-aws&quot;&gt;resalloc-aws&lt;/a&gt;, &lt;a href=&quot;https://github.com/praiskup/resalloc-ibm-cloud&quot;&gt;resalloc-ibm-cloud&lt;/a&gt; and &lt;a href=&quot;https://github.com/praiskup/resalloc-openstack&quot;&gt;resalloc-openstack&lt;/a&gt;. Overall stability and convenience fixes, making the “agent spawner” stable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;logdetective&quot;&gt;Logdetective&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;We launched https://logdetective.com/ website - and started working on AI tool that will tell you why the build fails and give you a hint on how to fix the failing build.&lt;/li&gt;
  &lt;li&gt;The project lives at &lt;a href=&quot;https://fedora-copr.github.io/posts/log-detective&quot;&gt;https://fedora-copr.github.io/posts/log-detective&lt;/a&gt; .&lt;/li&gt;
  &lt;li&gt;We investigated usage of logjuicer, but then found drain3 as a better tool&lt;/li&gt;
  &lt;li&gt;In parallel to that we are collecting our own collection that we plan to use as foundation to our own model. Likely using InspectLab.&lt;/li&gt;
  &lt;li&gt;We packaged a logdetective command line tool for Fedora. Including several AI related dependencies&lt;/li&gt;
  &lt;li&gt;Jiri Podivin delivered &lt;a href=&quot;https://youtu.be/7q0LFIpdDgI?si=CFwxbpIINj0YY4OI&quot;&gt;a talk at LinuxDays&lt;/a&gt; (in Czech).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;other&quot;&gt;Other&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Jakub published a blogpost and a video about &lt;a href=&quot;https://frostyx.cz/posts/lsp-for-vim-boomers&quot;&gt;Vim LSP (Language Server Protocol)&lt;/a&gt; created on day of learning.&lt;/li&gt;
  &lt;li&gt;Jakub added &lt;a href=&quot;http://frostyx.cz/posts/ruff-my-dirty-code&quot;&gt;vcs-diff-lint support for Ruff&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-can-you-expect-from-us-in-2025&quot;&gt;What can you expect from us in 2025?&lt;/h2&gt;

&lt;p&gt;In a few days - maybe still in 2024 - Pavel wants to release a new version of Mock that will have a nice feature &lt;a href=&quot;https://github.com/rpm-software-management/mock/pull/1489&quot;&gt;Generate and use OCI images for buildroot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can check our &lt;a href=&quot;https://github.com/orgs/fedora-copr/projects/1/views/1&quot;&gt;Kanban board&lt;/a&gt; and check the column “in 3 months”. Notably we will work on DNF5 plugin support and design of EPEL10 chroots in Mock.&lt;/p&gt;

&lt;p&gt;As noted above we plan to allow as opt-in migration of projects to Pulp backend. This feature has no direct impact on users, but significantly ease our maintenance.&lt;/p&gt;

&lt;p&gt;If you want to affect what else we do in 2025 you can check our &lt;a href=&quot;https://github.com/orgs/fedora-copr/projects/1/views/5?filterQuery=status%3A%22In+2+years%22&quot;&gt;backlog&lt;/a&gt; and cast your vote (use emoticon for comment #0) or add a comment on how much time will save the feature if implemented. And we will choose the card that will have biggest impact.&lt;/p&gt;
</description>
        <pubDate>Wed, 11 Dec 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/look-back-2024</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/look-back-2024</guid>
        
        
      </item>
    
      <item>
        <title>Copr Modularity, the End of an Era</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Wed, 23 Oct 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-modularity-the-end-of-an-era</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-modularity-the-end-of-an-era</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in Copr for October 2024</title>
        <author>Jiří Kyjovský</author>
        <description>
</description>
        <pubDate>Mon, 21 Oct 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-october-2024</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-october-2024</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2024-10-03 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Thu, 03 Oct 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Browse Copr projects from Ulauncher</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Tue, 10 Sep 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/browse-copr-projects-from-ulauncher</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/browse-copr-projects-from-ulauncher</guid>
        
        
      </item>
    
      <item>
        <title>Reviewing annotations in Log Detective</title>
        <author>Tomas Tomecek</author>
        <description>&lt;p&gt;You may have heard of our &lt;a href=&quot;https://logdetective.com/&quot;&gt;Log Detective&lt;/a&gt; project.
We want to use AI to process your logs of failed builds. The tool tells you
where the problem is and how to fix it: you can try this today locally on your
laptop using the &lt;a href=&quot;https://github.com/fedora-copr/logdetective&quot;&gt;logdetective CLI
tool&lt;/a&gt;. In order to provide the
best answers in the future, we need to collect annotations of specific failures
for what went wrong and how to fix it.&lt;/p&gt;

&lt;p&gt;We appreciate everyone who submitted annotations already, thank you! It will
allow us to create a model with knowledge about building software, not just
RPMs, but also container images, test failures and various language specific
buildsystems. I envision that Log Detective will provide useful answers to most
of logs with build failures. Though we still have a long way getting there.&lt;/p&gt;

&lt;p&gt;So far, the annotations on the &lt;a href=&quot;https://logdetective.com/&quot;&gt;logdetective.com&lt;/a&gt;
site are read-only. Once submitted, there is no way to change them. Everyone
can download them, but that’s it.&lt;/p&gt;

&lt;p&gt;Starting in August 2024, we have now deployed a review interface on the Log
Detective website. This will allow anyone to rate (thumbs up and down) each
snippet and therefore curate collected data.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/logdetective-with-review.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Annotations combined with your rating will enable us create a high-quality data
set and increase Log Detective’s chance giving you solid advice.&lt;/p&gt;

&lt;p&gt;We’ve already done research on how to utilize this data inside Log Detective but
haven’t decided yet. Please stay tuned.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/logdetective-review-submit.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-do-i-review-snippets&quot;&gt;How do I review snippets?&lt;/h2&gt;

&lt;p&gt;Once you click the “Review logs” button at the top menu, you’ll reach the new
review interface. The instructions are on the left side.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/logdetective-review-instructions.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You are welcome to add more snippets if you can spot more information that
should be annotated. If an annotation is incorrect:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;You are welcome to edit the text and provide correct explanation&lt;/li&gt;
  &lt;li&gt;If the highlight is wrong, please downvote it and create a new annotation.&lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Fri, 16 Aug 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/logdetective-reviews</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/logdetective-reviews</guid>
        
        
      </item>
    
      <item>
        <title>Flask Restx Migration</title>
        <author></author>
        <description>&lt;h2 id=&quot;migration-from-flask-to-flask-restx-for-api-documentation&quot;&gt;Migration from Flask to Flask-RESTx for API documentation&lt;/h2&gt;

&lt;p&gt;Hey everyone! We recently decided to switch COPR’s API from Flask to &lt;a href=&quot;https://flask-restx.readthedocs.io/en/latest/&quot;&gt;Flask-RESTx&lt;/a&gt;, mainly to improve our API documentation since the documenting was non-existing.&lt;/p&gt;

&lt;p&gt;Why Flask-RESTx?&lt;/p&gt;

&lt;p&gt;First off, Flask-RESTx is an extension of Flask that makes building and documenting APIs easier. Here’s why we decided to use it:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It’s wrapper around Flask, so we could re-use much of our code-base for Flask.&lt;/li&gt;
  &lt;li&gt;It generates a cool, interactive &lt;a href=&quot;https://swagger.io/&quot;&gt;Swagger&lt;/a&gt; UI Documentation for COPR API.&lt;/li&gt;
  &lt;li&gt;Flask-RESTx supports OpenAPI 3.0.&lt;/li&gt;
  &lt;li&gt;It ensures the data API handles is valid and correctly formatted.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-it-looks-like&quot;&gt;What it looks like&lt;/h2&gt;

&lt;p&gt;So, what does this all look like in practice? Let me give you a sneak peek.&lt;/p&gt;

&lt;p&gt;Instead of static, hard-to-update documentation, you get an interactive interface where users can do these things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Explore Endpoints: Users can see all available API endpoints at a glance. Each endpoint is listed with a clear description of what it does.
&lt;img src=&quot;/assets/img/posts/endpoint-explore.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;View Details: Clicking on an endpoint reveals detailed information about the parameters it accepts and the responses it returns. This makes it super easy for you to know exactly how to use each endpoint.
&lt;img src=&quot;/assets/img/posts/endpoint-details.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Try It Out: One of the coolest features is the ability to test endpoints directly from the documentation. You can fill in parameters and see real-time responses, which helps them understand how everything works without writing a single line of code. 
Imagine this: you have an endpoint /api_3/builds that returns a list of builds. With Flask-RESTx, you will see this endpoint listed, click on it, and immediately know what parameters they can pass (like page or limit) and what the response will look like (a list of items). Plus, you can test it out right there to see it in action.
You can find the docs at &lt;a href=&quot;https://copr.fedorainfracloud.org/api_3/docs&quot;&gt;copr.fedorainfracloud.org/api_3/docs&lt;/a&gt;
&lt;img src=&quot;/assets/img/posts/try-it.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This interactive, user-friendly documentation not only makes life easier for your users but also cuts down on the support you need to provide.&lt;/p&gt;

&lt;h2 id=&quot;migration-experience&quot;&gt;Migration Experience&lt;/h2&gt;

&lt;p&gt;Switching to Flask-RESTx was pretty lenghty process, and here’s what happened:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We decided to migrate the endpoint gradually to test them in bulks in production.&lt;/li&gt;
  &lt;li&gt;There were some differences between Flask and Flask-RESTx, so there was a lot of compatibility related code to create bridge between those two APIs.&lt;/li&gt;
  &lt;li&gt;The Swagger documentation is taken from codebase which required a lot of coding to happen.&lt;/li&gt;
  &lt;li&gt;Flask-RESTx has deprecated parsers, telling us to use something like &lt;a href=&quot;https://docs.pydantic.dev/latest/&quot;&gt;pydantic&lt;/a&gt; or &lt;a href=&quot;https://marshmallow.readthedocs.io/en/stable/&quot;&gt;marshmallow&lt;/a&gt; to use validation fully. We decided to skip this and write our own parsers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Switching to Flask-RESTx was a great move for our project. The improved documentation made our API more accessible and user-friendly. If you’re using Flask and want to step up your API documentation game, I highly recommend giving Flask-RESTx a try. The benefits of automatic, interactive documentation and a cleaner codebase are definitely worth it.&lt;/p&gt;
</description>
        <pubDate>Tue, 09 Jul 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/flask-restx-migration</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/flask-restx-migration</guid>
        
        
      </item>
    
      <item>
        <title>Rawhide (aka &quot;rolling&quot;) chroot EOL policy in Copr</title>
        <author>Pavel Raiskup</author>
        <description>&lt;p&gt;In Fedora Copr, we strive to avoid wasting disk storage unnecessarily.  Disk
storage is the commodity that incurs the highest cloud costs.  For example, we
clean the build results for EOL chroots, we clean source builds (build results
that are imported into DistGit), we clean the DistGit lookaside cache, build
logs, uploaded files, failed build logs, and more.  Yet, we maintain &amp;gt;= 40TB of
data with RAID redundancy, volume snapshots, …&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://copr-be.cloud.fedoraproject.org/stats/distro.html&quot;&gt;Most of the Fedora Copr backend
storage&lt;/a&gt; is used for
holding the build results related to Fedora, with the largest consumer being the
Fedora Rawhide chroot.&lt;/p&gt;

&lt;p&gt;The “problem” with Fedora Rawhide as a “rolling” distribution is that it never
reaches EOL, unlike branched Fedora releases.  For example, take a look at the
data consumption for the old Fedora 35 in the previous link if you want to see
the difference.&lt;/p&gt;

&lt;p&gt;Yet, &lt;em&gt;most&lt;/em&gt; existing projects &lt;em&gt;do&lt;/em&gt; build for Rawhide – and until now, we did
not have a tool for performing any cleanups there.  Now we do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: &lt;strong&gt;Fedora Rawhide&lt;/strong&gt; is not the only target distro suffering from
this problem. There are other rolling distros we build for, where we’ll apply
the same policy, namely &lt;strong&gt;Fedora ELN&lt;/strong&gt;, &lt;strong&gt;openSUSE Tumbleweed&lt;/strong&gt;, and &lt;strong&gt;Mageia
Cauldron&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-rolling-policy-being-implemented&quot;&gt;The Rolling Policy Being Implemented&lt;/h2&gt;

&lt;p&gt;In &lt;a href=&quot;https://copr-be.cloud.fedoraproject.org/stats/distro.html&quot;&gt;this Copr issue&lt;/a&gt;,
we concluded that a viable option is to detect the liveness of particular
“rolling” chroots in Copr projects. If a chroot appears
lifeless/dead, we will disable it and schedule it for future removal.  According
to the initial proposed policy, Copr will mark a chroot as “lifeless” after a
6-month period of build inactivity. Such a “lifeless” chroot then enters another
6-month protection period where we keep the built results, but the corresponding
project administrators are informed about the future chroot data removal.  If the
chroot remains inactive during this period, the data will be removed.  The
cleanup process is extended if the chroot appears active, either by (a) a user
building a package in the chroot or (b) a user manually &lt;a href=&quot;https://copr.fedorainfracloud.org/user/repositories/&quot;&gt;prolonging the chroot
validity&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At the time of this announcement, there is no risk of data loss.  The
corresponding code is not yet deployed in production, and once it is, it will
take at least 12 months before we remove any data.  We just want to inform you
and prepare you to take action.&lt;/p&gt;

&lt;p&gt;The default limits (6+6 months) are chosen because Fedora’s default release
cycle is about 6 months.  During this time, something significant typically
happens that makes the built packages somewhat useless or non-installable
(e.g., library API changes, changes in generated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Provides&lt;/code&gt;, anything that makes
the package non-installable or non-working).  However, we understand that some
packages (e.g., data-only packages) could remain working for years without
needing a rebuild.  If this applies to you, try to estimate how much
inconvenience this change brings (the “manual chroot prolonging”), and let us
know.&lt;/p&gt;
</description>
        <pubDate>Thu, 04 Jul 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/cleanup-rawhide-builds</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/cleanup-rawhide-builds</guid>
        
        
      </item>
    
      <item>
        <title>Do you want to contribute to Copr?</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Thu, 27 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/do-you-want-to-contribute-to-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/do-you-want-to-contribute-to-copr</guid>
        
        
      </item>
    
      <item>
        <title>Need something extra? Employ your own Copr builders!</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/per-team-workers</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/per-team-workers</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2024-05-22 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Wed, 22 May 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Video tutorial: Using Copr CLI</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 13 May 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/video-tutorial-using-copr-cli</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/video-tutorial-using-copr-cli</guid>
        
        
      </item>
    
      <item>
        <title>SSH access to Copr builders</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/ssh-access-to-copr-builders</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/ssh-access-to-copr-builders</guid>
        
        
      </item>
    
      <item>
        <title>RFC: Planning Copr → PULP RPM content movement</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/rfc-moving-copr-repositories-to-pulp</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/rfc-moving-copr-repositories-to-pulp</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2024-03-07 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Thu, 07 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-release-notes</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for March 2024</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Mon, 04 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-march-2024</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-march-2024</guid>
        
        
      </item>
    
      <item>
        <title>AI-driven Build Failure diagnosis</title>
        <author>The Log Detective team</author>
        <description>&lt;p&gt;We are delighted to introduce &lt;a href=&quot;https://log-detective.com/&quot;&gt;Log Detective&lt;/a&gt;, an
exciting new project at the intersection of artificial intelligence and error
pattern detection in build logs. Unlike traditional approaches, &lt;em&gt;Log Detective&lt;/em&gt;
relies on your valuable input to kickstart its journey.&lt;/p&gt;

&lt;h2 id=&quot;what-is-log-detective&quot;&gt;What is Log Detective?&lt;/h2&gt;

&lt;p&gt;Log Detective takes a new approach by seeking insights directly from
maintainers willing to help other fellow maintainers.  Instead of using
pre-trained generic models, we want to offer a customized AI system only on
sentences and language specific to packaging.  Provided by maintainers that are
able to identify and understand common error patterns in build logs.&lt;/p&gt;

&lt;h2 id=&quot;whats-happening-at-log-detective&quot;&gt;What’s Happening at Log Detective?&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Data Collection Period&lt;/strong&gt;: We want to gather a rich dataset highlighting various
error patterns encountered in real-world (RPM and container first) build logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model Training Initiated&lt;/strong&gt;: With the collected data in hand, we’ll train (or
complement/co-train) an error pattern detection model. This pivotal step marks a
significant leap towards &lt;em&gt;Log Detective’s&lt;/em&gt; goal of providing accurate and
efficient solutions. We plan to do this step once we gather more than 1000
samples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration with build-systems&lt;/strong&gt;: The API of the resulting system/model will
allow us later to integrate with Copr and other existing build systems to help
you “light-speed” diagnose errors in your future builds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Re-usability&lt;/strong&gt;: There will be tooling for using the models e.g. for analyzing
&lt;a href=&quot;https://github.com/rpm-software-management/mock&quot;&gt;Mock&lt;/a&gt; build logs locally.
This tooling would form a basic building block for the build system integration
above, trying to follow the UNIX principles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User Feedback Loop&lt;/strong&gt;: Your continued feedback and input will remain crucial.
We encourage you to stay engaged, share additional insights, and participate in
discussions to refine &lt;em&gt;Log Detective&lt;/em&gt; further.&lt;/p&gt;

&lt;h2 id=&quot;how-your-contributions-shape-log-detective&quot;&gt;How Your Contributions Shape Log Detective?&lt;/h2&gt;

&lt;p&gt;We prepared a &lt;a href=&quot;https://log-detective.com&quot;&gt;data-gathering portal&lt;/a&gt;. The portal
contains a convenient form for you to easily describe the core of a given build
failure. The tool is integrated with the &lt;a href=&quot;https://koji.fedoraproject.org/koji/&quot;&gt;Fedora Koji&lt;/a&gt;
and &lt;a href=&quot;https://copr.fedorainfracloud.org/&quot;&gt;Fedora Copr&lt;/a&gt; build systems, but also
with &lt;a href=&quot;https://packit.dev/&quot;&gt;Packit service&lt;/a&gt;, so it is sufficient to specify the
build/run ID for which you want to provide data and then, using the pre-uploaded
build logs, you can just “highlight” the important part of the build log, and
provide a human-readable description/reason for the build failure.&lt;/p&gt;

&lt;h2 id=&quot;join-us-in-shaping-the-future&quot;&gt;Join Us in Shaping the Future!&lt;/h2&gt;

&lt;p&gt;Visit our &lt;a href=&quot;https://github.com/fedora-copr/log-detective-website&quot;&gt;GitHub
repository&lt;/a&gt;, and submit
your ideas and comments!&lt;/p&gt;

</description>
        <pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/log-detective</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/log-detective</guid>
        
        
      </item>
    
      <item>
        <title>CPT - look back at 2023</title>
        <author>Miroslav Suchý</author>
        <description>&lt;p&gt;Let me sum up what the Community Packaging Team (CPT) did during 2023:&lt;/p&gt;

&lt;h2 id=&quot;copr&quot;&gt;Copr&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;We did &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release_notes.html&quot;&gt;five releases of Copr&lt;/a&gt; and upgraded Copr servers to Fedora 39.&lt;/li&gt;
  &lt;li&gt;We wrote two “&lt;a href=&quot;https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-june-2023/&quot;&gt;4 cool new projects to try in Copr”&lt;/a&gt; articles for Fedora Magazine&lt;/li&gt;
  &lt;li&gt;We fixed several degradations of Copr performance where users noticed a disruption in our service.&lt;/li&gt;
  &lt;li&gt;Long builds can be &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/user_documentation/powerful_builders.html&quot;&gt;run on high-performance builders&lt;/a&gt; now.&lt;/li&gt;
  &lt;li&gt;Pavel moved s390x from Tokyo to the newly available Washington DC datacenter.&lt;br /&gt;
This is cheaper for our sponsor - IBM. And it is closer to other Copr servers.&lt;/li&gt;
  &lt;li&gt;We ran out of storage in Copr and we had to add 16 TB storage. The storage holding your repositories is now 44 TB big. And it brings us new challenges to maintain it.&lt;/li&gt;
  &lt;li&gt;Copr helped to discover that RPM Sequoia (F38+) doesn’t accept prolonged Copr GPG signatures. Pavel &lt;a href=&quot;https://github.com/rpm-software-management/rpm-sequoia/issues/50&quot;&gt;coordinated the effort to fix it&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;We spent lots of time with the Pulp team and identified issues that need to be addressed in Pulp before Copr uses Pulp as a backend. Most of the issues are resolved now and we are looking forward to working on enabling Pulp as a backend next year. The biggest benefits should be:
    &lt;ul&gt;
      &lt;li&gt;Use of S3 as storage - we will get unlimited storage and the maintenance of storage devices will be much easier.&lt;/li&gt;
      &lt;li&gt;Delegate performance tunning with createrepo and pruning old data to Pulp project.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;openEuler (Huawei)&lt;a href=&quot;https://docs.copr.fedorainfracloud.org/user_documentation.html#public-copr-instances&quot;&gt; deployed their own instance&lt;/a&gt; of Copr and contributed back with several fixes and features. E.g., &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/2788&quot;&gt;“group” support for OIDC&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jirka implemented the repo &lt;a href=&quot;https://github.com/fedora-copr/copr/pull/2733&quot;&gt;prioritization feature&lt;/a&gt; (DNF will prefer the installation of packages from the Copr project over the distro-default packages)&lt;/li&gt;
  &lt;li&gt;We moved SRPM introspection from the backend to builders - this enabled us to correctly evaluate various macros and conditions.&lt;/li&gt;
  &lt;li&gt;Pyp2spec is now the default PyPI spec generator in Copr. Thanks Karolina Surma for her contribution.&lt;/li&gt;
  &lt;li&gt;Thanks to Jakub, Copr now honors ExclusiveArch and does not report excluded arch as failed.&lt;/li&gt;
  &lt;li&gt;Jakub created &lt;a href=&quot;https://copr.fedorainfracloud.org/usage/&quot;&gt;a usage treemap&lt;/a&gt; that allowed us to better understand our users.&lt;/li&gt;
  &lt;li&gt;We made several improvements to the Copr front page to decrease loading time.&lt;/li&gt;
  &lt;li&gt;Jakub documented Copr-specific &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/user_documentation.html#rpm-macros&quot;&gt;RPM macros&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Pavel created the Copr plugin for DNF5.&lt;/li&gt;
  &lt;li&gt;We documented &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/user_documentation/pagure_integration.html&quot;&gt;Pagure integration&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Due to performance issues, we had to disable the generation of appstream metadata by default.&lt;/li&gt;
  &lt;li&gt;We tested and documented a Copr-backend disaster recovery. We discovered several issues and addressed them.&lt;/li&gt;
  &lt;li&gt;Jakub implemented ‘copr download-build –review’ that downloads only fedora-review results.&lt;/li&gt;
  &lt;li&gt;Jiri implemented `copr get PROJECT` that prints information about a specific project.&lt;/li&gt;
  &lt;li&gt;We stopped producing SQLite repo databases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;fedora&quot;&gt;Fedora&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Pavel &lt;a href=&quot;https://lists.fedoraproject.org/archives/list/infrastructure@lists.fedoraproject.org/thread/ERJOFQAVWYJKE7KAZVOYUNFVHDR5JOT5/&quot;&gt;got promoted&lt;/a&gt; to a ‘sysadmin-main’ role within Fedora Infra.&lt;/li&gt;
  &lt;li&gt;Pavel participates in the Fedora Change proposal &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/BuildWithDNF5&quot;&gt;Build Fedora with DNF 5&lt;/a&gt;. &lt;/li&gt;
  &lt;li&gt;Miroslav participated in Fedora Change proposal &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_1&quot;&gt;SPDX Licenses Phase 1&lt;/a&gt; and &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_2&quot;&gt;Phase 2&lt;/a&gt;. This included 23 emails with detailed statistics of progress.&lt;/li&gt;
  &lt;li&gt;Jakub bug fixed modulemd-tools in F39+.&lt;/li&gt;
  &lt;li&gt;Miroslav cleaned up Fedora’s AWS account and looked for forgotten resources. This required lots of emails and making sure the resources were really leftovers and not used by anything live.&lt;/li&gt;
  &lt;li&gt;Jakub recorded a video: &lt;a href=&quot;https://www.youtube.com/watch?v=w3e3W00KqVI&quot;&gt;How to add a package to the official Fedora repositories&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jakub enhanced FedoraReview to &lt;a href=&quot;https://github.com/fedora-copr/copr/pull/2857&quot;&gt;generate machine-readable JSON file&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jakub started and later enhanced &lt;a href=&quot;https://github.com/FrostyX/fedora-review-service&quot;&gt;Fedora Review Service&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jakub kicked off a discussion about &lt;a href=&quot;https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/CWHKVAWESDO3B6FE3BR6GXSXFT2TZTXG/&quot;&gt;autoassing sponsors to newcomers in Fedora&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jiří added the follow_fedora_branching attribute to project handling to both copr-cli and API.&lt;/li&gt;
  &lt;li&gt;Due to the constant problems with Pagure, &lt;a href=&quot;https://fedora-copr.github.io//posts/coprs-migration-to-github&quot;&gt;we migrated our git repository to GitHub&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jakub &lt;a href=&quot;https://github.com/fedora-copr/copr/pull/2520&quot;&gt;exposed useful ENV variables to a custom method&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;We did a &lt;a href=&quot;https://github.com/release-engineering/dist-git&quot;&gt;dist-git&lt;/a&gt; release.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;mock&quot;&gt;Mock&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Pavel did 13 releases of &lt;a href=&quot;https://rpm-software-management.github.io/mock/#release-notes&quot;&gt;Mock and mock-core-configs&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Mock now uses container images for bootstrap chroot by default.&lt;/li&gt;
  &lt;li&gt;Together with the DNF team Pavel worked on DNF5 and checked the compatibility and reported all issues to the DNF team. As a result, you will likely not notice a change when Mock starts to use DNF5 for builds.&lt;/li&gt;
  &lt;li&gt;Pavel spent a lot of time making sure Mock &lt;a href=&quot;https://rpm-software-management.github.io/mock/#mock-inside-podman-fedora-toolbox-or-docker-container&quot;&gt;runs flawlessly in rootles Podman containers&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Mock now pre-creates users in chroot using shadow-utils from a host.  Using this, Mock can newly pre-create a configured set of in-chroot user accounts. This made the Pesign support in Mock “supported” and stable.&lt;/li&gt;
  &lt;li&gt;Nils Philippsen contributed rpmautospec plugin that pre-processes spec files that use rpmautospec features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;spdx&quot;&gt;SPDX&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Miroslav sent 23 emails with detailed statistics of progress.&lt;/li&gt;
  &lt;li&gt;During this year Fedora contributors migrated 11 347 license tags. Thank you.&lt;/li&gt;
  &lt;li&gt;Miroslav talked about &lt;a href=&quot;https://talks.openalt.cz/openalt-2023/talk/NSFUWR/&quot;&gt;SPDX licenses at OpenAlt&lt;/a&gt; (in Czech).&lt;/li&gt;
  &lt;li&gt;Miroslav generated BNF grammar from fedora-license-data. This allowed comfortable checks using license-validate without constant rebases.&lt;/li&gt;
  &lt;li&gt;Miroslav had a talk &lt;a href=&quot;https://flock2023.sched.com/event/1Or1S/the-case-of-spdx-vs-fedora&quot;&gt;The case of SPDX vs. Fedora&lt;/a&gt; at Flock.&lt;/li&gt;
  &lt;li&gt;Miroslav had a talk &lt;a href=&quot;https://www.youtube.com/watch?v=KYRQHFJEeu8&quot;&gt;Software Bill of Materials (SBoM) for dummies&lt;/a&gt; at DevConf.CZ.&lt;/li&gt;
  &lt;li&gt;Miroslav did 5 releases of license-validate.&lt;/li&gt;
  &lt;li&gt;Miroslav did 26 releases of fedora-license-data.&lt;/li&gt;
  &lt;li&gt;Miroslav submitted 45 pull-requests with new licenses to upstream of SPDX.org.&lt;/li&gt;
  &lt;li&gt;Miroslav submitted about 120 pull-requests with new licenses to fedora-license-data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;other&quot;&gt;Other&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;We started working on the AI project &lt;a href=&quot;http://logdetective.com/&quot;&gt;Log Detective&lt;/a&gt; which will help package maintainers. This has not been announced yet. Stay tuned. Coming soon. Very soon.&lt;/li&gt;
  &lt;li&gt;Jakub did 5 releases of &lt;a href=&quot;https://github.com/FrostyX/tracer&quot;&gt;Tracer&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Pavel did 3 releases of &lt;a href=&quot;https://github.com/praiskup/resalloc&quot;&gt;Resalloc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Pavel blogged how to &lt;a href=&quot;https://pavel.raiskup.cz/blog/fedora-copr-hypervisor-disk-repartitioning.html&quot;&gt;re-partition an almost live system using mdadm and LVM&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Jakub nicely video blogged about how to prepare a &lt;a href=&quot;https://www.youtube.com/watch?v=b0aX3npnEVo&quot;&gt;patch-set for (CentOS Stream) packages&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Miroslav participated in a workshop &lt;a href=&quot;https://devconfcz2023.sched.com/event/1MYpP/writing-blog-posts-to-boost-community-awareness&quot;&gt;Writing blog posts to boost community awareness&lt;/a&gt; at DevConf.CZ.&lt;/li&gt;
  &lt;li&gt;Pavel did a release of argparse-manpage.&lt;/li&gt;
  &lt;li&gt;Miroslav gave a lightning talk about SPDX ad MiniDevConf.cz. Pavel at the same conference gave a lightning talk about &lt;a href=&quot;https://github.com/fedora-copr/vcs-diff-lint-action&quot;&gt;vcs-diff-lint&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;coming-soon&quot;&gt;Coming soon&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Jakub is working on a feature that will allow you to SSH to the Copr builder hosing the build process (e.g. to debug your failing build). Stay tuned!&lt;/li&gt;
  &lt;li&gt;We are in the process of moving our &lt;a href=&quot;https://copr.fedorainfracloud.org/api_3/docs&quot;&gt;API to self-documented&lt;/a&gt; using flask-restx.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;ideas-we-have-for-2024&quot;&gt;Ideas we have for 2024&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Finish issues from our &lt;a href=&quot;https://github.com/orgs/fedora-copr/projects/1/views/7&quot;&gt;triaged backlog&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Finish SPDX migration (target is October 2024)&lt;/li&gt;
  &lt;li&gt;Work on Log Detective.&lt;/li&gt;
  &lt;li&gt;Start using Pulp as a repository backend for Copr.&lt;/li&gt;
  &lt;li&gt;In Mock, use container images for chroots too. (Right now we use them for bootstrap chroots).&lt;/li&gt;
  &lt;li&gt;Start &lt;a href=&quot;https://github.com/openSUSE/cavil&quot;&gt;Cavil&lt;/a&gt; instance - this will allow package license audit after each commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Community Packaging Team consists of Pavel Raiskup, Jakub Kadlčík, Jiří Kyjovský, and me.&lt;/p&gt;

</description>
        <pubDate>Wed, 13 Dec 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/look-back-2023</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/look-back-2023</guid>
        
        
      </item>
    
      <item>
        <title>Fedora Copr team is moving from IRC to Matrix</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Fri, 08 Dec 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-copr-team-is-moving-from-irc-to-matrix</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-copr-team-is-moving-from-irc-to-matrix</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2023-08-16 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Wed, 16 Aug 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for June 2023</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 05 Jun 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-june-2023</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-june-2023</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2023-05-25 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Thu, 25 May 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2023-04-05 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Wed, 05 Apr 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in Copr for March 2023</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Wed, 01 Mar 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-march-2023</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-march-2023</guid>
        
        
      </item>
    
      <item>
        <title>Copr&apos;s migration to GitHub</title>
        <author>Jiří Kyjovský</author>
        <description>&lt;p&gt;For a very long time, Copr mainliners have been considering migrating from
Pagure to GitHub. The problem has been the constant problems with Pagure
and even though GitHub is not open source, it just works. Not
to mention that GitHub is miles ahead of Pagure with plenty of useful
features.&lt;/p&gt;

&lt;p&gt;So on the migration itself, Copr had a mirror on GitHub at the time, so
the code migration wasn’t a problem. The problem was migrating all the issues
and pull requests so that their IDs were preserved. We wanted to keep the
same IDs for compatibility with the links in the commits. And there
is no general solution to migrate all issues and PRs from Pagure to GitHub
while preserving the IDs. So that’s why I wrote a temporary
&lt;a href=&quot;https://github.com/nikromen/copr-gh-migration/blob/main/script.py&quot;&gt;script&lt;/a&gt;
to migrate Copr. Please note that the code was only meant to be used once
and only for the Copr migration, so it should not be used by anyone.
However, it can serve as an inspiration
and I would also like to share with you some of the problems I encountered
during the migration.&lt;/p&gt;

&lt;h2 id=&quot;choose-the-right-tools&quot;&gt;Choose the right tools&lt;/h2&gt;

&lt;p&gt;For the whole migration, I used the tool &lt;a href=&quot;https://github.com/packit/ogr&quot;&gt;ogr&lt;/a&gt;,
which provides a unified API for communicating with GitHub, Gitlab, and Pagure.
For communication with the GitHub API, you need to set up a
&lt;a href=&quot;https://github.com/settings/tokens&quot;&gt;GitHub token&lt;/a&gt;, and likewise for
&lt;a href=&quot;https://pagure.io/settings#nav-api-tab&quot;&gt;Pagure&lt;/a&gt;. Note the permissions that
you give the token, only give it as much as you really need (for example, you
probably don’t want to allow it to delete the repository).&lt;/p&gt;

&lt;p&gt;And then you just have to start using the tokens&lt;/p&gt;

&lt;div class=&quot;language-py highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gh_service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GithubService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pagure_service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PagureService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PAGURE_TOKEN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;instance_url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://pagure.io&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gh_copr_project&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gh_service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_project&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;fedora-copr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;copr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pagure_copr_project&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pagure_service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_project&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;copr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;copr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pagure_nick&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;what-to-migrate&quot;&gt;What to migrate&lt;/h2&gt;

&lt;p&gt;First of all, it is important to determine what we want to migrate.
In our case, we wanted to migrate as quickly as possible, so we just needed
to migrate all issues and PRs to keep the order of their IDs. To
save time, decided to migrate the PRs as issues while migrating only
the issues content. For PRs, we put a link to the original PR in Pagure.&lt;/p&gt;

&lt;p&gt;In case of private issues, or deleted PRs or issues, there will be gaps
between the IDs. We have decided to fill these gaps only with empty issues.&lt;/p&gt;

&lt;h3 id=&quot;pull-requests-migration&quot;&gt;Pull Requests migration&lt;/h3&gt;

&lt;p&gt;But if someone wants to migrate PRs, yes it can be done, it’s just a bit
tricky. To migrate PRs with their diff, you need to pull the
last commit from Pagure before the pull request and the last commit of
the pull request. This would be something like this:&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# you are in a main branch&lt;/span&gt;
git switch &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; pr-branch
git reset &lt;span class=&quot;nt&quot;&gt;--hard&lt;/span&gt; the-last-commit-of-pr
git switch &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; main-before-pr
git reset &lt;span class=&quot;nt&quot;&gt;--hard&lt;/span&gt; the-last-commit-before-pr
&lt;span class=&quot;c&quot;&gt;# do your changes in &amp;lt;pr-branch&amp;gt;&lt;/span&gt;
git push &amp;lt;remote&amp;gt; &amp;lt;pr-branch&amp;gt;:&amp;lt;main-before-pr&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This pushes all changes to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main-before-pr&lt;/code&gt; branch, which you can create
PR in GitHub (or via GitHub API) and then merge PR and delete the branch
immediately. The PR history will remain.&lt;/p&gt;

&lt;h2 id=&quot;rate-limits&quot;&gt;Rate limits&lt;/h2&gt;

&lt;p&gt;Then GitHub stabbed me in the back with its crazy
&lt;a href=&quot;https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#secondary-rate-limits&quot;&gt;limits&lt;/a&gt;.
According to their
&lt;a href=&quot;https://docs.github.com/en/rest/guides/best-practices-for-integrators?apiVersion=2022-11-28#dealing-with-secondary-rate-limits&quot;&gt;instructions&lt;/a&gt;,
I did the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sleep(1)&lt;/code&gt; between POST requests, but after about 40 requests I
always hit the limit anyway, and for this case in there is no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Retry-After&lt;/code&gt;
parameter in the header. With each subsequent hit of the limit, there was a
longer and longer punishment, even tens of minutes. At this point, I gave up
and just put sleep for 2 minutes between each POST request. Also, I shrunk
the issue content just to one long message so that it was just one POST
request &lt;a href=&quot;https://github.com/fedora-copr/copr/issues/2001&quot;&gt;example&lt;/a&gt;.
So we’ll be migrating for 4 days…&lt;/p&gt;

&lt;p&gt;Maybe I could get around these limits by running the script as a GitHub
Action, on which there are other limit rules, but I didn’t want to
waste my time with that.&lt;/p&gt;

&lt;h2 id=&quot;the-migration-process-itself&quot;&gt;The migration process itself&lt;/h2&gt;

&lt;p&gt;The migration itself wasn’t that complicated - from a code point of view.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;I created API keys for Pagure and GitHub&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Downloaded the Pagure data into a JSON file for good measure
(so that nothing would change during the long 4-day migration)
&lt;a href=&quot;https://github.com/nikromen/copr-gh-migration/blob/50754dc1b97b3e0505638ec2aec84f20e6ecd539/script.py#L112&quot;&gt;source&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Then just convert the data back from the JSON file:&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-py highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;n&quot;&gt;pagure_prs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;pr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pr&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pr&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;ogr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pagure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PagurePullRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pr_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pagure_project&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pr_dict&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pagure_prs_json&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Incremental migration of Copr&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;First I migrated without any content.
  &lt;a href=&quot;https://github.com/nikromen/copr-gh-migration/blob/50754dc1b97b3e0505638ec2aec84f20e6ecd539/script.py&quot;&gt;script at that time&lt;/a&gt;&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Then I migrated the labels.
  &lt;a href=&quot;https://github.com/nikromen/copr-gh-migration/blob/7a08cb0332de8d189624305ea30740d4dbf57e8a/script.py&quot;&gt;script at that time&lt;/a&gt;&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;After a couple of weeks, I migrated the issue’s content as well (that’s
  why the code isn’t logically coherent).
  &lt;a href=&quot;https://github.com/nikromen/copr-gh-migration/blob/aeec2ab668ace02c75188a36cec102aedad0eced/script.py&quot;&gt;script at that time&lt;/a&gt;&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;On Pagure in
&lt;a href=&quot;https://pagure.io/my-playground/settings#projectoptions-tab&quot;&gt;Project Options&lt;/a&gt;
we set the issue tracker to read-only.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;I recommend using ogr for migration, it saved me some nerves due to the fact
that it wraps Pagure API in Python and it also provides functionality to
migrate data from Pagure to GitHub. It just requires a lot of patience,
because of the very strict limits on the GitHub side, but if you download the
data from Pagure before the migration it can run for a really long time
without consequences.&lt;/p&gt;
</description>
        <pubDate>Thu, 16 Feb 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/coprs-migration-to-github</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/coprs-migration-to-github</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2023-01-25 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Wed, 25 Jan 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Copr - look back at 2022</title>
        <author>Miroslav Suchý</author>
        <description>&lt;p&gt;Let me sum up what the Copr team did during 2022.&lt;/p&gt;

&lt;p&gt;Mock:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;We did six &lt;a href=&quot;https://rpm-software-management.github.io/mock/#release-notes&quot;&gt;releases of Mock&lt;/a&gt; Starting with a major upgrade to 3.x that dropped python2 support and EL7 as the host platform.&lt;/li&gt;
  &lt;li&gt;We added &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--list-chroots&lt;/code&gt; option. Allow better customization of used tar binary and adapt to the new split of qemu-user-static package.&lt;/li&gt;
  &lt;li&gt;We also added lots of new chroots: AlmaLinux, RockyLinux, EuroLinux, OpenEuler, and a few others…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copr:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;We did &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release_notes.html&quot;&gt;nine releases of Copr&lt;/a&gt; and upgraded Copr servers to Fedora 37.&lt;/li&gt;
  &lt;li&gt;We wrote two “&lt;a href=&quot;https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-august-2022/&quot;&gt;4 cool new projects to try in Copr”&lt;/a&gt; articles for Fedora Magazine&lt;/li&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;Beside previously built of all gems from Rubygems.org we built all modules from PyPI as RPM packages [Thousands of PyPI and RubyGems RPMs now available for RHEL 9&lt;/td&gt;
          &lt;td&gt;Red Hat Developer](https://developers.redhat.com/articles/2022/06/07/thousands-pypi-and-rubygems-rpms-now-available-rhel-9) Big thanks to Karolina Surma from Python team on cooperation on this. As a side effect, we introduced pyp2spec as a second option to build directly from PyPI.&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
  &lt;li&gt;We &lt;a href=&quot;https://www.youtube.com/watch?v=LSgGno0oecs&quot;&gt;presented&lt;/a&gt; at Fedora Nest.&lt;/li&gt;
  &lt;li&gt;We dropped APIv2. And provided guidance how to migrate your scripts &lt;a href=&quot;https://fedora-copr.github.io/posts/api3-migration-helper&quot;&gt;https://fedora-copr.github.io/posts/api3-migration-helper&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We added Kerberos authentication to command line tools and API &lt;a href=&quot;https://fedora-copr.github.io/posts/how-to-use-kerberos-in-copr&quot;&gt;https://fedora-copr.github.io/posts/how-to-use-kerberos-in-copr&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We cooperated with Packit on building SRPM in Copr &lt;a href=&quot;https://packit.dev/posts/copr-srpms/&quot;&gt;https://packit.dev/postcs/copr-srpms/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We started using IBM Cloud for native s390x builders  &lt;a href=&quot;https://pavel.raiskup.cz/blog/fedora-copr-uses-ibm-cloud.html&quot;&gt;https://pavel.raiskup.cz/blog/fedora-copr-uses-ibm-cloud.html&lt;/a&gt; &lt;br /&gt;
As a side effect we packaged python modules for managing resources in IBM Cloud.&lt;/li&gt;
  &lt;li&gt;We spent lots of time optimizing the scheduler in Copr. E.g.
    &lt;ul&gt;
      &lt;li&gt;Builds from webhooks are now background jobs &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2022-02-03.html#webhook-rebuilds-are-background-jobs-now&quot;&gt;https://docs.copr.fedorainfracloud.org/release-notes/2022-02-03.html#webhook-rebuilds-are-background-jobs-now&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;We improved the throughput when the queue is bigger than 70k jobs &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2022-03-21.html#large-queue-improvements&quot;&gt;https://docs.copr.fedorainfracloud.org/release-notes/2022-03-21.html#large-queue-improvements&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;And we were able to increase quota of parallel builds from one user from 35 to 45.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;We started using SHA256 for signing packages &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2022-03-21.html#signing-packages-with-sha256&quot;&gt;https://docs.copr.fedorainfracloud.org/release-notes/2022-03-21.html#signing-packages-with-sha256&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We started using OpenPGP v4 signatures and we were one of the first to discover issues with new Sequoia backend of RPM with older version of signatures.&lt;/li&gt;
  &lt;li&gt;We created a webUI statistics page that shows the utilization of &lt;a href=&quot;https://github.com/praiskup/resalloc&quot;&gt;resalloc&lt;/a&gt; resources https://docs.copr.fedorainfracloud.org/release-notes/2022-06-22.html#resalloc-webui&lt;/li&gt;
  &lt;li&gt;We (finally) were able to count download statistics from CDN &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2022-08-18.html#rpm-download-statistics&quot;&gt;https://docs.copr.fedorainfracloud.org/release-notes/2022-08-18.html#rpm-download-statistics&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;You can submit more builds at once from command line &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2022-07-27.html#submitting-multiple-builds-at-once-via-copr-cli&quot;&gt;https://docs.copr.fedorainfracloud.org/release-notes/2022-07-27.html#submitting-multiple-builds-at-once-via-copr-cli&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We upgraded aarch64 builders to stronger Graviton3 machines &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2022-11-28.html#updated-aarch64-builders-to-graviton3-processors&quot;&gt;https://docs.copr.fedorainfracloud.org/release-notes/2022-11-28.html#updated-aarch64-builders-to-graviton3-processors&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We migrated our git project to GitHub &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2022-11-28.html#development-moved-to-github&quot;&gt;https://docs.copr.fedorainfracloud.org/release-notes/2022-11-28.html#development-moved-to-github&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We migrated to new storage as we hit 16 TB hard limit for one volume in AWS. It took us few weeks of preparation to make just a few hour outage for building packages and almost no outage for yum repositories availability.&lt;/li&gt;
  &lt;li&gt;Fedora Infrastructure helped us to provision a new Power9 box (for ppc64le builds) which hosts 25 builders (which complements the set of Power9 machines in OSUOSL). Note that Power9+ is needed for Enterprise Linux 9 builds.&lt;/li&gt;
  &lt;li&gt;We created OpenShift and Kustomize deployment script.&lt;/li&gt;
  &lt;li&gt;Statistics:
    &lt;ul&gt;
      &lt;li&gt;Copr run 1 251 633 builds (one package for different chroots is conted as one)&lt;/li&gt;
      &lt;li&gt;People created 23 053 new projects.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fedora:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;We participated in SPDX License migration phase 1 &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_1&quot;&gt;https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We announced the initial release of Package Review service &lt;a href=&quot;https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/message/E4TT2PEOSITJ4PJP44L2GQUU4CA6R6B3/&quot;&gt;https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/message/E4TT2PEOSITJ4PJP44L2GQUU4CA6R6B3/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We contributed to fedora-review to produce machine-readable output &lt;a href=&quot;https://pagure.io/FedoraReview/pull-request/463&quot;&gt;https://pagure.io/FedoraReview/pull-request/463&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;One &lt;a href=&quot;https://github.com/rpm-software-management/modulemd-tools/releases/tag/modulemd-tools-0.13-1&quot;&gt;modulemd-tools release&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;FIXME another notable fedora-review contribution?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Others:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;We did three &lt;a href=&quot;https://github.com/rpm-software-management/tito/releases&quot;&gt;releases&lt;/a&gt; of Tito&lt;/li&gt;
  &lt;li&gt;We did seven &lt;a href=&quot;https://github.com/praiskup/resalloc/releases&quot;&gt;releases&lt;/a&gt; of Resalloc&lt;/li&gt;
  &lt;li&gt;RPM Spec Wizard &lt;a href=&quot;http://frostyx.cz/posts/introducing-rpm-spec-wizard&quot;&gt;got a nice front page&lt;/a&gt; &lt;a href=&quot;https://xsuchy.github.io/rpm-spec-wizard/&quot;&gt;https://xsuchy.github.io/rpm-spec-wizard/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Copr users are known to build the same NEVRAs multiple times in the same project, which confuses DNF and other tools.  We contributed to createrepo_c &lt;a href=&quot;https://github.com/rpm-software-management/createrepo_c/pull/325&quot;&gt;https://github.com/rpm-software-management/createrepo_c/pull/325&lt;/a&gt; which is the first step to deterministically resolve the problem.&lt;/li&gt;
  &lt;li&gt;The “differential PyLint checker” we used for the last few years was separated from the Copr base code into &lt;a href=&quot;https://github.com/fedora-copr/vcs-diff-lint&quot;&gt;https://github.com/fedora-copr/vcs-diff-lint&lt;/a&gt; and it can now be easily used by other projects. We also provide a “glue” GitHub Action wich makes it’s use trivial, see integration example &lt;a href=&quot;https://github.com/rpm-software-management/mock/blob/main/.github/workflows/python-diff-lint.yml&quot;&gt;https://github.com/rpm-software-management/mock/blob/main/.github/workflows/python-diff-lint.yml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outlook for 2023&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Integration with Koshei - automatic rebuild of your package in your project when dependency changes (inherited from the previous year - not even started yet)&lt;/li&gt;
  &lt;li&gt;Hopefully start using ImageBuilder.&lt;/li&gt;
  &lt;li&gt;We are investigating the usage of &lt;a href=&quot;https://pulpproject.org/&quot;&gt;Pulp&lt;/a&gt; as a backend for storing RPM packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ideas we have for 2023 - some of them are inherited from the previous year:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Enhance &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mock --chain&lt;/code&gt; to try to set %bootstrap when the standard loop fails. When the set succeeds, rebuild the bootstrapped package again without the %bootstrap macro.&lt;/li&gt;
  &lt;li&gt;Contribute to fedpkg/koji to have machine-readable output. FIXME&lt;/li&gt;
  &lt;li&gt;Include packages from Copr in results of &lt;a href=&quot;https://packages.fedoraproject.org/&quot;&gt;https://packages.fedoraproject.org/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Allow running various tools right after the build - e.g., rpminspect, swidtags.&lt;/li&gt;
  &lt;li&gt;Automatically verify if your package’s license can be used in Copr.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Community Packaging Team consists of Pavel Raiskup, Jakub Kadlcik, Jiří Kyjovský (who replaced Silvie Chlupova), and me.&lt;/p&gt;

</description>
        <pubDate>Mon, 09 Jan 2023 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-in-2022</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-in-2022</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2022-11-30 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Wed, 30 Nov 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2022-11-28 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Mon, 28 Nov 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Nest 2022 — Fedora Copr Stories</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Mon, 24 Oct 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-copr-stories</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-copr-stories</guid>
        
        
      </item>
    
      <item>
        <title>Migrate to APIv3 queries</title>
        <author>Pavel Raiskup</author>
        <description>&lt;p&gt;We had planned the APIv2 drop &lt;a href=&quot;https://fedora-copr.github.io/posts/EOL-APIv1-APIv2&quot;&gt;for a very long time&lt;/a&gt;, and we
started with that quite some time ago (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api_2&lt;/code&gt; dropped from our Python API lib).
The team was so much familiar with this ongoing change, and was kind of bored
from announcements so we forgot about analyzing the ongoing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api_2&lt;/code&gt; Apache
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;access_log&lt;/code&gt; entries.&lt;/p&gt;

&lt;p&gt;The change has &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2022-09-21.html&quot;&gt;already happened&lt;/a&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api_2&lt;/code&gt; is gone.  So here
comes at least a small helper post that should make the migration from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api_2&lt;/code&gt;
to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api_3&lt;/code&gt; trivial.  Only the routes that are being accessed (and are 404) are
covered here.&lt;/p&gt;

&lt;p&gt;Also, it might be a good idea to use the Python API (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python3-copr&lt;/code&gt;) if
possible.&lt;/p&gt;

&lt;h2 id=&quot;how-to-get-a-build-info&quot;&gt;How to get a build info&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Old route: /api_2/builds/&amp;lt;ID&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New route: /api_3/build/&amp;lt;ID&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This should be easy as it looks.  But note that newly you want look at the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.projectname&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ownername&lt;/code&gt; fields in the output because you’ll need them in
the other routes.&lt;/p&gt;

&lt;h2 id=&quot;how-to-get-a-project-info&quot;&gt;How to get a project info&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Old route: /api_2/projects/&amp;lt;project_id&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New route: /api_3/project?ownername=&amp;lt;ownername&amp;gt;&amp;amp;projectname=&amp;lt;projectname&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;listing-builds-in-a-project&quot;&gt;Listing builds in a project&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Old route: /api_2/builds?project_id=&amp;lt;proj_id&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New route: /api_3/build/list/?ownername=&amp;lt;ownername&amp;gt;&amp;amp;projectname=&amp;lt;projectname&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We no longer work with project IDs here.&lt;/p&gt;

&lt;p&gt;Note the needed trailing slash symbol after &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;list/?...&lt;/code&gt;, this is a bug and
should be fixed so both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;list?&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;list/?&lt;/code&gt; variants are possible in the
future.&lt;/p&gt;

&lt;h2 id=&quot;last-build-in-a-project&quot;&gt;Last build in a project&lt;/h2&gt;

&lt;p&gt;Same as the previous one, just add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;amp;limit=N&lt;/code&gt; argument:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Old route: /api_2/builds?project_id=&amp;lt;proj_id&amp;gt;&amp;amp;limit=&amp;lt;N&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New route: /api_3/build/list/?ownername=&amp;lt;ownername&amp;gt;&amp;amp;projectname=&amp;lt;projectname&amp;gt;&amp;amp;limit=&amp;lt;N&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;list-of-owners-projects&quot;&gt;List of owner’s projects&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Old route: /api_2/projects?owner=&amp;lt;owner&amp;gt;&amp;amp;name=&amp;lt;owner&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New route: /api_3/project?ownername=&amp;lt;owner&amp;gt;&amp;amp;projectname=&amp;lt;projectname&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;build-config&quot;&gt;Build config&lt;/h2&gt;

&lt;p&gt;The “build config” info is rather internal thing (we have part of it in APIv3,
because of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$ copr mock-config &amp;lt;project&amp;gt; &amp;lt;chroot&amp;gt;&lt;/code&gt; functionality.  But
previously the config route was used to get the build result directory, aka
chroot’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;result_dir_url&lt;/code&gt;.  This can be now obtained through the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/api_3/build-chroot&lt;/code&gt; route (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;result_url&lt;/code&gt; field).  The rest of the info goes to
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/backend&lt;/code&gt; internal namespace.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Old route: /api_2/build_tasks/&amp;lt;build_id&amp;gt;/&amp;lt;chroot_name&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New route: /api_3/build-chroot?build_id=&amp;lt;build-id&amp;gt;&amp;amp;chrootname=&amp;lt;chroot_name&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New route: /api_3/build-chroot/build-config?build_id=&amp;lt;build-id&amp;gt;&amp;amp;chrootname=&amp;lt;chroot_name&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;New route: /backend/get-build-task/&amp;lt;build-id&amp;gt;-&amp;lt;chroot_name&amp;gt;&lt;/code&gt; (internal only)&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Thu, 22 Sep 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/api3-migration-helper</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/api3-migration-helper</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2022-09-21 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Wed, 21 Sep 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in Copr for August 2022</title>
        <author>Jiří Kyjovský</author>
        <description>
</description>
        <pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-august-2022</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-august-2022</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from the 2022-08-18 release</title>
        <author>Copr Team</author>
        <description>
</description>
        <pubDate>Thu, 18 Aug 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/highlights</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/highlights</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2022-07-27 release</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Wed, 27 Jul 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in Copr for May 2022</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Fri, 27 May 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-may-2022</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-may-2022</guid>
        
        
      </item>
    
      <item>
        <title>Why my patches are missing from custom build</title>
        <author>Ding-Yi-Chen</author>
        <description>
</description>
        <pubDate>Tue, 19 Apr 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/why-my-patches-are-missing</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/why-my-patches-are-missing</guid>
        
        
      </item>
    
      <item>
        <title>How to use Kerberos in Copr</title>
        <author>Silvie Chlupova</author>
        <description>&lt;p&gt;During the last release, a new authentication option was added to Copr. Now users can also log in using a Kerberos ticket.
We use GSSAPI to implement this mechanism.
The GSSAPI (Generic Security Services API) is a common interface for accessing the Kerberos security system.
Enabling GSSAPI authentication in Copr CLI or API will allow authentication without using  the API token for clients that have a Fedora account.
To use GSSAPI login in WebUI, click on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gssapi-login&lt;/code&gt;  (negotiate needs to be allowed for the .fedorainfracloud.org domain in the browser, &lt;a href=&quot;https://fedoraproject.org/wiki/Infrastructure/Kerberos#Firefox&quot;&gt;see browser configuration&lt;/a&gt;).
It will log you in if you have a Kerberos ticket for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;username@FEDORAPROJECT.ORG&lt;/code&gt;.
To enable GSSAPI, you need to obtain a Kerberos ticket first. If you want to work with Fedora Copr, you can just do:&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;fkinit &lt;span class=&quot;c&quot;&gt;# optionally with &quot;-u username&quot;&lt;/span&gt;
Enter your password and OTP concatenated. &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Ignore that the prompt is &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;only the token&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Enter OTP Token Value: &amp;lt;your password + OTP token&amp;gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;copr &lt;span class=&quot;nb&quot;&gt;whoami
&lt;/span&gt;your_username
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You can also find here &lt;a href=&quot;https://fedoraproject.org/wiki/Infrastructure/Kerberos&quot;&gt;how to use Kerberos auth with Fedora Infrastructure&lt;/a&gt;.
To work with another (non-Fedora Copr) instance, you need to obtain the Kerberos ticket differently, and you need to have a configuration file containing the appropriate copr_url:&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kinit username@EXAMPLE.COM
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; ~/.config/copr
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;copr-cli]
copr_url &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; https://copr.example.com/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;api-key-vs-kerberos&quot;&gt;API key vs. Kerberos&lt;/h2&gt;
&lt;p&gt;If you have an API key set up and have a Kerberos ticket, then the API key has a higher priority and will be used.
By default, we enable the use of GSSAPI in the CLI. This means that if you have a properly configured API key, it will be used, but if not, we try to use GSSAPI to get the necessary information.
Be careful, in this case, CLI will use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copr_url&lt;/code&gt; set up in the configuration file to get the information, and if you don’t have the configuration file at all, it will use the default URL,
which is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://copr.fedorainfracloud.org&lt;/code&gt;. If you want to use another instance of Copr, set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copr_url&lt;/code&gt; to the preferred instance.
You can disable the use of GSSAPI by setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gssapi&lt;/code&gt; to False in the configuration file.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;copr-cli]
gssapi &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; False
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Unlike CLI, this behavior is disabled by default in the API. However, you can still use the method &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;create_from_config_file&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;copr.v3&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;create_from_config_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;username&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;login&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;token&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;copr_url&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;https://copr.fedorainfracloud.org&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;gssapi&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;encrypted&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You can see that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gssapi&lt;/code&gt; is not set so anything you do now using the API and requires authentication will fail and throw an exception
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CoprAuthException&lt;/code&gt;. You can solve this by setting:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;gssapi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;switch-primary-ticket-cache&quot;&gt;Switch primary ticket cache&lt;/h2&gt;

&lt;p&gt;If you obtain a ticket, e.g., for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;username@EXAMPLE.COM&lt;/code&gt;, and then you obtain a ticket for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;username@FEDORAPROJECT.ORG&lt;/code&gt;, everything works
well. However, if you obtain a ticket first for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FEDORAPROJECT.ORG&lt;/code&gt; and then for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXAMPLE.COM&lt;/code&gt;,
it will not be possible to log in to the WebUI or use CLI and API. You can solve this issue by using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kswitch&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kswitch &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; username@FEDORAPROJECT.ORG
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;it makes the specified credential cache the primary cache for the collection if a cache collection is available.
No matter the order in which you get the ticket now, when you list cached Kerberos tickets using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;klist&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;klist &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;you can see that the Kerberos ticket for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;username@FEDORAPROJECT.ORG&lt;/code&gt; is now listed as first.&lt;/p&gt;

&lt;h2 id=&quot;new-users&quot;&gt;New users&lt;/h2&gt;
&lt;p&gt;If you are a new user and want to start using Copr or if your group membership changed, and you want to use this new group in Copr,
you will first need to log in to the WebUI using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;log in&lt;/code&gt; link.
We are currently unable to retrieve group membership and your email from FAS when you log in using Kerberos. Behind the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;log in&lt;/code&gt; link is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;openid&lt;/code&gt;, which can do this.
We need this information about new users in order to use Copr.&lt;/p&gt;

&lt;h2 id=&quot;logic-behind-it&quot;&gt;Logic behind it&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/img/posts/state_machine.jpg&quot; alt=&quot;Logic behind it&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 07 Apr 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/how-to-use-kerberos-in-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/how-to-use-kerberos-in-copr</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2022-04-05 release</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Tue, 05 Apr 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2022-03-21 release</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 21 Mar 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/release-notes</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/release-notes</guid>
        
        
      </item>
    
      <item>
        <title>Packit - Building SRPMs in Copr</title>
        <author>Laura Barcziova</author>
        <description>
</description>
        <pubDate>Tue, 15 Mar 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/building-srpm-in-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/building-srpm-in-copr</guid>
        
        
      </item>
    
      <item>
        <title>Building RHEL on a subscribed Fedora cloud box</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Thu, 10 Mar 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/epel-builds-against-rhel-on-fedora</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/epel-builds-against-rhel-on-fedora</guid>
        
        
      </item>
    
      <item>
        <title>IBM Cloud used in Fedora Copr</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Mon, 14 Feb 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-copr-uses-ibm-cloud</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-copr-uses-ibm-cloud</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2022-02-03 release</title>
        <author>Silvie Chlupova</author>
        <description>
</description>
        <pubDate>Thu, 03 Feb 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/highlights</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/highlights</guid>
        
        
      </item>
    
      <item>
        <title>Copr - look back at 2021</title>
        <author>Miroslav Suchý</author>
        <description>&lt;p&gt;Let me sum up what the Copr team did during 2021&lt;/p&gt;

&lt;h3 id=&quot;mock&quot;&gt;Mock&lt;/h3&gt;

&lt;p&gt;We did eight releases of Mock.&lt;/p&gt;

&lt;p&gt;We moved Mock’s wiki to GitHub Pages to allow indexing by search engines https://rpm-software-management.github.io/mock/ and created a Fedora-based Jekyll container for local documentation testing (https://github.com/praiskup/jekyll-github-pages-fedora-container).&lt;/p&gt;

&lt;p&gt;We initiated the discussion about default epel-8-* config&lt;/p&gt;

&lt;h3 id=&quot;copr&quot;&gt;Copr&lt;/h3&gt;

&lt;p&gt;We did six releases of Copr and upgraded Copr servers to Fedora 35.&lt;/p&gt;

&lt;p&gt;We wrote three “4 cool new projects to try in Copr” articles for &lt;a href=&quot;https://fedoramagazine.org/&quot;&gt;Fedora Magazine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://frostyx.cz/posts/rebuilding-the-entire-rubygems-in-copr&quot;&gt;We rebuilt all gems from Rubygems.org for Fedora Rawhide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pavel.raiskup.cz/blog/aws-instances.html&quot;&gt;We started to use AWS Spot instances for builders&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://fedora-copr.github.io/posts/EOL-APIv1-APIv2-pt2&quot;&gt;We started to decommission APIv1 and APIv2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You have &lt;a href=&quot;http://frostyx.cz/posts/running-fedora-review-after-copr-build&quot;&gt;an option to run a fedora-review after each build&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We created &lt;a href=&quot;https://fedora-copr.github.io/posts/new-ansible-module-copr&quot;&gt;a new Ansible module &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copr&lt;/code&gt; which is available in community general collection&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pavel.raiskup.cz/blog/build-ordering-by-batches-in-copr.html&quot;&gt;You can order your builds using batches now&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;People started using discussion under projects. There are more than one hundred active discussions https://discussion.fedoraproject.org/c/projects-in-copr/54&lt;/p&gt;

&lt;p&gt;We redesigned Copr’s home page.&lt;/p&gt;

&lt;p&gt;We worked on clean-up scripts resulting in 5+ TB cleaned from our backends.&lt;/p&gt;

&lt;p&gt;We did six releases of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;resalloc&lt;/code&gt; with improvements for better throughput and reactions during peeks. https://github.com/praiskup/resalloc/&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pavel.raiskup.cz/blog/switch-fedora-box-to-ipv6-in-aws.html&quot;&gt;Copr’s servers got IPv6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We did three releases of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;prunerepo&lt;/code&gt; https://pagure.io/prunerepo&lt;/p&gt;

&lt;p&gt;We &lt;a href=&quot;https://pavel.raiskup.cz/blog/copr-farm-of-builders.html&quot;&gt;added lots of builders and some architectures&lt;/a&gt; and later we re-add ppc64le architecture, and started using spot AWS instances&lt;/p&gt;

&lt;p&gt;We implemented Error Budget and our goal is:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;97 % of builds of copr-ping package is finished within 6 minutes (this monitor length of queue and speed of builders)&lt;/li&gt;
  &lt;li&gt;99,3 % uptime of CDN&lt;/li&gt;
  &lt;li&gt;99,3 % uptime of copr-backend (dnf repositories) (cca 5h/month)&lt;/li&gt;
  &lt;li&gt;97.5 % uptime of copr-frontend (WebUI) (cca 18h/month)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is work in progress on Kerberos authentication in copr-cli.&lt;/p&gt;

&lt;p&gt;Statistics:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Copr run 2,900,000 builds.&lt;/li&gt;
  &lt;li&gt;People created 15 731 new projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;fedora&quot;&gt;Fedora&lt;/h3&gt;

&lt;p&gt;We created &lt;a href=&quot;https://docs.pagure.org/fedora-sponsors/&quot;&gt;a Fedora Sponsor site to easy find of a sponsor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We created &lt;a href=&quot;https://youtu.be/VsnJymZRQOM&quot;&gt;a video explaining a dist-git&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We proposed &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/RetiredPackages&quot;&gt;Retired Packages change&lt;/a&gt; and it got accepted.&lt;/p&gt;

&lt;p&gt;We created &lt;a href=&quot;https://pagure.io/copr/license-validate/&quot;&gt;license-validate tool&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;others&quot;&gt;Others&lt;/h3&gt;

&lt;p&gt;We did four releases of &lt;a href=&quot;https://github.com/rpm-software-management/tito&quot;&gt;Tito&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We wrote an article about &lt;a href=&quot;https://developers.redhat.com/blog/2021/02/10/how-to-activate-your-no-cost-red-hat-enterprise-linux-subscription&quot;&gt;activating no-cost RHEL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We wrote three articles about storing GPG keys in DNS and persuaded several distributions to put the records in DNS https://github.com/xsuchy/distribution-gpg-keys/#storing-keys-in-dns&lt;/p&gt;

&lt;p&gt;New &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;modulemd-tools&lt;/code&gt; release with “bld2repo” tool.&lt;/p&gt;

&lt;h3 id=&quot;outlook-for-2022&quot;&gt;Outlook for 2022&lt;/h3&gt;

&lt;p&gt;We are in the middle of talking with IBM, which should result in the availability of native s390x builders in the early months of 2022&lt;/p&gt;

&lt;p&gt;We had an initial meeting about rebase-helper automatically opening PR in src.fedoraproject.org. There is even some code written (by Michal Konečný), but the code is not integrated yet and no user-visible outcome was done yet. ETA is the first half of 2022.&lt;/p&gt;

&lt;p&gt;Python team deprecated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyp2rpm&lt;/code&gt; and Karolina Surma is writing a new tool from scratch and she will use it for the rebuild of PyPI in Copr in a similar way to how we have done Rubygems. ETA is early months or 2022.&lt;/p&gt;

&lt;p&gt;Unify forge events - when an “interesting” event happens on GitHub/GitLab/* sent notification to Fedora Messaging in a unified format. Besides Copr, this will be useful for Packit too.&lt;/p&gt;

&lt;p&gt;s we have for 2022 - some of them are inherited from the previous year:&lt;/p&gt;

&lt;p&gt;Finish rpm-spec-wizard https://github.com/xsuchy/rpm-spec-wizard&lt;/p&gt;

&lt;p&gt;Integration with Koshei - automatic rebuild of your package in your project when dependency change&lt;/p&gt;

&lt;p&gt;Enhance &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mock --chain&lt;/code&gt; to try to set %bootstrap when the standard loop fails. When the set succeeds, rebuild the bootstrapped package again without the %bootstrap macro.&lt;/p&gt;

&lt;p&gt;Contribute to fedpkg/koji to have machine-readable output.&lt;/p&gt;

&lt;p&gt;Building VM images for Cloud (osbuild-composer)&lt;/p&gt;

&lt;p&gt;If you have any idea which can ease packaging (especially the automation) then do not hesitate and share it with us. We may do that!&lt;/p&gt;

&lt;p&gt;The Community Packaging Team consists of Pavel Raiskup, Silvie Chlupova, Jakub Kadlcik, and Miroslav Suchý.&lt;/p&gt;

&lt;p&gt;Curious what &lt;a href=&quot;https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/message/R2MWYN7CRF34WKSRUUYNLAISQB47MHXI/&quot;&gt;we did in 2020&lt;/a&gt;?&lt;/p&gt;
</description>
        <pubDate>Thu, 20 Jan 2022 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/Copr-in-2021</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/Copr-in-2021</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for December 2021</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 20 Dec 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-december-2021</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-december-2021</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2021-11-11 release</title>
        <author>Silvie Chlupova</author>
        <description>
</description>
        <pubDate>Thu, 11 Nov 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/highlights</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/highlights</guid>
        
        
      </item>
    
      <item>
        <title>Rebuilding the entire RubyGems in Copr</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Tue, 09 Nov 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/rebuilding-the-entire-rubygems-in-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/rebuilding-the-entire-rubygems-in-copr</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2021-10-01 release</title>
        <author>Silvie Chlupova</author>
        <description>
</description>
        <pubDate>Fri, 01 Oct 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/highlights</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/highlights</guid>
        
        
      </item>
    
      <item>
        <title>AWS spot/on-demand Copr builders</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Mon, 02 Aug 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/aws-builders</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/aws-builders</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in Copr from July 2021</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Fri, 30 Jul 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-july-2021</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-july-2021</guid>
        
        
      </item>
    
      <item>
        <title>Fedora Copr farm of builders - status of July 2021</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Tue, 13 Jul 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/farm-of-builders-2021-07</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/farm-of-builders-2021-07</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2021-06-16 release</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Wed, 16 Jun 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/highlights</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/highlights</guid>
        
        
      </item>
    
      <item>
        <title>EOL Copr APIv1 and APIv2, pt.2</title>
        <author>Jakub Kadlčík</author>
        <description>&lt;p&gt;During the last year, we are incrementally dropping support for Copr’s
APIv1 and APIv2. We kindly ask you to migrate to &lt;a href=&quot;https://python-copr.readthedocs.io/en/latest/ClientV3.html&quot;&gt;APIv3&lt;/a&gt;. Some
reasoning and our motivation for doing so can be found the
&lt;a href=&quot;http://frostyx.cz/posts/copr-has-a-brand-new-api&quot;&gt;Copr has a brand new API&lt;/a&gt; blog post.&lt;/p&gt;

&lt;p&gt;According to the &lt;a href=&quot;https://fedora-copr.github.io/posts/EOL-APIv1-APIv2&quot;&gt;deprecation schedule&lt;/a&gt;, we just
took the following step:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;April 2021 - print warning on STDERR when you use APIv2 from
python3-copr and remove APIv1 from python3-copr library&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;That means that if you cannot migrate to APIv3 yet, you can still send
requests to APIv1 endpoints directly, without using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;python3-copr&lt;/code&gt;
library, or you can temporarily freeze on
&lt;a href=&quot;https://koji.fedoraproject.org/koji/buildinfo?buildID=1724184&quot;&gt;python-copr-1.109&lt;/a&gt; and &lt;a href=&quot;https://koji.fedoraproject.org/koji/buildinfo?buildID=1724194&quot;&gt;copr-cli-1.93&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Please don’t put aside the migration of your code for much longer. In
September the APIv1 is going to be dropped from the frontend and APIv2
from clients.&lt;/p&gt;

</description>
        <pubDate>Sun, 09 May 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/EOL-APIv1-APIv2-pt2</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/EOL-APIv1-APIv2-pt2</guid>
        
        
      </item>
    
      <item>
        <title>Highlights from 2021-04-28 release</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Wed, 28 Apr 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/highlights</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/highlights</guid>
        
        
      </item>
    
      <item>
        <title>Running fedora-review after Copr build</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Sun, 18 Apr 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/running-fedora-review-after-copr-build</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/running-fedora-review-after-copr-build</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in Copr for March 2021</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Fri, 26 Mar 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-march-2021</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-march-2021</guid>
        
        
      </item>
    
      <item>
        <title>Copr release 21.03</title>
        <author>Miroslav Suchý</author>
        <description>&lt;p&gt;We have deployed the new version of Copr. You can read full &lt;a href=&quot;https://docs.copr.fedorainfracloud.org/release-notes/2021-03-17.html&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The highlights are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Automatic run of Fedora Review tool&lt;/li&gt;
  &lt;li&gt;The centos-stream-8 chroot change&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 18 Mar 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/new-release</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/new-release</guid>
        
        
      </item>
    
      <item>
        <title>New Ansible module Copr</title>
        <author>Silvie Chlupova</author>
        <description>&lt;p&gt;We created a new Ansible module for Copr, which was added to the &lt;a href=&quot;https://github.com/ansible-collections/community.general/releases/tag/2.0.0&quot;&gt;community general collection&lt;/a&gt; in &lt;a href=&quot;https://galaxy.ansible.com/community/general&quot;&gt;Ansible galaxy&lt;/a&gt; during the release of the latest version 2.0.0. The module code can be found in the GitHub repository of the mentioned &lt;a href=&quot;https://github.com/ansible-collections/community.general/blob/2.0.0/plugins/modules/packaging/os/copr.py&quot;&gt;collection&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;synopsis&quot;&gt;Synopsis&lt;/h2&gt;

&lt;p&gt;This module can enable, disable or remove the specified repository.&lt;/p&gt;

&lt;h2 id=&quot;quick-setup&quot;&gt;Quick setup&lt;/h2&gt;

&lt;p&gt;To install a collection hosted in Galaxy:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ansible-galaxy collection install community.general
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also install the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ansible-collection-community-general&lt;/code&gt; package with our module as soon as the Fedora package version is updated to version 2.0 (currently available version is 1.0):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dnf install ansible-collection-community-general
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or you can use the tarball (version 2.0.0):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ansible-galaxy collection install https://github.com/ansible-collections/community.general/archive/2.0.0.tar.gz -p ./collections
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;module-usage&quot;&gt;Module usage&lt;/h2&gt;

&lt;p&gt;To use it in a playbook, specify: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;community.general.copr&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;examples-of-use-in-a-playbook&quot;&gt;Examples of use in a playbook&lt;/h3&gt;

&lt;p&gt;Use state &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;enabled&lt;/code&gt; to enable the Copr project, then use the name of the user/project and the chroot you wish to enable.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- name: Enable project Test of the user schlupov
  community.general.copr:
    host: copr.fedorainfracloud.org
    state: enabled
    name: schlupov/Test
    chroot: fedora-31-x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Use state &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;absent&lt;/code&gt; to remove the Copr project. The host is optional and copr.fedorainfracloud.org is used as the default. Likewise, chroot is not required, so if you use the module on fedora 32 and the x86_64 architecture, fedora-32-x86_64 will be used as chroot option.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- name: Remove project copr of the group copr
  community.general.copr:
    state: absent
    name: @copr/copr
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Use state &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;disabled&lt;/code&gt; to disable the Copr project. The repository can be seen in the /etc/yum.repos.d/ directory, but is set to disabled. On the other hand, in case of state absent, the repo file is completely removed from the system.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- name: Disable project copr of the group copr
  community.general.copr:
    state: disabled
    name: @copr/copr
    chroot: fedora-32-x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;parameters&quot;&gt;Parameters&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Parameter&lt;/th&gt;
      &lt;th&gt;Choices/Defaults&lt;/th&gt;
      &lt;th&gt;Comments&lt;/th&gt;
      &lt;th&gt;Required&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;host&lt;/td&gt;
      &lt;td&gt;Default: “copr.fedorainfracloud.org”&lt;/td&gt;
      &lt;td&gt;The Copr host to work with&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;protocol&lt;/td&gt;
      &lt;td&gt;Default: “https”&lt;/td&gt;
      &lt;td&gt;This indicate which protocol to use with the host&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;name&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;Copr project name, for example @copr/copr-dev&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;state&lt;/td&gt;
      &lt;td&gt;Default: “enabled”, Choices: “enabled”, “disabled”, “absent”&lt;/td&gt;
      &lt;td&gt;Whether to set this project as enabled, disabled or absent&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;chroot&lt;/td&gt;
      &lt;td&gt;Default: your “os-os_version-architecture”&lt;/td&gt;
      &lt;td&gt;The name of the chroot that you want to enable/disable/remove in the project, for example epel-7-x86_64. Default chroot is determined by the operating system, version of the operating system, and architecture on which the module is run&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

</description>
        <pubDate>Wed, 03 Feb 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/new-ansible-module-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/new-ansible-module-copr</guid>
        
        
      </item>
    
      <item>
        <title>Order your Copr builds using batches</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Mon, 04 Jan 2021 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-build-batches</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-build-batches</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR from December 2020</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 21 Dec 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-december-2020</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-december-2020</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR from October 2020</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 02 Nov 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/fedora-magazine-october-2020</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/fedora-magazine-october-2020</guid>
        
        
      </item>
    
      <item>
        <title>Submit Copr builds by GitHub “push” Actions</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Thu, 03 Sep 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/github-actions-and-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/github-actions-and-copr</guid>
        
        
      </item>
    
      <item>
        <title>Upvoting projects in Copr</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Tue, 18 Aug 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/upvoting-projects-in-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/upvoting-projects-in-copr</guid>
        
        
      </item>
    
      <item>
        <title>EOL Copr APIv1 and APIv2</title>
        <author>Miroslav Suchý</author>
        <description>&lt;p&gt;During Copr history, we got &lt;a href=&quot;http://frostyx.cz/posts/copr-has-a-brand-new-api&quot;&gt;three APIs&lt;/a&gt;. For a long time, we maintained all versions.&lt;/p&gt;

&lt;p&gt;We decided that it is time to remove the old versions. We are going to start with APiv1.&lt;/p&gt;

&lt;p&gt;The schedule is:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;September 2020 - print warning on STDERR when you use APIv1 from python3-copr.&lt;/li&gt;
  &lt;li&gt;April 2021 - print warning on STDERR when you use APIv2 from python3-copr and remove APIv1 from python3-copr library&lt;/li&gt;
  &lt;li&gt;September 2021 - remove APIv1 code from the frontend. I.e., Copr service will not understand APIv1 calls. Remove APIv2 from python3-copr library.&lt;/li&gt;
  &lt;li&gt;April 2022 - remove APIv2 code from the frontend. I.e., Copr service will not understand APIv2 calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I strongly encourage you to &lt;a href=&quot;https://python-copr.readthedocs.io/en/latest/client_v3/migration.html#migration&quot;&gt;migrate&lt;/a&gt; your scripts to &lt;a href=&quot;https://python-copr.readthedocs.io/en/latest/ClientV3.html&quot;&gt;APIv3&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Tue, 04 Aug 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/EOL-APIv1-APIv2</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/EOL-APIv1-APIv2</guid>
        
        
      </item>
    
      <item>
        <title>Deleting Multiple Builds in Copr</title>
        <author>Dominik Tureček</author>
        <description>&lt;p&gt;Previously, when you wanted to delete lots of build in the Copr, you had to do something like:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;for id in 10 12 13 15; do
    copr-cli delete-build $id
done
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This has been no problem for small projects. But it was a big issue for projects with thousands of packages (e.g., python rebuilds). After each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delete-build&lt;/code&gt; we run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;createrepo_c&lt;/code&gt; to update repository. And for these big projects, it can run for several minutes. It can easily take a day to delete hundreds of builds this way.&lt;/p&gt;

&lt;p&gt;Since the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copr-cli-1.87&lt;/code&gt; (going to be released this week), you are now able to delete a group of builds specified by their IDs with a single command in the following style:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;copr-cli delete-build 10 12 13 15
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This generates one action for the backend, deletes all the builds at once and it calls &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;createrepo_c&lt;/code&gt; only once. This leads to a much shorter time needed for deleting larger numbers of builds.&lt;/p&gt;
</description>
        <pubDate>Tue, 23 Jun 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/deleting-list-of-builds</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/deleting-list-of-builds</guid>
        
        
      </item>
    
      <item>
        <title>Runtime dependencies in Copr</title>
        <author>Dominik Tureček</author>
        <description>&lt;p&gt;In the last release, we’ve added support for runtime dependencies in Copr. If your project needs another package to run, but you don’t need said package as a part of your project, you can have it as a runtime dependency instead. You can now specify other repositories (either Copr projects or external) as runtime dependencies. These repositories will then be enabled alongside your Copr project.&lt;/p&gt;

&lt;p&gt;We are currently testing the feature and are looking for users’ feedback - please share any issues that you might find. Later, once this feature is tested, we plan to generalize it and add it to dnf and createrepo_c as well.&lt;/p&gt;

&lt;h3 id=&quot;how-to-add-runtime-dependencies-to-your-copr-project&quot;&gt;How to add runtime dependencies to your Copr project&lt;/h3&gt;
&lt;p&gt;To add runtime dependencies to your Copr project, navigate to your project’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Settings/Project Details&lt;/code&gt; tab. There, in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Other options&lt;/code&gt;, is a field &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Runtime dependencies&lt;/code&gt; where you can specify a space-separated list of dependencies:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;To specify another Copr project as a runtime dependency, add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copr://user-name/project-name&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;To specify an external repository as a runtime dependency, add a URL to its repo file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/runtime-dependencies/runtime-dependencies-1.png&quot; alt=&quot;Runtime dependencies field in project&apos;s settings.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can specify as many runtime dependencies as you want. Note that the runtime dependencies are resolved transitively, e.g., if your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProjectA&lt;/code&gt; depends on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProjectB&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProjectB&lt;/code&gt; depends on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProjectC&lt;/code&gt;, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProjectA&lt;/code&gt; will have both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProjectB&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProjectC&lt;/code&gt; as its dependencies.&lt;/p&gt;

&lt;h3 id=&quot;enabling-a-project-with-runtime-dependencies&quot;&gt;Enabling a project with runtime dependencies&lt;/h3&gt;
&lt;p&gt;So, if I enable a Copr project that has a bunch of dependencies, how do I know what repositories I actually enabled? First, you can see a list of all runtime dependencies on the project’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Overview&lt;/code&gt; tab:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/runtime-dependencies/runtime-dependencies-2.png&quot; alt=&quot;List of runtime dependencies of a Copr project.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Second, if you download a repofile of such a project, it lists all the dependencies. And last, if you are using the dnf copr plugin for enabling Copr projects (using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnf copr enable&lt;/code&gt; command), it will notify you about all the dependencies. Although the dependencies come enabled by default, the dnf copr plugin gives you an option to disable them.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/runtime-dependencies/runtime-dependencies-3.png&quot; alt=&quot;Dnf warning when enabling a project with dependencies.&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 02 Jun 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/runtime-dependencies</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/runtime-dependencies</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for May</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Mon, 04 May 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine</guid>
        
        
      </item>
    
      <item>
        <title>Proxies for Copr repositories</title>
        <author>Miroslav Suchý</author>
        <description>&lt;p&gt;I just enabled the content delivery network (CDN) for Copr repositories.
It is provided by &lt;a href=&quot;https://aws.amazon.com/cloudfront/&quot;&gt;CloudFront&lt;/a&gt; from &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;AWS&lt;/a&gt;. And it is provided for free by Amazon to Fedora.&lt;/p&gt;

&lt;p&gt;Technically the original URL&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;copr-be.cloud.fedoraproject.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;is now accessible using&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;download.copr.fedorainfracloud.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The original URL is and will be available. You can still use it. The second one is CNAME for the CDN and should be much
faster for you.&lt;/p&gt;

&lt;p&gt;The CDN is automatically enabled for new projects. Though, if you already have enabled some copr repository on your
workstation/server, it will still use the old URL.
It is fine; it will continue to work.
If you want to enable CDN for your repos you have to run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dnf copr enable some/project
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;for every copr project you have enabled. Or manually change the URL in the repo file.&lt;/p&gt;

&lt;p&gt;If you experience any problem with CDN, please let me know.&lt;/p&gt;
</description>
        <pubDate>Tue, 04 Feb 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-cdn</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-cdn</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for January</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Wed, 29 Jan 2020 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for October</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-october</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-october</guid>
        
        
      </item>
    
      <item>
        <title>Copr&apos;s WebUI supports Kerberos</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Tue, 08 Oct 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/kerberos</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/kerberos</guid>
        
        
      </item>
    
      <item>
        <title>Copr ported to fedora-messaging</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Tue, 10 Sep 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-messaging</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-messaging</guid>
        
        
      </item>
    
      <item>
        <title>Create your portfolio with pinned projects</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 19 Aug 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/create-your-portfolio-with-pinned-projects</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/create-your-portfolio-with-pinned-projects</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for August</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Mon, 05 Aug 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-august</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-august</guid>
        
        
      </item>
    
      <item>
        <title>Parse log from failed build using Mock</title>
        <author>Silvie Chlupova</author>
        <description>&lt;p&gt;Into &lt;a href=&quot;https://github.com/rpm-software-management/mock&quot;&gt;mock&lt;/a&gt; has been added a new feature called &lt;a href=&quot;https://github.com/rpm-software-management/mock/blob/devel/mock/py/mock-parse-buildlog.py&quot;&gt;mock-parse-buildlog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This piece of code will help you identify what caused your build to fail. Currently, mock-parse-buildlog knows only two situations that could occur and cause that a build fail. First is that some files are in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%buildroot&lt;/code&gt; but not in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%files&lt;/code&gt; and the second one is that some files are in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%files&lt;/code&gt; but not in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%buildroot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Part of the code has been taken from &lt;a href=&quot;https://github.com/rebase-helper&quot;&gt;rebase-helper&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;an-example-of-how-it-works&quot;&gt;An example of how it works&lt;/h4&gt;

&lt;p&gt;Run as:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mock-parse-buildlog --path /path/to/log/build.log&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And the result is:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Error type: Build failed because problematic files are in %buildroot but not
in %files

Problematic files:
/usr/share/locale/sv/LC_MESSAGES/hello.mo
/usr/share/locale/uk/LC_MESSAGES/hello.mo
/usr/share/locale/pt_BR/LC_MESSAGES/hello.mo
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, if you see an error it means that mock-parse-buildlog couldn’t recognize what caused that the build failed thus it cannot determine the problem and help you solve it. And this is the spot where other users of mock can help us. If you know that something once (or more times) caused that your build failed, please let us know by creating a Github issue because the same problem may occur with someone else. We can work together to improve this tool.&lt;/p&gt;
</description>
        <pubDate>Fri, 19 Jul 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/mock-parse-buildlog</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/mock-parse-buildlog</guid>
        
        
      </item>
    
      <item>
        <title>Copr&apos;s Dist-Git</title>
        <author>Miroslav Suchý</author>
        <description>&lt;p&gt;Fedora use &lt;a href=&quot;https://github.com/release-engineering/dist-git&quot;&gt;dist-git&lt;/a&gt; as &lt;a href=&quot;https://docs.fedoraproject.org/en-US/packaging-guidelines/#_spec_maintenance_and_canonicity&quot;&gt;the ultimate source&lt;/a&gt; for SPEC files.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;https://copr.fedorainfracloud.org/&quot;&gt;Copr&lt;/a&gt;, we use dist-git to store sources as well. However, our use case is different.
In the past, Copr only allowed to build from URL. You provided a URL to your SRC.RPM and Copr
downloaded it and built it. This was a problem when the user wanted to resubmit the build. The original URL very often did not exists anymore.
Therefore we came with an idea to store the SRC.RPM somewhere. And obviously, the dist-git was the first idea.&lt;/p&gt;

&lt;p&gt;Though there is a big difference between Fedora’s dist-git and Copr’s dist-git. In Fedora, only the owner interacts with dist-git. He maintains the branches, addresses pull requests, resolves conflicts, etc. In Copr, it is different. The biggest user of Copr’s dist-git is Copr itself. Copr uploads new SRC.RPM - either those available from URL, or uploaded via API, or after creating the SRC.RPM from upstream git. While you can clone the dist-git, or see it via cgit, you are not allowed to write to your dist-git. It is internal storage for Copr.&lt;/p&gt;

&lt;p&gt;This has one implication: if you want to send maintainer a patch for his SPEC file, please do not use the SPEC file from Copr’s dist git. The spec file is not the original source (for the maintainer of the project). It can be created on the fly - e.g. using pyp2rpm or gem2spec. You should always contact the owner of the project and ask him, what is his preferred way to contribute to the project.&lt;/p&gt;
</description>
        <pubDate>Thu, 06 Jun 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/dist-git</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/dist-git</guid>
        
        
      </item>
    
      <item>
        <title>Prioritize BuildRequires from Copr</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Sun, 28 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/prioritize-buildrequires-from-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/prioritize-buildrequires-from-copr</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for April</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Sat, 20 Apr 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-april</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-april</guid>
        
        
      </item>
    
      <item>
        <title>Copr has a new RSS feed</title>
        <author>Jan Buchmaier</author>
        <description>&lt;p&gt;Now you can keep track of every new Copr project thanks to our new feed.&lt;/p&gt;

&lt;h2 id=&quot;what-is-the-content-of-the-feed&quot;&gt;What is the content of the feed&lt;/h2&gt;

&lt;p&gt;Our RSS feed contains two hundred most recent projects.&lt;/p&gt;

&lt;p&gt;And in every item you can find:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;author’s and project’s name&lt;/li&gt;
  &lt;li&gt;link to the project&lt;/li&gt;
  &lt;li&gt;simple description&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;where-to-find-it&quot;&gt;Where to find it&lt;/h2&gt;

&lt;p&gt;You can visit &lt;a href=&quot;https://copr.fedorainfracloud.org/rss/&quot; title=&quot;RSS feed&quot;&gt;our feed&lt;/a&gt;.&lt;/p&gt;

</description>
        <pubDate>Fri, 29 Mar 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/Copr-new-rss-feed</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/Copr-new-rss-feed</guid>
        
        
      </item>
    
      <item>
        <title>Copr - Removing outdated chroots</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Sun, 10 Mar 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-removing-outdated-chroots</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-removing-outdated-chroots</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for February</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Mon, 11 Feb 2019 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-february</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-february</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for December</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Fri, 21 Dec 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-december</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-december</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for October</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Tue, 30 Oct 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-october</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-october</guid>
        
        
      </item>
    
      <item>
        <title>Starting your own distro</title>
        <author>clime</author>
        <description>
</description>
        <pubDate>Tue, 18 Sep 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/starting-your-own-distro</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/starting-your-own-distro</guid>
        
        
      </item>
    
      <item>
        <title>Copr has a brand new API</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Wed, 08 Aug 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-has-a-brand-new-api</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-has-a-brand-new-api</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for July</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Fri, 20 Jul 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-july</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-july</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for June</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Mon, 04 Jun 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-june</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-june</guid>
        
        
      </item>
    
      <item>
        <title>CI/CD with Copr, finally for any project?</title>
        <author>Pavel Raiskup</author>
        <description>
</description>
        <pubDate>Mon, 21 May 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/custom-source-method</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/custom-source-method</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for April</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Tue, 17 Apr 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-april</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-april</guid>
        
        
      </item>
    
      <item>
        <title>Modularity features in Mock</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 12 Mar 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/modularity-features-in-mock</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/modularity-features-in-mock</guid>
        
        
      </item>
    
      <item>
        <title>Modules with Copr packages</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Thu, 08 Mar 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/modules-with-copr-packages</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/modules-with-copr-packages</guid>
        
        
      </item>
    
      <item>
        <title>Prioritize BuildRequires from Copr</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 05 Mar 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/prioritize-buildrequires-from-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/prioritize-buildrequires-from-copr</guid>
        
        
      </item>
    
      <item>
        <title>How to build modules in Copr</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Wed, 28 Feb 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/how-to-build-modules-in-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/how-to-build-modules-in-copr</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for February</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Fri, 23 Feb 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-february</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-february</guid>
        
        
      </item>
    
      <item>
        <title>4 cool new projects to try in COPR for January</title>
        <author>Dominik Tureček</author>
        <description>
</description>
        <pubDate>Wed, 24 Jan 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-fedora-magazine-january</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-fedora-magazine-january</guid>
        
        
      </item>
    
      <item>
        <title>Copr Modularity in retrospect</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Fri, 12 Jan 2018 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-modularity-in-retrospect</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-modularity-in-retrospect</guid>
        
        
      </item>
    
      <item>
        <title>How to run a database in %check section of RPM spec file</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Tue, 28 Nov 2017 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/mock-daemon</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/mock-daemon</guid>
        
        
      </item>
    
      <item>
        <title>Let the blogging begin!</title>
        <author>Jakub Kadlčík</author>
        <description>&lt;p&gt;Welcome to the official blog for the Copr project. Its purpose is to keep you updated with new features, sharing how-to tutorials and other kinds of interesting information. Posts are written mainly by developers, but we encourage you to write and submit your posts too. A topic of an article can be absolutely anything that is related to Copr.&lt;/p&gt;

&lt;h2 id=&quot;how-to-write-a-post&quot;&gt;How to write a post&lt;/h2&gt;

&lt;p&gt;It is fairly easy to write a new post. The whole process is described in the &lt;a href=&quot;https://github.com/fedora-copr/fedora-copr.github.io/blob/master/README.md&quot;&gt;README&lt;/a&gt; and explains how to create a post, how it should be formatted, how to run this page locally to view the changes and how to submit the pull request if everything looks as you wanted. If you miss any information, please &lt;a href=&quot;/contact&quot;&gt;contact us&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;technologies&quot;&gt;Technologies&lt;/h2&gt;
&lt;p&gt;This page is built on &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;, it’s source code is available on &lt;a href=&quot;https://github.com/fedora-copr/fedora-copr.github.io&quot;&gt;GitHub&lt;/a&gt; and is deployed via &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;. The comment section is provided by &lt;a href=&quot;https://disqus.com/&quot;&gt;Disqus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We produce two RSS feeds, one is called &lt;a href=&quot;/feed.xml&quot;&gt;feed.xml&lt;/a&gt; and is aimed at users to subscribe. It contains all posts, even the ones that are hosted on external sites such as a personal blog of a particular developer. The second feed is called &lt;a href=&quot;/planet.xml&quot;&gt;planet.xml&lt;/a&gt; and is subscribed by &lt;a href=&quot;http://fedoraplanet.org/&quot;&gt;Planet Fedora&lt;/a&gt;. This one contains only posts hosted on this site.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Tell us your impressions in the comment section below.&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Nov 2017 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/let-the-blogging-begin</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/let-the-blogging-begin</guid>
        
        
      </item>
    
      <item>
        <title>Copr stack dockerized!</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Tue, 17 Oct 2017 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-stack-dockerized</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-stack-dockerized</guid>
        
        
      </item>
    
      <item>
        <title>Reproducible Copr builds</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Sat, 14 Oct 2017 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/reproducible-copr-builds</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/reproducible-copr-builds</guid>
        
        
      </item>
    
      <item>
        <title>Copr Rebuild Tools - Tito backend</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Fri, 14 Jul 2017 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-rebuild-tools-tito-backend</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-rebuild-tools-tito-backend</guid>
        
        
      </item>
    
      <item>
        <title>DistGit 1.0</title>
        <author>Michal Novotný</author>
        <description>
</description>
        <pubDate>Sat, 20 May 2017 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/DistGit-1.0</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/DistGit-1.0</guid>
        
        
      </item>
    
      <item>
        <title>Copr &lt;3 Modularity</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Fri, 21 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-loves-modularity</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-loves-modularity</guid>
        
        
      </item>
    
      <item>
        <title>Copr Rebuild Tools</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 15 Aug 2016 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-rebuild-tools</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-rebuild-tools</guid>
        
        
      </item>
    
      <item>
        <title>Copr - Threads support for dist-git</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Fri, 08 Jul 2016 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-threads-support-for-dist-git</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-threads-support-for-dist-git</guid>
        
        
      </item>
    
      <item>
        <title>Copr - Rubygems</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Sat, 28 May 2016 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-rubygems</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-rubygems</guid>
        
        
      </item>
    
      <item>
        <title>Copr CLI - Building from Tito, Mock and PyPI</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Mon, 23 May 2016 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-cli-building-from-tito-mock-and-pypi</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-cli-building-from-tito-mock-and-pypi</guid>
        
        
      </item>
    
      <item>
        <title>WIP - rebuilding all PyPi modules as RPM packages</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Thu, 21 Apr 2016 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/wip-rebuilding-all-pypi-modules-as-rpm-packages</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/wip-rebuilding-all-pypi-modules-as-rpm-packages</guid>
        
        
      </item>
    
      <item>
        <title>New features in Copr</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Tue, 29 Mar 2016 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/new-features-in-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/new-features-in-copr</guid>
        
        
      </item>
    
      <item>
        <title>Copr - Forking Projects</title>
        <author>Jakub Kadlčík</author>
        <description>
</description>
        <pubDate>Sun, 13 Mar 2016 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-forking-projects</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-forking-projects</guid>
        
        
      </item>
    
      <item>
        <title>Copr statistics</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Fri, 27 Mar 2015 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/copr-statistics</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/copr-statistics</guid>
        
        
      </item>
    
      <item>
        <title>How to get notification about your builds in Copr</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Fri, 21 Mar 2014 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/how-to-get-notification-about-your-builds-in-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/how-to-get-notification-about-your-builds-in-copr</guid>
        
        
      </item>
    
      <item>
        <title>Interesting projects in Copr</title>
        <author>Miroslav Suchý</author>
        <description>
</description>
        <pubDate>Thu, 13 Mar 2014 00:00:00 +0000</pubDate>
        <link>https://fedora-copr.github.io//posts/interesting-projects-in-copr</link>
        <guid isPermaLink="true">https://fedora-copr.github.io//posts/interesting-projects-in-copr</guid>
        
        
      </item>
    
  </channel>
</rss>
