前言
- 本篇假設已經擁有Ubuntu社群帳號。
- 用ubuntu帳號 登入 ppa (https://launchpad.net/)
- opengpg 產生很麻煩 強力建議直接使用 ubuntu 套件 gpa 完成。 如果要下command也可以到launchpadhelp 網頁尋找答案,本篇不贅述。
- gpg 在generation keys 時會產生再 ~/.gnupg 的資料夾
- refer: https://blog.elleryq.idv.tw/2010/09/debian-package-ppa.html
- ppa - Using a Personal Package Archive (PPA), you can distribute software and updates directly to Ubuntu users. Create your source package, upload it and Launchpad will build binaries and then host them in your own apt repository.
Generate opengpg Key
# 安裝 gpg 、 gpa
$ sudo apt install gpg gpa
# 打開gpa
$ gpa
打開後會直接有generation key 的提示,如果沒有就點選菜單 keys-> new Keys
填寫 username、 email、 pharse key 完成後就會看到一把鑰匙在列表上
這邊會用到一些操作
點選key,並按右鍵:
1. Copy fingerprint: 等同於 command "gpg --fingerprint" 55XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2. Copy : 這邊會複製 public keys, 這東西要丟上key server
3. Copy Private Key: 這邊會複製 private keys。
照步驟來做,先處理 key server 的部分,這樣ppa才能抓到:
- 遞交 public key 給 key server (https://keyserver.ubuntu.com/) => 點選 submit keys 將public keys 貼上遞交。
- 遞交完成後 回到上一頁, 將fingerprint 貼上後按 search, 如果步驟1有成功可以在此步驟看到訊息。
- 前往(https://launchpad.net/~yourusername)。
- Overview -> OpenPGP keys: => 點選鉛筆按鈕。
- Import an OpenPGP key -> 填寫 Fingerprint -> click “import key” button => wait a monment to receive E-Mail.
- 這時你就會收到信件,打開你在ubuntu 註冊用的信箱會收到認證的信。 (Launchpad: Confirm your OpenPGP Key 的標題)。
- 會看到內容有一段 —–BEGIN PGP MESSAGE—– => … =>—–END PGP MESSAGE—– 結尾將其複製,並存成 opgpm.txt。
- 使用 gpg -d opgpm.txt 解碼信件。
- 開啟 browser 去解碼信件內容指定的網址 https://launchpad.net/token/XXXXXXXXXXXXXXXXXX => 點選continue 即可完成認證
之後你的 PPA profile 就會顯示 OpenGPG keys
# 1. 將gmail 收到的內容貼上在 opgpm.txt
$ vim opgpm.txt
-----BEGIN PGP MESSAGE-----
hQEMA3xPow8dF9nLAQf/...
...
zgwMEmx+GLRyht0MZmYFC2flXm2F5g==
=N7G2
-----END PGP MESSAGE-----
# 2. 解碼信件
$ gpg -d opgpm.txt
gpg: encrypted with 2048-bit RSA key, ID 7C4FA30F1D17D9CB, created 2023-09-18
"[your-username] your-email@gmail.com"
Here are the instructions for confirming the OpenPGP key registration that we
received for use in Launchpad.
Requester details:
User name : TsaiYuYan
Email address: your-email@gmail.com
Key details:
Key type : 2048R
Fingerprint : 55XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
UIDs:
your-email@gmail.com
Please go here to finish adding the key to your Launchpad account:
https://launchpad.net/token/XXXXXXXXXXXXXXXXXX
Build debian package
去我的 github clone example 專案。
$ tree deploy/deb_overwrite/debian
deploy/deb_overwrite/debian/
├── advvcom-daemon.postinst
├── advvcom-dkms.lintian-overrides
├── advvcom-dkms.postinst
├── advvcom-dkms.prerm
├── changelog
├── compat
├── control
├── copyright
├── README.Debian
├── rules
└── source
├── format
└── lintian-overrides
1 directory, 12 files
$ bash deploy/packaging_deb.sh
# shell script 關鍵的指令是 debuild
# build .deb file
# build binary deb package,下面兩行 可以build 出deb 可以直接安裝測試
# dpkg-buildpackage -b -rfakeroot -us -uc
# debuild -b -us -uc -rfakeroot
# build source deb package,這個是將source code 上傳到ppa 由指定的 distribuition 去build 展開。
debuild -S -sa -k"your-fingerprint"
Try to install binary deb and debug
$ cd object/deb_object/
# 移除 deb package
$ sudo apt remove [your-package-name] -y
# 安裝deb package
# 這有gui
$ sudo gdebi-gtk [your-package-name]_1.0-1_all.deb
# 或是使用
$ sudo dpkg -i [your-package-name]_1.0-1_all.deb
$ sudo apt-get install -f
這一步驟主要是要檢查 postinst, preinst、postrm、prerm 這些script 有沒有錯誤。
Debian folder introduction
- rule:這最重要,實際上是Makefile,後面具體介紹;
- control:這個是軟體包的描述,照著內容敲吧,section 之要遵循 debian 的約定,比如 kernel 就是一個 section,其他自便吧
- changelog:這個是打包版本的變更,每個版本開頭裡,目標distro一般寫 unstable,urgency 一般是 low
- README.Debian:是對這個包的說明,給人看的
- 可執行腳本:postinst 和 prerm 比較常用,分別是在安裝之後進行配置和卸載之前進行清理的,preinst 和 postrm 一般用的不多。 其他文件各有各的用處,.ex 結尾的都是例子,如果用的上就用,用不上的可以考慮刪除。
Upload Source deb package to PPA
1. edit .dput.cf
# .dput.cf
$ cat ~/.dput.cf
[ppa]
fqdn = ppa.launchpad.net
method = ftp
incoming = ~[your-username]/[your-ppaname]/ubuntu
login = anonymous
allow_unsigned_uploads = 0
2. dput source changes file
# amd64 (not use) <= 這個會被reject
# debsign -k your-fingerprint [your-package-name]_1.0_amd64.changes
# dput ppa:[your-username]/[your-ppaname] [your-package-name]_1.0-1_amd64.changes
# 這個正解
$ dput ppa:[your-username]/[your-ppaname] [your-package-name]_1.0_source.changes
# example
# dput ppa:yuyan310362/test-ppa object/deb_daemon/advvcom_1.00.4-0ppa~ubuntu24.04_source.changes
3. recieve email after dput, and check committing result
最後一步驟, 只要 dput 後,就準備去收信,如果收到 Rejected。
有遇過的問題如下:
- changelog Unrelease 不存在之類的,這邊因為要上傳到ppa 所以changelog 有些魔改,就是一般 debian changelog 裡是寫 unstable、experiment,在這裡要改為 lucid、hardy。
就是填寫 ubuntu os的代號 jammy(ubuntu22.04),lunar(ubuntu23.04)、mantic(ubuntu23.10)。 - 版本號已存在,目前要馬去網站上刪除版本(要等半小時~1小時以上),不然就是手動升版。很麻煩。
- 上傳的東西混雜mixed binary file with source code 啥的,在PPA上只能上傳 debuild -S 的 Source deb, 所以一般 build 好的 binary deb 會被回絕。
如果收到 Accepted, 就去看看build結果怎麼樣,build 的結果大約幾分鐘就可以看到,如果沒過就很不幸要重新進版修改再上傳,如果 build 過,大約要等半小~1小時才能在網站看看到ppa 幫你產生的 deb file 下載。
Using apt install to try ppa
# 註冊你的 key,不然會被說沒sign 過的東西會被拒絕安裝。
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys your-fingerprint
# 加入 repository
$ sudo add-apt-repository ppa:[your-username]/[your-ppaname]
$ sudo apt update
# 移除 repository
$ sudo add-apt-repository --remove ppa:[your-username]/[your-ppaname]
# 安裝 package
$ sudo apt install [your-package-name]
# 移除 package
$ sudo apt remove [your-package-name]
總結規劃
Origin
AE & 客戶 -> RD - fix -> Github - test -> QA -> Release
- 又急又趕,修復時程卡在RD與QA。
- 客戶體驗不佳。
- 被動。
Changed
RD - (mainline + dkms + pbuilder) -> deploy to PPA -> build deb package -> QA apt install && update && upgrade
- 超前部屬,提早發現問題。
- 正規化安裝流程(apt upgrade…)。
- ppa 多平台部屬(i386 arm64 amd64…)
- mainline - Mainline Kernels 內核集結下載
- dkms - Dynamic Kernel Module Support
- pbuilder - personal package builder
- ppa - Personal Package Archive
ppa Processors and Series
Processors
- AMD x86-64 (amd64)
- ARM ARMv8 (arm64)
- ARM ARMv7 Hard Float (armhf)
- Intel x86 (i386)
- PowerPC (powerpc)
- PowerPC64 Little-Endian (ppc64el)
- RISC-V 64-bit (riscv64)
- IBM System z (s390x)
Ubuntu Series
- Mantic (23.10) - frozen
- Lunar (23.04) - current
- Jammy (22.04) - supported
- Focal (20.04) - supported
- Bionic (18.04) - supported
- Xenial (16.04) - supported
- Trusty (14.04) - supported
How to use pbuilder
pbuilder - personal package builder
# pbuilder tool install
$ sudo apt-get install pbuilder debootstrap devscripts.
# ubuntu 20.04 focal
$ sudo pbuilder create --distribution focal
# ubuntu 23.10 mantic
$ sudo pbuilder create --distribution mantic --bindsmount
# excute pbuilder
$ sudo pbuilder --login --save-after-login --bindmounts /path/to/source/code
#note : --bindmounts: mapping host folder
$ sudo apt install dkms openssl libssl-dev
$ sudo apt install linux-image-generic linux-headers-generic
# install tools, add-apt-repository apt-add-repository
$ sudo apt-get install software-properties-common
## install advvcom, this is demo
$ sudo add-apt-repository ppa:yuyan310362/test-ppa
$ sudo apt update
$ sudo apt install openssl libssl-dev dkms
$ sudo apt install advvcom-dkms advvcom-daemon
Misc
$ gpg --list-secret-keys
pub 4096R/ABC12345 2020-01-01 [expires: 2025-12-31]
uid Your Name user@exmple.com
sub 4096R/DEF67890 2020-01-01 [expires: 2025-12-31]
$ gpg --delete-keys
$ gpg --delete-secret-keys
# To see all the files the package installed onto your system, do this:
dpkg-query -L [package_name]
# To see the files a .deb file will install
dpkg-deb -c [package_name.deb]
命令層級
這裏有一個簡練的總結,關於在命令層次結構中有多少用於構建軟件包的命令能夠組合到一起。做這件事情的方法非常多。
- debian/rules = 軟件包構建過程的專用 maintainer script
- dpkg-buildpackage = 軟件包構建之核心工具
- de-build = dpkg-buildpackage + lintian (在乾淨的環境變量下構建)
- pbuilder = Debian chroot 環境核心工具
- pdebuild = pbuilder + dpkg-buildpackage (在chroot環境中構建)
- cowbuilder = 加速 pbuilder 執行
- git-pbuilder = 命令行語法友好pdebuild (被 gbp buildpackage 使用)
- gbp = 在 Git 倉庫中管理 Debian 源碼
- gbp buildpackage = pbuilder + dpkg-buildpackage + gbp
即便像 gbp buildpackage 和 pbuilder 這樣的高級命令的應用可以確保完美的軟件包 構建環境,瞭解像debian/rules 和 dpkg-buildpackage 這樣的低級命令行工具如何被它們執行也是至關重要的。
Using gpa GUI (other notes)
This method is for systems that don’t have the Passwords and Keys application. It uses the GNU Privacy Assistant (gpa) application.
- Install gpa by running sudo apt install gpg gpa in the terminal. This command installs both gpg and gpa on your system.
- Launch gpa from your applications menu.
- Navigate to the “Keys” menu and select “New Key”. This will open a dialog where you can enter your details.
- Enter your full name and email address, and proceed through the prompts.
- Set a passphrase to protect your PGP key. This passphrase is like a password and will be used to unlock your key.
- Once the process is complete, your key will be created. You can export your public key from gpa to share with others.