Linux中國

怎麼在 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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國