Difference between revisions of "Packaging"
(→Repositories and Distributions) |
(wip) |
||
Line 1: | Line 1: | ||
− | |||
− | |||
For documentation and discussion. Design is still in flux. | For documentation and discussion. Design is still in flux. | ||
− | + | == Repositories and Distributions == | |
We have one apt repository at https://apt.galliumos.org/ which serves three "distributions" (confusing name, but there it is). | We have one apt repository at https://apt.galliumos.org/ which serves three "distributions" (confusing name, but there it is). | ||
Line 26: | Line 24: | ||
*** trumps all other repodists (Canonical and GalliumOS) for all package versions | *** trumps all other repodists (Canonical and GalliumOS) for all package versions | ||
− | + | === To enable or disable repodists === | |
The <code>galliumos-repodist</code> script is included in the <code>galliumos-base</code> package. | The <code>galliumos-repodist</code> script is included in the <code>galliumos-base</code> package. | ||
Line 40: | Line 38: | ||
See <code>galliumos-repodist --help</code> for more. | See <code>galliumos-repodist --help</code> for more. | ||
− | === Packages === | + | |
+ | == Package Building == | ||
+ | |||
+ | Debian/Ubuntu has a fairly complex system for creating `deb` packages for use in `apt` repositories and distributions. There are many approaches and sets of tools to choose from. | ||
+ | |||
+ | === Packaging Workflow (proposed) === | ||
+ | |||
+ | # All packages distributed by GalliumOS are maintained in git, on GitHub | ||
+ | #* Code for our packages (e.g. <code>galliumos-base</code>) is committed to the git repo as a regular project tree, with the addition of the <code>debian</code> directory and associated config files for packaging | ||
+ | #* Code for upstream packages is committed an expanded copy of the upstream tar file | ||
+ | #** If upstream is Ubuntu or Debian or Debian-via-Ubuntu, the tree will include a <code>debian</code> directory, otherwise we will create one | ||
+ | #** All of our patches will live in <code>debian/patches</code> | ||
+ | #** When we move to a new upstream version, the changes will be applied onto the existing tree, and our patches will be updated if necessary to apply against the updated tree | ||
+ | # All development is done on branches, and when branches are merged back to master, <code>debian/changelog</code> must be updated | ||
+ | #* TBD: we could also create a <code>release</code> branch, and let development happen on master | ||
+ | # Packages are built nightly (or on demand) by an automated process, which pulls from the GitHub master branch | ||
+ | # The package builder generates both binary and source packages | ||
+ | #* Some source packages are presently skipped | ||
+ | #** Some because they require a copy of the upstream source package tar file, the URL of which is not always possible to determine programmatically! this is easy to fix manually but requires maintenance, so is worth more thought | ||
+ | #** Some others because the manually-presented upstream is inconsistent with our current tree, which will require manual adjustment to our repo to fix | ||
+ | # Packages are signed with the <code>contact@galliumos.org</code> signing key | ||
+ | #* TODO: further investigate key caching for automated builds. manual builds can use <code>gpg-agent</code> to prompt once and cache for a specific length of time.. | ||
+ | # Nightly packages are pushed to <code>apt.galliumos.org</code> | ||
+ | # Packages are imported into the <code>vivid-galliumos-nightly</code> repodist | ||
+ | #* TBD: import method: manual/as part of builder script, automatic/via cron, automatic/as part of repodist config | ||
+ | #* NOTE: this would be a new repodist -- we could use <code>testing</code> instead. the original idea was that testing would be for convenient distribution of ad hoc pkg builds for specific users/issues...therefore "testing", but if that's not useful we can repurpose it and/or rename it | ||
+ | |||
+ | |||
+ | |||
+ | == Package Versioning == | ||
Our package version naming convention descends from upstream Ubuntu packages, where applicable. Ubuntu's package versioning works like this: | Our package version naming convention descends from upstream Ubuntu packages, where applicable. Ubuntu's package versioning works like this: | ||
− | + | === Sample Package Version Strings === | |
* <code>3.2.1</code> Packages from original sources, without Debian or Canonical patches | * <code>3.2.1</code> Packages from original sources, without Debian or Canonical patches | ||
Line 52: | Line 79: | ||
− | + | === GalliumOS Package Version Strings === | |
Our version string might include a <code>galliumosN</code> tag (N=version), depending on the source of the packaged material: | Our version string might include a <code>galliumosN</code> tag (N=version), depending on the source of the packaged material: | ||
Line 109: | Line 136: | ||
− | + | === Package Version Discrepancies! === | |
We have some existing packages which do not follow this naming convention, and are versioned '''ahead''' of their upstreams (e.g. our <code>3.2.2</code> to <code>3.2.1</code> upstream). This causes a few issues: | We have some existing packages which do not follow this naming convention, and are versioned '''ahead''' of their upstreams (e.g. our <code>3.2.2</code> to <code>3.2.1</code> upstream). This causes a few issues: | ||
Line 118: | Line 145: | ||
# When building source packages, the builder looks for the wrong upstream version number | # When building source packages, the builder looks for the wrong upstream version number | ||
− | + | === Package Version Corrections === | |
This is easy to fix! We just need to push corrected pkg versions to the stable repodist (`vivid-galliumos`), and ''remove'' the old versions from the same repodist. | This is easy to fix! We just need to push corrected pkg versions to the stable repodist (`vivid-galliumos`), and ''remove'' the old versions from the same repodist. | ||
Line 126: | Line 153: | ||
− | + | === Deviant package versions === | |
These packages are currently problematically versioned: | These packages are currently problematically versioned: |
Revision as of 19:46, 29 December 2015
For documentation and discussion. Design is still in flux.
Repositories and Distributions
We have one apt repository at https://apt.galliumos.org/ which serves three "distributions" (confusing name, but there it is).
The old "dev" apt repository at https://apt-dev.galliumos.org/ has been retired.
The current distributions are:
-
vivid-galliumos
("release" or "stable")- contains fully released, production packages, and is the (only) default repodist for all users, installed by
galliumos-base
- priority pinned at 9999
- trumps Canonical's
vivid
repodist for all package versions - trumps GalliumOS's
vivid-galliumos-prerelease
repodist only with newer versions
- trumps Canonical's
- contains fully released, production packages, and is the (only) default repodist for all users, installed by
-
vivid-galliumos-prerelease
("prerelease", "staging", or "unstable")- contains prerelease packages (expected to be stable and ready for general use)
- priority pinned at 9999
- trumps Canonical's
vivid
repodist for all package versions - trumps GalliumOS's
vivid-galliumos
repodist only with newer versions
- trumps Canonical's
-
vivid-galliumos-testing
("testing", "experimental", "current", or "development")- contains testing packages (very possibly broken, not ready for general use)
- priority pinned at 10090
- trumps all other repodists (Canonical and GalliumOS) for all package versions
To enable or disable repodists
The galliumos-repodist
script is included in the galliumos-base
package.
Usage is straightforward:
-
galliumos-repodist --enable prerelease
-
galliumos-repodist --disable prerelease
-
galliumos-repodist --status
See galliumos-repodist --help
for more.
Package Building
Debian/Ubuntu has a fairly complex system for creating `deb` packages for use in `apt` repositories and distributions. There are many approaches and sets of tools to choose from.
Packaging Workflow (proposed)
- All packages distributed by GalliumOS are maintained in git, on GitHub
- Code for our packages (e.g.
galliumos-base
) is committed to the git repo as a regular project tree, with the addition of thedebian
directory and associated config files for packaging - Code for upstream packages is committed an expanded copy of the upstream tar file
- If upstream is Ubuntu or Debian or Debian-via-Ubuntu, the tree will include a
debian
directory, otherwise we will create one - All of our patches will live in
debian/patches
- When we move to a new upstream version, the changes will be applied onto the existing tree, and our patches will be updated if necessary to apply against the updated tree
- If upstream is Ubuntu or Debian or Debian-via-Ubuntu, the tree will include a
- Code for our packages (e.g.
- All development is done on branches, and when branches are merged back to master,
debian/changelog
must be updated- TBD: we could also create a
release
branch, and let development happen on master
- TBD: we could also create a
- Packages are built nightly (or on demand) by an automated process, which pulls from the GitHub master branch
- The package builder generates both binary and source packages
- Some source packages are presently skipped
- Some because they require a copy of the upstream source package tar file, the URL of which is not always possible to determine programmatically! this is easy to fix manually but requires maintenance, so is worth more thought
- Some others because the manually-presented upstream is inconsistent with our current tree, which will require manual adjustment to our repo to fix
- Some source packages are presently skipped
- Packages are signed with the
contact@galliumos.org
signing key- TODO: further investigate key caching for automated builds. manual builds can use
gpg-agent
to prompt once and cache for a specific length of time..
- TODO: further investigate key caching for automated builds. manual builds can use
- Nightly packages are pushed to
apt.galliumos.org
- Packages are imported into the
vivid-galliumos-nightly
repodist- TBD: import method: manual/as part of builder script, automatic/via cron, automatic/as part of repodist config
- NOTE: this would be a new repodist -- we could use
testing
instead. the original idea was that testing would be for convenient distribution of ad hoc pkg builds for specific users/issues...therefore "testing", but if that's not useful we can repurpose it and/or rename it
Package Versioning
Our package version naming convention descends from upstream Ubuntu packages, where applicable. Ubuntu's package versioning works like this:
Sample Package Version Strings
-
3.2.1
Packages from original sources, without Debian or Canonical patches -
3.2.1-1
Packages patched by Debian (v1) but not Canonical -
3.2.1-0ubuntu1
Packages patched by Canonical (v1) but not Debian (Canonical adds the implicit zero) -
3.2.1-1ubuntu2
Packages patched by Debian (v1) and Canonical (v2)
GalliumOS Package Version Strings
Our version string might include a galliumosN
tag (N=version), depending on the source of the packaged material:
- Original to us e.g
galliumos-base
-
3.2.1
, no tag needed
-
- From original sources, not patched by us
-
3.2.1
, no changes; reuse the version from the original source
-
- From original sources, and patched by us
-
3.2.1
?? becomes3.2.1galliumos1
or3.2.1-galliumos1
?? TBD!
-
- From Debian or Canonical (patched or not), not patched by us
-
3.2.1
, no changes; reuse the upstream version string -
3.2.1-4
-
- From Debian (patched or not), and patched by us
-
3.2.1-4
becomes3.2.1-4galliumos1
, add our tag. -
3.2.1
becomes3.2.1-0galliumos1
, add the implicit-0
first, if necessary!
-
- From Canonical (patched or not), and patched by us
-
3.2.1
?? becomes3.2.1galliumos1
or3.2.1-galliumos1
?? TBD!
-
- From Canonical via Debian (patched or not), and patched by us
-
3.2.1-0ubuntu1
becomes3.2.1-0ubuntu1-galliumos1
, just add a hyphen and our tag -
3.2.1-4ubuntu1
becomes3.2.1-4ubuntu1-galliumos1
-
The hyphenation rules are due to Debian's complicated sort logic. See below for a demonstration.
# These version strings are Debian-ordered from oldest to newest # 3.2.1 3.2.1-0galliumos1 3.2.1-1 3.2.1-1galliumos1 3.2.1-1ubuntu1 3.2.1-1ubuntu2 3.2.1-2galliumos1 3.2.1-10 3.2.1-10galliumos1 3.2.1-10galliumos1 3.2.1-galliumos1 ## TBD 3.2.1galliumos1 ## TBD 3.2.1galliumos2 ## TBD 3.2.1galliumos10 ## TBD 3.2.1-0-galliumos1 ## ambiguous; do not use 3.2.1-0-ubuntu1 ## ambiguous; do not use 3.2.1-0-ubuntu0-galliumos1 ## ambiguous; do not use 3.2.1-0-ubuntu1-galliumos1 ## ambiguous; do not use 3.2.1-1-galliumos1 ## ambiguous; do not use 3.2.1-1ubuntu1-galliumos1 3.2.1-1ubuntu2-galliumos1 3.2.1-1ubuntu2-galliumos2 3.2.1-1ubuntu2-galliumos10 3.2.1-1ubuntu10-galliumos1 3.2.1-10-galliumos1 ## ambiguous; do not use 3.2.1.1
Package Version Discrepancies!
We have some existing packages which do not follow this naming convention, and are versioned ahead of their upstreams (e.g. our 3.2.2
to 3.2.1
upstream). This causes a few issues:
- It's confusing for us and gives users the impression that our code is a release ahead of the upstream.
- When the upstream releases a
3.2.2
, it will have different code than our3.2.2
. -
debootstrap
builds will fail to update to our pkgs when version numbers collide. - When building source packages, the builder looks for the wrong upstream version number
Package Version Corrections
This is easy to fix! We just need to push corrected pkg versions to the stable repodist (`vivid-galliumos`), and remove the old versions from the same repodist.
However, when users run apt-get upgrade
, they will be prompted to confirm "DOWNGRADED" packages. We'll need to emphasize that this is expected in the BETA2 release announcement.
Deviant package versions
These packages are currently problematically versioned:
package | upstream fork point | upstream current | galliumos uncorrected | galliumos corrected |
---|---|---|---|---|
xfce4-settings | 4.12.0-ubuntu1 | 4.12.0-0ubuntu1 | 4.12.9-0ubuntu1 | 4.12.0-0ubuntu1-galliumos7 |
slim | 1.3.6-4 | 1.3.6-4 | 1.3.7.4-1 | 1.3.6-4galliumos13 |
xfwm4 | 4.12.1-1ubuntu1 | 4.12.3-1ubuntu1~ubuntu15.04.1 | 4.12.2-1ubuntu6 | 4.12.2-1ubuntu1-galliumos5 |
pasystray | 0.4.0-1 | 0.4.0-1 | 0.4.0.3-2 | 0.4.0-1galliumos1 |
xorg-server | 2:1.17.1-0ubuntu3.1 | TBD | 2:1.17.1-0ubuntu4 | 2:1.17.1-0ubuntu3.1-galliumos1 |
xfce4-panel | 4.12.0-0ubuntu1 | 4.12.0-0ubuntu1 | 4.12.1-0ubuntu1 | 4.12.0-0ubuntu1-galliumos1 |
xubuntu-default-settings | 15.04.5 | 15.04.5 | 15.04.22 | 15.04.5galliumos16 |
dmz-cursor-theme | 0.4.4ubuntu1 | 0.4.4ubuntu1 | 0.4.5ubuntu1 | 0.4.4ubuntu1-galliumos1 |
galliumos-meta | xubuntu-meta 2.190 | TBD | 2.201 | 2.190-galliumos11 |
xfce4-session | 4.12.1-1ubuntu2 | 4.12.1-1ubuntu2 | 4.12.1-1ubuntu9 | 4.12.1-1ubuntu2-galliumos5 |
cups-filters | 1.0.67-0ubuntu2.4 | 1.0.67-0ubuntu2.5 (!) | 1.0.67-0ubuntu2.5 | 1.0.67-0ubuntu2.4-galliumos1 |
ubiquity | 2.21.26 | 2.21.26 | 2.21.31 | 2.21.26-galliumos4 |
casper | 1.360 | 1.360 | 1.360-2 | 1.360-galliumos2 |
zram-config | 0.3.1 | 0.3.1 | 0.3.2-1 | 0.3.1-0galliumos3 |
xubuntu-artwork | 15.04.4 | 15.04.4 | 15.04.18 | 15.04.4-galliumos13 |
xkeyboard-config | 2.12-1ubuntu1 | TBD | 2.12.1-1ubuntu1 | 2.12-1ubuntu1-galliumos1 |
libnotify | 0.7.6-2svn1 | TBD | 0.7.7-1 | 0.7.6-2svn1-galliumos1 |
ubuntu-meta | 1.334 | TBD | 1.336 | 1.334-galliumos2 |
systemd | 219-7ubuntu6 | 219-7ubuntu6 | 219-7ubuntu29 | 219-7ubuntu6-galliumos3 |
procps | 1:3.3.9-1ubuntu8 | 1:3.3.9-1ubuntu8 | 1:3.3.9.3-1ubuntu9 | 1:3.3.9-1ubuntu8-galliumos3 |
libdrm | 2.4.60-2 | TBD | 2.4.65-1-9.22.15.git-1 | 2.4.60-2galliumos2 |
kmod | 18-3ubuntu1 | 18-3ubuntu1 | 18-3ubuntu2 | 18-3ubuntu1-galliumos1 |
hexchat | 2.10.1-2 | 2.10.1-2 | 2.10.1-5 | 2.10.1-2galliumos1 |
deadbeef | 0.6.2-1 | 0.6.2-1 | 0.6.2-1 | (no mods, this is correct!) |
xfce4-power-manager | 1.4.3-0ubuntu1 | 1.4.3-0ubuntu1 | 1.4.8-0ubuntu11 | 1.4.3-0ubuntu1-galliumos12 |
base-files | 7.2ubuntu9 | 7.2ubuntu9 | 7.2ubuntu10 | 7.2ubuntu9-galliumos1 |
compton | 0.1~beta2-1 | 0.1~beta2-1 | 0.1~beta3-git-9.22.15-9 | 0.1~beta2-1-galliumos11 |
xorg | 1:7.7+7ubuntu4 | 1:7.7+7ubuntu4 | 1:7.7+7ubuntu5 | 1:7.7+7ubuntu4-galliumos1 |
shimmer-themes | 1.9.4-0ubuntu2 | 1.9.4-0ubuntu2 | 1.9.4-1ubuntu1 | 1.9.4-0ubuntu2-galliumos1 |