怎麼在 Fedora 中建立我的第一個 RPM 包?

Justin W. Flory發表於2022-11-28

怎麼在 Fedora 中建立我的第一個 RPM 包?

過了這個夏天,我把我的桌面環境遷移到了 i3,這是一個瓦片式視窗管理器。當初,切換到 i3 是一個挑戰,因為我必須去處理許多以前 GNOME 幫我處理的事情。其中一件事情就是改變螢幕亮度。 xbacklight 這個在膝上型電腦上改變背光亮度的標準方法,它在我的硬體上不工作了。

最近,我發現一個改變背光亮度的工具 brightlight。我決定去試一下它,它工作在 root 許可權下。但是,我發現 brightligh 在 Fedora 下沒有 RPM 包。我決定,是在 Fedora 下嘗試建立一個包的時候了,並且可以學習怎麼去建立一個 RPM 包。

在這篇文章中,我將分享以下的內容:

  • 建立 RPM SPEC 檔案
  • 在 Koji 和 Copr 中構建包
  • 使用除錯包處理一個問題
  • 提交這個包到 Fedora 包集合中

前提條件

在 Fedora 上,我安裝了包構建過程中所有步驟涉及到的包。

sudo dnf install fedora-packager fedpkg fedrepo_req copr-cli

建立 RPM SPEC 檔案

建立 RPM 包的第一步是去建立 SPEC 檔案。這些規範,或者是指令,它告訴 RPM 怎麼去構建包。這是告訴 RPM 從包的原始碼中建立一個二進位制檔案。建立 SPEC 檔案看上去是整個包處理過程中最難的一部分,並且它的難度取決於專案。

對我而言,幸運的是,brightlight 是一個用 C 寫的簡單應用程式。維護人員用一個 Makefile 使建立二進位制應用程式變得很容易。構建它只是在倉庫中簡單執行 make 的問題。因此,我現在可以用一個簡單的專案去學習 RPM 打包。

查詢文件

谷歌搜尋 “how to create an RPM package” 有很多結果。我開始使用的是 IBM 的文件。然而,我發現它理解起來非常困難,不知所云(雖然十分詳細,它可能適用於複雜的 app)。我也在 Fedora 維基上找到了 建立包 的介紹。這個文件在構建和處理上解釋的非常好,但是,我一直困惑於 “怎麼去開始呢?”

最終,我找到了 RPM 打包指南,它是大神 Adam Miller 寫的。這些介紹非常有幫助,並且包含了三個優秀的示例,它們分別是用 Bash、C 和 Python 編寫的程式。這個指南幫我很容易地理解了怎麼去構建一個 RPM SPEC,並且,更重要的是,解釋了怎麼把這些片斷拼到一起。

有了這些之後,我可以去寫 brightlight 程式的我的 第一個 SPEC 檔案 了。因為它是很簡單的,SPEC 很短也很容易理解。我有了 SPEC 檔案之後,我發現其中有一些錯誤。處理掉一些錯誤之後,我建立了源 RPM (SRPM) 和二進位制 RPM,然後,我解決了出現的每個問題。

rpmlint SPECS/brightlight.spec
rpmbuild -bs SPECS/brightlight.spec
rpmlint SRPMS/brightlight-5-1.fc26.src.rpm
rpmbuild -bb SPECS/brightlight-5-1.fc26.x86_64.rpm
rpmlint RPMS/x86_64/brightlight-5-1.fc26.x86_64.rpm

現在,我有了一個可用的 RPM,可以傳送到 Fedora 倉庫了。

在 Copr 和 Koji 中構建

接下來,我讀了該 指南 中關於怎麼成為一個 Fedora 打包者。在提交之前,他們鼓勵打包者透過在在 Koji 中託管、並在 Copr 中構建專案來測試要提交的包。

使用 Copr

首先,我為 brightlight 建立了一個 Copr 倉庫Copr 是在 Fedora 的基礎設施中的一個服務,它構建你的包,並且為你任意選擇的 Fedora 或 EPEL 版本建立一個定製倉庫。它對於快速託管你的 RPM 包,並與其它人去分享是非常方便的。你不需要特別操心如何去託管一個 Copr 倉庫。

我從 Web 介面建立了我的 Copr 專案,但是,你也可以使用 copr-cli 工具。在 Fedora 開發者網站上有一個 非常優秀的指南。在該網站上建立了我的倉庫之後,我使用這個命令構建了我的包。

copr-cli build brightlight SRPMS/brightlight.5-1.fc26.src.rpm

我的包在 Corp 上成功構建,並且,我可以很容易地在我的 Fedora 系統上成功安裝它。

使用 Koji

任何人都可以使用 Koji 在多種架構和 Fedora 或 CentOS/RHEL 版本上測試他們的包。在 Koji 中測試,你必須有一個源 RPM。我希望 brightlight 包在 Fedora 所有的版本中都支援,因此,我執行如下的命令:

koji build --scratch f25 SRPMS/brightlight-5-1.fc26.src.rpm
koji build --scratch f26 SRPMS/brightlight-5-1.fc26.src.rpm
koji build --scratch f27 SRPMS/brightlight-5-1.fc26.src.rpm

它花費了一些時間,但是,Koji 構建了所有的包。我的包可以很完美地執行在 Fedora 25 和 26 中,但是 Fedora 27 失敗了。 Koji 模擬構建可以使我走在正確的路線上,並且確保我的包構建成功。

問題:Fedora 27 構建失敗!

