7.8 KiB
#Debian package creation
Architecture
The system contains rebuildd
, a front-end for pbuilder
, some chroot pbuilder for i386, amd64, armhf and reprepro
for debian repository system.
Workflow
There is 3 repositories (unstable
, testing
& stable
):
-
Packages from
unstable
(akadaily
) are the latest version from git and are build automatically every night. -
Packages from
testing
(akatest
) allow to set up a new package version to be tested. -
Packages from
stable
(akamegusta
) contains only production versions.
This workflow purpose is to avoid any manual interaction (script launch, ...) on your server and to focus on package management through Github only.
Thus, each yunohost package has three branches, matching the three repositories (unstable
, testing
et stable
). The build server will automatically build and deploy Debian source packages and binaries into the corresponding state on Github
Unstable branch
Commits to the unstable branch will not modify the debian/changelog
file because it is automatically updated during daily builds with corresponding date and time.
Any commit that will alter a package behaviour need to be done to the unstable
branch first.
TODO
Add pre-commit hook to avoid errors ?
Testing et stable branch - standard workflow
No commit can be done directly in those branches. You need to use merges (merge from unstable
to testing
& merge from testing
to stable
).
The only specific changes that occur on the repositories are version changes (modification of debian/changelog
, then tag).
As a YunoHost application maintainer, you may find specific tools in the repository yunohost-debhelper
git clone https://github.com/YunoHost/yunohost-debhelper
yunohost-debhelper/setup_git_alias.sh
The previous instructions will configure a new git alias named yunobump
. It is global and located at ~/.gitconfig
, therefore accessible through any local git repository.
Without helper
- Go into the repository you wish to build
- Make sure
unstable
branch contains all modifications you wish to apply - Get the current version number:
head debian/changelog
- Move to the
testing
orstable
branch - Merge or cherry-pick commits you want to insert into the
unstable
branch - Add to
debian/changelog
the corresponding commits messages (or usegit-dch
to do it automatically) - Tag the current branch (
testing
orstable
) with the next superior value for version number - Push modifications and tags into GitHub repository
- Go back to
unstable
branch - Merge changelog
- Push
unstable
branch
With helper
# You Only Clone Once
$ git clone git@github.com:YunoHost/yunohost-config-nginx.git
$ cd yunohost-config-nginx
# Be sure to be up-to-date, and don't forget to get the tags !
$ git fetch --tags
# Checkout your branch: stable or testing
$ git checkout testing
# Do your 'functional' modifications: either merge unstable in testing, or merge testing in stable
$ git pull origin unstable
# Or just
$ git merge unstable
# What is the current version number in test?
$ dpkg-parsechangelog | grep "^Version" | cut -d ' ' -f 2
# Or just
$ head debian/changelog
# Update changelog and do a proper tag (explained below)
$ git yunobump x.y.z-p
# Push the branch state AND the tags to the remote repository
$ git push origin --tags testing:testing
# Merge changelog modifications to the `unstable` branch
$ git checkout unstable
$ git merge testing
$ git push origin unstable
TODO
Tag format policy: actually $branch/$version to enable the same version into two different branches. Is it necessary?
TODO
Under normal circumstances, every push to test or stable, the last commit will result in a changelog commit properly tagged. It should be possible to set a pre-push git hook that prevents from pushing unfinished work
Test and stable branches - hotfix
Exceptionally, you may hotfix (for security purposes for example) stable
or test
packages, leading to a merge into daily branch which is not acceptable (too much new features in development).
** This MUST remain exceptional **
TODO
Describe
TODO
Develop a 'git yunohotfix ...' helper that commit into stable and cherry-pick right away into daily? or the opposite?
Not YunoHost packages
« not-YunoHost » packages (python-bottle
for example) don't go through unstable
repository. Once package tests are completed, they need to be manually transferred into backport
repository.
Version number
So far, YunoHost global base version is 2. The current convention for the version number is 2.x.x.
The second section of the number string is incremented if a major functional change has occured: addition of a new functionality, modification of a behaviour. For now, all packages are versionned 2.1.x.
The third section of the number string is incremented if a bugfix or a minor functional change has occured. For example, you may currently find 2.1.3 or 2.1.5 packages
A fourth section is dedicated for exceptional cases like bugfixes in stable branch. In this case, we want to pass on a unique change directly into stable branch, therefore we add -x to the number string. This may result into something like this: 2.1.3-1.
Packages management
Daily build
A cron task defined for pbuilder
user is executed every day at 01:00. The script will update the packages
git repository and submodules (ssowat
, moulinette
, yunohost
& yunohost-admin
).
Once sources are up to date, the script will rebuild packages that have been updated the day.
Sources packages will then need to be created and moved into /var/www/repo.yunohost.org/daily/incomming
folder.
Launch source file addition to the repository. This will automatically launch a rebuildd
job (see daily repository configuration: /var/www/repo.yunohost.org/daily/conf/distribustion
).
Once packages are built, they are added to the unstable
repository.
(Re)build a YunoHost package
You may manualy launch a package build by typing:
$ daily_build -p package_name
Build a not YunoHost package
$ build_deb /path/of/package
TODO
Describe : need to bump the version to pass from test to stable
Passing from daily
to test
$ push-packages-test -p package_name
You may add the -v
argument to manually define the package version.
The script will get the daily
sources package and define the version and changelist into the changelog. Build package will be added to the rebuildd jobs list that will pass everything to the test
repository.
Attention : Version name must not contain daily
otherwise the package will be added to the daily
repository.
Passing from test
to stable
$ push-package-stable -p package_name
The previous command only passes the package from test
to stable
repository, without rebuild.
Repository management with reprepro
- Delete a package
$ reprepro -V -b /var/www/repo.yunohost.org/repo_name/ remove megusta package_name
- Add a Debian package into a repository
$ reprepro -V -b /var/www/repo.yunohost.org/repo_name/ includedeb megusta package_name.deb
Backports management
Packages from backports repository can be quickly into Yunohost test
repository.
To do so, you need to add the package name into the /var/www/repo.yunohost.org/test/conf/list
file and type in the following command:
$ reprepro -V -b /var/www/repo.yunohost.org/test update megusta
Now packages will be downloaded and added to test
repository.