How to generate the `Release` file on a local package repository?

16,514

There are a number of ways of going about this; I use apt-ftparchive.

  1. Create an aptftp.conf file in the root of your repository:

    APT::FTPArchive::Release {
      Origin "Your origin";
      Label "Your label";
      Suite "unstable";
      Codename "sid";
      Architectures "amd64 i386 source";
      Components "main";
      Description "Your description";
    };
    

    with the appropriate values (change “Origin”, “Label”, “Description” at least, and adjust “Architectures” to match the binaries you host).

  2. Create a matching aptgenerate.conf file alongside:

    Dir::ArchiveDir ".";
    Dir::CacheDir ".";
    TreeDefault::Directory "pool/";
    TreeDefault::SrcDirectory "pool/";
    Default::Packages::Extensions ".deb";
    Default::Packages::Compress ". gzip bzip2";
    Default::Sources::Compress ". gzip bzip2";
    Default::Contents::Compress "gzip bzip2";
    
    BinDirectory "dists/unstable/main/binary-amd64" {
      Packages "dists/unstable/main/binary-amd64/Packages";
      Contents "dists/unstable/Contents-amd64";
      SrcPackages "dists/unstable/main/source/Sources";
    };
    
    BinDirectory "dists/unstable/main/binary-i386" {
      Packages "dists/unstable/main/binary-i386/Packages";
      Contents "dists/unstable/Contents-i386";
      SrcPackages "dists/unstable/main/source/Sources";
    };
    
    Tree "dists/unstable" {
      Sections "main"; # contrib non-free";
      Architectures "amd64 i386 source";
    };
    

    (removing i386 if you don’t need that).

  3. In your repository, clear the database:

    rm -f packages-i386.db packages-amd64.db
    
  4. Generate the package catalogs:

    apt-ftparchive generate -c=aptftp.conf aptgenerate.conf
    
  5. Generate the Release file:

    apt-ftparchive release -c=aptftp.conf dists/unstable >dists/unstable/Release
    
  6. Sign it:

    gpg -u yourkeyid -bao dists/unstable/Release.gpg dists/unstable/Release
    gpg -u yourkeyid --clear-sign --output dists/unstable/InRelease dists/unstable/Release
    

    (with the appropriate id instead of yourkeyid).

Whenever you make a change to the repository, you need to run steps 3 to 6 again.

Share:
16,514

Related videos on Youtube

Adrian Maire
Author by

Adrian Maire

Enthusiast for most technological and scientific topics, specially computer science. I made a 300ECTS degree in computer science at UCLM (Spain) and I am currently working at Nexthink in Lausanne. I programmed my first ("finished") 2D video-game in VisualBasic-6 when I was 14, and since then, I spent most of my free time in personal projects: Real time graphics(opengl), AI neural networks, electronic, mechanical devices, house improvement...

Updated on September 18, 2022

Comments

  • Adrian Maire
    Adrian Maire over 1 year

    CONTEXT

    With a local package repository, I'm able to provide my APT instances with a set of software packages and configurations from a server which I control, allowing any client to install this software using just the normal apt install command (providing the repository is added to their /etc/apt/sources.list{,.d/}).

    For my attempt at creating a local package repository, I followed this tutorial on bipmedia.com, which roughly consists of:

    1. Generate the .deb
    2. Store the .deb on an Apache2 web server
    3. Generate a Package.gz file

    My Attempt

    Generating the binary package file

    To generate the .deb, the software files are required, a DEBIAN folder with metadata is generated and the following command compiles the code and assembles the package:

    dpkg-deb --build [source code tree with DEBIAN directory]

    Serve repository files with Apache2 server

    I'm skipping this part as it's unrelated to the problem I'm seeking to solve with this question.

    Generating a Packages.gz file (repository metadata)

    With the an open shell instance whose working directory is the Apache server root folder containing the .deb file from above, I called:

    dpkg-scanpackages debian /dev/null | gzip -9c >debian/Packages.gz

    PROBLEM

    Calling apt update on the client machine, it complains with:

    W: The repository 'http://example.com packages/ Release' does not have a Release file.
    

    This necessary file is missing in my local repository. It seems to be a register of package checksums, but after searching on the Internet, my very limited understanding of the topic kept me from being able to find out how to generate it.


    Note: My /etc/apt/sources.list file does have the following line:

    deb http://example.com packages/

    QUESTION

    How do I generate the Release file for a local APT package repository?

  • Toby
    Toby almost 5 years
    Can you use something like ` dpkg-scanpackages` rather than apt-ftparchive?
  • Stephen Kitt
    Stephen Kitt almost 5 years
    @Toby you can use dpkg-scanpackages to generate the package catalogs, but it won’t handle Release for you. The simple option nowadays is probably aptly; I should re-write this answer using that.
  • Toby
    Toby almost 5 years
    Awesome! Thanks. I should have said earlier, I was looking for a cross platform tool which apt-ftparchive seems like it's not. So aptly sounds good for me and I'll read up on creating the packages. I'm assuming the signing is separate anyway.
  • ironman
    ironman almost 4 years
    I have done exactly this, with focal instead of unstable everywhere, and amd64 only, and my custom deb file is in dists/focal/main/binary-amd64, but when I run step 4, may Packages file in dists/focal/main/binary-amd64 is empty, zero size. And if I try to install the binary on another computer, it does not find the package...