現在,我已經知道我的 Fedora 27 上的包在 Koji 上構建失敗了。但是,為什麼呢?我發現在 Fedora 27 上有兩個相關的變化。

這些變化意味著 RPM 包必須使用一個 debuginfo 包去構建。這有助於排錯或除錯一個應用程式。在我的案例中,這並不是關鍵的或者很必要的,但是,我需要去構建一個。

感謝 Igor Gnatenko,他幫我理解了為什麼我在 Fedora 27 上構建包時需要去將這些增加到我的包的 SPEC 中。在 %make_build 宏指令之前,我增加了這些行。

export CFLAGS="%{optflags}"
export LDFLAGS="%{__global_ldflags}"

我構建了一個新的 SRPM 並且提交它到 Koji 去在 Fedora 27 上構建。成功了,它構建成功了!

提交這個包

現在,我在 Fedora 25 到 27 上成功校驗了我的包,是時候為 Fedora 打包了。第一步是提交這個包,為了請求一個包評估,要在 Red Hat Bugzilla 建立一個新 bug。我為 brightlight 建立了一個工單。因為這是我的第一個包,我明確標註它 “這是我的第一個包”,並且我尋找一個發起人。在工單中,我連結 SPEC 和 SRPM 檔案到我的 Git 倉庫中。

進入 dist-git

Igor Gnatenko 發起我進入 Fedora 打包者群組,並且在我的包上留下反饋。我學習了一些其它的關於 C 應用程式打包的特定的知識。在他響應我之後,我可以在 dist-git 上申請一個倉庫,Fedora 的 RPM 包集合倉庫為所有的 Fedora 版本儲存了 SPEC 檔案。

一個很方便的 Python 工具使得這一部分很容易。fedrepo-req 是一個用於建立一個新的 dist-git 倉庫的請求的工具。我用這個命令提交我的請求。

fedrepo-req brightlight \
    --ticket 1505026 \
    --description "CLI tool to change screen back light brightness" \
    --upstreamurl https://github.com/multiplexd/brightlight

它為我在 fedora-scm-requests 倉庫建立了一個新的工單。這是一個我是管理員的 建立的倉庫。現在,我可以開始幹了!

My first RPM in Fedora dist-git – woohoo!

與 dist-git 一起工作

接下來,fedpkg 是用於和 dist-git 倉庫進行互動的工具。我改變當前目錄到我的 git 工作目錄,然後執行這個命令。

fedpkg clone brightlight

fedpkg 從 dist-git 克隆了我的包的倉庫。對於這個僅有的第一個分支,你需要去匯入 SRPM。

fedpkg import SRPMS/brightlight-5-1.fc26.src.rpm

fedpkg 匯入你的包的 SRPM 到這個倉庫中,然後設定源為你的 Git 倉庫。這一步對於使用 fedpkg 是很重要的,因為它用一個 Fedora 友好的方去幫助規範這個倉庫(與手動新增檔案相比)。一旦你匯入了 SRPM,推送這個改變到 dist-git 倉庫。

git commit -m "Initial import (#1505026)."
git push

構建包

自從你推送第一個包匯入到你的 dist-git 倉庫中,你已經準備好了為你的專案做一次真實的 Koji 構建。要構建你的專案,執行這個命令。

fedpkg build

它會在 Koji 中為 Rawhide 構建你的包,這是 Fedora 中的非版本控制的分支。在你為其它分支構建之前,你必須在 Rawhide 分支上構建成功。如果一切構建成功,你現在可以為你的專案的其它分支傳送請求了。

fedrepo-req brightlight f27 -t 1505026
fedrepo-req brightlight f26 -t 1505026
fedrepo-req brightlight f25 -t 1505026

關於構建其它分支的注意事項

一旦你最初匯入了 SRPM,如果你選擇去建立其它分支,記得合併你的主分支到它們。例如,如果你後面為 Fedora 27 請求一個分支,你將需要去使用這些命令。

fedpkg switch-branch f27
git merge master
git push
fedpkg build

提交更新到 Bodhi

這個過程的最後一步是,把你的新包作為一個更新包提交到 Bodhi 中。當你初次提交你的更新包時,它將去測試這個倉庫。任何人都可以測試你的包並且增加 karma 到該更新中。如果你的更新接收了 3 個以上的投票(或者像 Bodhi 稱它為 karma),你的包將自動被推送到穩定倉庫。否則,一週之後,推送到測試倉庫中。

要提交你的更新到 Bodhi,你僅需要一個命令。

fedpkg update

它為你的包用一個不同的配置選項開啟一個 Vim 視窗。一般情況下,你僅需要去指定一個 型別(比如,newpackage)和一個你的包評估的票據 ID。對於更深入的講解,在 Fedora 維基上有一篇更新的指南

在儲存和退出這個檔案後,fedpkg 會把你的包以一個更新包提交到 Bodhi,最後,同步到 Fedora 測試倉庫。我也可以用這個命令去安裝我的包。

sudo dnf install brightlight -y --enablerepo=updates-testing --refresh

穩定倉庫

最近提交了我的包到 Fedora 26 穩定倉庫,並且不久將進入 Fedora 25Fedora 27 穩定倉庫。感謝幫助我完成我的第一個包的每個人。我期待有更多的機會為發行版新增包。


via: https://blog.justinwflory.com/2017/11/first-rpm-package-fedora/

作者:JUSTIN W. FLORY 譯者:qhwdw 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章