d1man/05-building-packages.md

4.1 KiB

Building deb packages

Using jenkins-debian-glue, we can set up a build pipeline for any version controlled software by creating a debian directory in the repository. Its structure looks like:

debian
+-- changelog
+-- compat
+-- control
+-- gbp.conf
+-- postinst
+-- preinst
+-- rules
+-- source
    +-- format

These files are equivalend to any standard Debian/Devuan package.

Once the repository is set up, and contains a debian directory, we are able to construct the deb package build pipeline. It is first necessary to create a Jenkins -source job, followed by a -binaries job, and finishing with a -repos job. Further on, for easier reading, we will consider that we are building a package called linux-sunxi, which is a Linux kernel package dedicated to LIME2 Arm boards.

-source

The -source job is responsible to fetch the software (package) sources and distribute them to any build executor nodes that are needed to build the package.

These jobs need the following configuration:

  • String parameters:

    • release (The codename of the suite): ascii-proposed
    • distribution (The upstream Devuan suite codename): ascii
  • Git repository URL:

    • https://git.devuan.org/devuan-packages/linux-sunxi
      • branch(es) to be built: suites/ascii
  • Execution shell script:

      /usr/bin/generate-git-snapshot
    
  • Post-build triggers:

    • Projects to build: linux-sunxi-binaries
    • Predefined parameters:
		release=${release}
		distribution=${distribution}

-binaries

The -binaries job is responsible for compiling the source code and creating deb packages out of the compiled code. The packages are compiled on each preconfigured build executor node, for each necessary CPU architecture.

These jobs need the following configuration:

  • String parameters (these are passed through by the -source job):

    • release (The codename of the suite): ascii-proposed
    • distribution (The upstream Devuan suite codename): ascii
  • Configuration matrix (for the CPU architectures)

    • architecture: amd64 armhf arm64
    • label: amd64 armf arm64
      • Generic combination filter:
(architecture=="amd64").implies(label=="amd64") && (architecture=="armhf").implies(label=="armhf") && (architecture=="all").implies(label=="all") && (architecture=="armel").implies(label=="armel") && (architecture=="arm64").implies(label=="arm64")
  • Copy artifacts from another project:

    • Name: linux-sunxi-source
    • Artifacts to copy: *
  • Execution shell script:

      export BUILD_ONLY=true
      /usr/bin/build-and-provide-package
    
  • Post-build triggers:

    • Projects to build: linux-sunxi-repos
    • Predefined parameters:
		release=${release}
		distribution=${distribution}
		architecture=${architecture}
		label=${label}
  • Archive artifacts:
    • *.gz,*.bz2,*.xz,*.deb,*.udeb,*.dsc,*.changes,*.buildinfo

-repos

The -repos job is responsible to take the built deb packages and ship them off to dak to create or append to an APT repository.

These jobs need the following configuration:

  • String parameters (these are passed through by the -binaries job):

    • release
    • distribution
    • architecture
    • label
  • Copy artifacts from another project:

    • Name: linux-sunxi-binaries/architecture=$architecture,label=$label
    • Artifacts to copy: *
  • Execution shell script:

      if [ -n "$gitlabBranch" ] ; then
      	export codename=$gitlabBranch
      fi
      . /etc/jenkins/debian_glue
      export KEY_ID
      for i in architecture* ; do
      	#cp $i/* .
      	cd $i
      	debsign --no-re-sign -k$KEY_ID *.changes || true
      	debsign --no-re-sign -k$KEY_ID *.dsc || true
      	cd ..
      done
      #find . -type d -name 'architecture*' | xargs rm -r
      #debsign --no-re-sign -k$KEY_ID *.changes
      #debsign --no-re-sign -k$KEY_ID *.dsc
      ssh dak@repo.devuan.org mkdir /home/dak/jenkins/$BUILD_TAG
      scp -r * dak@repo.devuan.org:/home/dak/jenkins/$BUILD_TAG
      ssh dak@repo.devuan.org dak_add_pkgs -s $codename -c main $BUILD_TAG
    

Once this pipeline completes, the repository is ready to be used, but it is also possible to utilize amprolla for additional customization.