使用 reprepro 管理 Debian 软件包发布

使用 reprepro 管理 Debian 软件包发布

reprepro 是一个强大的工具,用于创建和管理 Debian/APT 软件仓库,特别适合企业内部或私有软件分发。以下是完整的 reprepro 使用指南:

安装与基础配置

1. 安装 reprepro

sudo apt update
sudo apt install reprepro gnupg2

2. 创建仓库目录结构

mkdir -p myrepo/{conf,dists,incoming,indices,logs,pool,project,tmp}
cd myrepo

3. 生成 GPG 密钥(若未创建)

gpg --full-generate-key
# 选择 RSA (sign only),长度 4096

4. 创建仓库配置文件 (conf/distributions)

Origin: My Company
Label: My Debian Repository
Codename: bookworm
Suite: stable
Architectures: amd64 arm64 source
Components: main contrib
Description: Private repository for company software
SignWith: YOUR_KEY_ID  # 通过 gpg --list-secret-keys 获取
UDebComponents: main   # 若需要 microdebs
Contents: .gz          # 生成内容索引

5. 创建选项配置文件 (conf/options)

verbose
basedir .
dbdir ./db
logdir ./logs
outdir +b/.

管理软件包

1. 导入软件包到仓库

reprepro -b . includedeb bookworm /path/to/your-package_1.0-1_amd64.deb

2. 导入源码包

reprepro -b . includedsc bookworm /path/to/your-package_1.0-1.dsc

3. 更新仓库元数据

reprepro -b . export
reprepro -b . createsymlinks

仓库维护操作

1. 列出仓库内容

reprepro -b . list bookworm

2. 移除软件包

reprepro -b . remove bookworm your-package

3. 添加新发行版

conf/distributions 添加新条目:

Codename: trixie
Suite: testing
Architectures: amd64 source
Components: main
SignWith: YOUR_KEY_ID

然后初始化新发行版:

reprepro -b . export trixie

4. 跨发行版复制软件包

reprepro -b . copy trixie bookworm your-package

配置客户端访问

1. 导出仓库公钥

gpg --export -a YOUR_KEY_ID > myrepo.gpg

2. 客户端配置步骤

# 导入公钥
sudo mkdir -p /etc/apt/keyrings
sudo cp myrepo.gpg /etc/apt/keyrings/
sudo chmod 644 /etc/apt/keyrings/myrepo.gpg

# 添加仓库源
echo "deb [signed-by=/etc/apt/keyrings/myrepo.gpg] http://your-repo-domain.com/debian/ bookworm main contrib" | sudo tee /etc/apt/sources.list.d/myrepo.list

# 更新并安装
sudo apt update
sudo apt install your-package

高级功能

1. 自动导入新包(使用 incoming 目录)

# 创建 conf/incoming
mkdir -p conf/incoming

# 添加配置文件 conf/incoming/myproject
Name: myproject
IncomingDir: incoming/myproject
TempDir: tmp
Allow: bookworm

2. 设置仓库自动清理

# 在 conf/options 添加
keepunusednewfiles 3
keep 5

3. 生成发布文件签名

reprepro -b . -C main --ignore=forbiddenchar createsymlinks
reprepro -b . export

4. 使用 hooks 自动化

创建 conf/updates 文件:

Name: nightly-update
Method: https://updates.example.com
Suite: bookworm
Components: main
Architectures: amd64
VerifyRelease: YOUR_KEY_ID

然后添加 hook 脚本:

echo "reprepro -b . update" > hooks/nightly
chmod +x hooks/nightly

仓库结构示例

myrepo/
├── conf/
│   ├── distributions    # 发行版配置
│   ├── options          # 全局选项
│   ├── incoming         # 自动导入配置
│   └── updates          # 自动更新配置
├── db/                  # 数据库文件
├── dists/               # 仓库元数据
│   └── bookworm
│       ├── main
│       │   ├── binary-amd64
│       │   └── source
│       └── Release      # 签名文件
├── pool/                # 实际软件包存储
│   └── main
│       └── y/
│           └── your-package
│               ├── your-package_1.0-1.deb
│               └── your-package_1.0-1.dsc
├── logs/                # 日志文件
└── tmp/                 # 临时文件

最佳实践

  1. 版本控制:将 conf/ 目录纳入 Git 管理
  2. 定期清理:设置 cron 任务执行清理
    0 3 * * * /usr/bin/reprepro -b /path/to/myrepo clearvanished
  3. 安全加固
    • 使用 GPG subkeys 进行签名
    • 限制仓库的写入权限
    • 通过 HTTPS 提供仓库访问
  4. 监控

    # 检查仓库健康状态
    reprepro -b . check
    
    # 验证包依赖关系
    reprepro -b . checkpool
  5. 备份策略:定期备份 db/ 目录和 GPG 私钥

常见问题解决

问题: GPG 签名失败

gpg: signing failed: No secret key

解决:

export GPG_TTY=$(tty)
reprepro --gnupghome ~/.gnupg -b . export

问题: 架构不匹配

Skipping inclusion of 'package.deb' as no component found for this type of package!

解决: 确保 conf/distributions 中的 Architectures 包含包的实际架构

问题: 客户端出现 NO_PUBKEY 错误
解决: 确保客户端正确导入公钥且路径匹配 signed-by 声明

通过 reprepro 管理的私有仓库,您可以完全控制软件包的发布流程、版本管理和访问权限,特别适合企业级应用分发和持续交付场景。


评论

《 “使用 reprepro 管理 Debian 软件包发布” 》 有 2 条评论

  1. David唐辉 的头像
    David唐辉

    The Ultimate Guide to Self-Hosting a Debian Repository

    https://dario.griffo.io/posts/ultimate-guide-debian-repository-hosting/

  2. David唐辉 的头像
    David唐辉

    The Ultimate Guide to Creating Debian Packages

    https://dario.griffo.io/posts/ultimate-guide-debian-packaging/

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

zh_CN简体中文