Incluir pruebas en el desarrollo de debian


Continuando con la serie de entradas relacionadas con el empaquetado en Debian, vamos a pasar a explicar algunas de las herramientas disponibles para hacer pruebas a los paquetes que estemos desarrollando, a fin de comprobar y mejorar la calidad de los mismos. Vamos a explicar los pasos que hay que dar para utilizar algunas de estas herramientas en nuestra máquina local de desarrollo, así como la posibilidad de realizar estas pruebas de forma automática en salsa utilizando el sistema de integración continua de Gitlab.

Esta entrada es continuación de las siguientes, cuya lectura recomiendo previamente.

  1. Preparar una máquina para el desarrollo de paquetes Debian
  2. Usando git en el empaquetado de Debian
  3. Adoptar un paquete en Debian
  4. Primeras modificaciones para empaquetar dnsproxy para Debian
  5. Parchear código con quilt

Realizar pruebas en nuestra máquina de desarrollo

Partimos de una máquina como la que hemos explicado anteriormente, en la que tenemos un repositorio en el que realizamos el desarrollo de un paquete para su actualización y como punto de partida usaremos el commit b646ec1a de dnsproxy, es decir, la situación en la que dejamos el desarrollo de este paquete en la entrada anterior del blog. Estas herramientas se pueden utilizar cada vez que construyamos un paquete o cuando queramos hacer una inspección más exhaustiva, por ejemplo al preparar la subida de una nueva “release”.

En los siguientes apartados iremos nombrando algunas de las herramientas que podemos usar localmente para verificar determinados aspectos de nuestro paquete y detectar posibles errores o aspectos a mejorar. En algunas ocasiones la herramienta nos informará del error y será fácilmente solucionable, pero en otras tendremos que indagar el motivo del error o de la advertencia. Cuanto mejor conozcamos el lenguaje usado para el desarrollo del paquete o el funcionamiento de Debian (empaquetado, arranque, sistemas auxiliares como systemd, etc.), más sencillo nos resultará esta tarea, aunque mirándolo de otra forma, es también una buena forma de ir entendiendo cómo funcionan determinadas cosas que ignorábamos e ir aprendiendo los entresijos tanto del lenguaje de programación utilizado como del propio sistema Debian. Comenzaremos esta serie de herramientas explicando el uso de lintian, que ya conocemos puesto que se ejecuta automáticamente al utilizar sbuild.

lintian

La política de debian es bastante amplia y comprobar que un paquete cumple con todos los puntos es una labor tediosa. Lintian trata de ayudar a que ese proceso sea más sencillo, analizando un paquete fuente o binario y mostrando como salida los diferentes puntos que pueden incumplir la política, clasificándolos en función de su gravedad (“severity”).

La salida que obteníamos de lintian al ejecutar sbuild en el último paso del anterior artículo es la siguiente:

E: dnsproxy: maintainer-script-should-not-use-adduser-system-without-home postinst:6 'adduser --system --quiet --no-create-home --group dnsproxy'
E: dnsproxy changes: unreleased-changes
W: dnsproxy source: ancient-standards-version 3.8.4 (released 2010-01-27) (current is 4.5.0)
W: dnsproxy: changelog-distribution-does-not-match-changes-file (unreleased != unstable)
W: dnsproxy source: debian-rules-missing-recommended-target build-arch
W: dnsproxy source: debian-rules-missing-recommended-target build-indep
W: dnsproxy source: debian-rules-should-not-set-CFLAGS-from-noopt
W: dnsproxy: missing-systemd-service-for-init.d-script dnsproxy
W: dnsproxy: skip-systemd-native-flag-missing-pre-depends postinst:19
W: dnsproxy: skip-systemd-native-flag-missing-pre-depends prerm:5

E: Lintian run failed (policy violation)

En el que vemos que se marcan dos errores y ocho advertencias. Hay que verlas una a una e ir modificando los ficheros correspondientes. Tenemos que conseguir que lintian se ejecute sin errores y a ser posible también sin ninguna advertencia.

Lintian proporciona 5 niveles de gravedad: Error (E), Warning (W), Info (I), Pedantic (P), Classification (C). Podemos ejecutarlo de nuevo para que los muestre todos, especificando una severidad mayor o igual que “classification”:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ lintian -L ">=classification"

E: dnsproxy: maintainer-script-should-not-use-adduser-system-without-home postinst:6 'adduser --system --quiet --no-create-home --group dnsproxy'
E: dnsproxy changes: unreleased-changes
W: dnsproxy: changelog-distribution-does-not-match-changes-file (unreleased != unstable)
W: dnsproxy: missing-systemd-service-for-init.d-script dnsproxy
W: dnsproxy: skip-systemd-native-flag-missing-pre-depends postinst:19
W: dnsproxy: skip-systemd-native-flag-missing-pre-depends prerm:5
I: dnsproxy: hardening-no-bindnow usr/sbin/dnsproxy
I: dnsproxy: hardening-no-fortify-functions usr/sbin/dnsproxy
P: dnsproxy: command-in-sbin-has-manpage-in-incorrect-section usr/sbin/dnsproxy
C: dnsproxy: control-tarball-compression-format xz
C: dnsproxy-dbgsym: control-tarball-compression-format xz
C: dnsproxy: ctrl-script postinst
C: dnsproxy: ctrl-script postrm
C: dnsproxy: ctrl-script prerm
C: dnsproxy: data-tarball-compression-format xz
C: dnsproxy-dbgsym: data-tarball-compression-format xz
C: dnsproxy: debhelper-autoscript-in-maintainer-scripts dh_installinit/13.1
C: dnsproxy: maintainer-script-interpreter control/postinst /bin/sh
C: dnsproxy: maintainer-script-interpreter control/postrm /bin/sh
C: dnsproxy: maintainer-script-interpreter control/prerm /bin/sh
C: dnsproxy-dbgsym: no-ctrl-scripts
C: dnsproxy: package-is-maintained-by-individual
C: dnsproxy-dbgsym: package-is-maintained-by-individual
C: dnsproxy changes: package-is-maintained-by-individual
C: dnsproxy buildinfo: package-is-maintained-by-individual

Que nos muestra más información que la que hace por defecto, aunque también puede incluir falsos positivos o mostrar detalles que son correctos y no hay que corregir. En cualquier caso tenemos errores y advertencias que sí hay que corregir, por lo que vamos a comenzar corrigiendo los aspectos más importantes.

Es posible ejecutar lintian con el parámetro “-i” que nos muestra información más detallada sobre los diferentes puntos que considera que es necesario corregir:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ lintian -i -L ">=warning"

E: dnsproxy: maintainer-script-should-not-use-adduser-system-without-home postinst:6 'adduser --system --quiet --no-create-home --group dnsproxy'
N: 
N:    The maintainer script apparently runs 'adduser --system' but hardcodes a
N:    path under '/home' for the '--home' option or does not use the '--home'
N:    option.
N:    
N:    The FHS says: /home is a fairly standard concept, but it is clearly a
N:    site-specific filesystem. The setup will differ from host to host.
N:    Therefore, no program should rely on this location.
N:    
N:    Note that passing --no-create-home alone does not solve the issue
N:    because home field of passwd file point to a non existing /home
N:    subdirectory. Please use adduser --no-create-home --home /nonexistent
N:    instead.
N:    
N:    Refer to Filesystem Hierarchy Standard (/home : User home directories
N:    (optional)) and the adduser(8) manual page for details.
N:    
N:    Severity: error
N:    
N:    Check: scripts
N: 
E: dnsproxy changes: unreleased-changes
N: 
N:    The distribution in the Changes field copied from debian/changelog
N:    indicates that this package was not intended to be released yet.
N:    
N:    Refer to https://bugs.debian.org/542747 for details.
N:    
N:    Severity: error
N:    
N:    Check: changes-file
N: 
W: dnsproxy: changelog-distribution-does-not-match-changes-file (unreleased != unstable)
N: 
N:    The target distribution in the most recent entry in this package's
N:    debian/changelog file does not match the target in the generated
N:    .changes file.
N:    
N:    This may indicate a mistake in setting the distribution, an accidental
N:    upload to unstable of a package intended for experimental, or a mistake
N:    in invoking sbuild(1).
N:    
N:    Refer to https://bugs.debian.org/906155 and the sbuild(1) manual page
N:    for details.
N:    
N:    Severity: warning
N:    
N:    Check: debian/changelog
N: 
W: dnsproxy: missing-systemd-service-for-init.d-script dnsproxy
N: 
N:    The specified init.d script has no equivalent systemd service.
N:    
N:    Whilst systemd has a SysV init.d script compatibility mode, providing
N:    native systemd support has many advantages such as being able to specify
N:    security hardening features.
N:    
N:    Please provide a suitable .service file for this script.
N:    
N:    Severity: warning
N:    
N:    Check: systemd
N: 
W: dnsproxy: skip-systemd-native-flag-missing-pre-depends postinst:19
N: 
N:    This package uses the --skip-systemd-native invoke-rc.d flag in the
N:    specified maintainer script but does not specify a Pre-Depends
N:    dependency on a recent version of init-system-helpers.
N:    
N:    This flag is useful for maintainer scripts that want to defer systemd
N:    actions to deb-systemd-invoke(1p). However, it was only added in
N:    init-system-helpers version 1.58.
N:    
N:    Please add Pre-Depends: ${misc:Pre-Depends} to your debian/control file.
N:    
N:    Refer to the invoke-rc.d(8) manual page and the deb-systemd-invoke(1p)
N:    manual page for details.
N:    
N:    Severity: warning
N:    
N:    Check: scripts
N: 
W: dnsproxy: skip-systemd-native-flag-missing-pre-depends prerm:5

El primer error nos muestra no solo el problema, sino que sugiere la solución. El fichero d/postinst es un script que se ejecuta después de la instalación del paquete y que en este caso, está pensado para crear el usuario dnsproxy en el sistema, pero la forma de hacerlo no está de acuerdo con la FHS (FileSystem Hierarchy Standard) que debemos seguir siempre. Aplicamos el cambio sugerido en el fichero d/postinst:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git diff debian/postinst
diff --git a/debian/postinst b/debian/postinst
index 335a297..c9b9558 100644
--- a/debian/postinst
+++ b/debian/postinst
@@ -3,7 +3,7 @@ set -e
 
 case "$1" in
        configure)
-               adduser --system --quiet --no-create-home --group dnsproxy
+               adduser --system --quiet --no-create-home --home /nonexistent --group dnsproxy
        ;;
 esac

Y generamos un commit con esta corrección:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git commit -sm "d/postinst: Update to comply with the FHS
> 
> Lintian shown an error in this script when creating the user dnsproxy
> --home /nonexistent is added to fix it."
[master 988d7a1] d/postinst: Update to comply with the FHS
 1 file changed, 1 insertion(+), 1 deletion(-)

El otro error no es tal, ya que está relacionado con que sbuild compila para la rama unstable, mientras que en d/changelog aparece todavía UNRELEASED. Cuando lo modifiquemos porque tengamos una versión publicable, ese error no aparecerá, por lo que de momento podemos ignorarlo. Añadimos también la línea “Pre-Depends: ${misc:Pre-Depends}” como nos recomienda otra advertencia de lintian:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git diff debian/control
diff --git a/debian/control b/debian/control
index 22886ed..886e8f8 100644
--- a/debian/control
+++ b/debian/control
@@ -11,6 +11,7 @@ Standards-Version: 3.8.4
 Package: dnsproxy
 Architecture: any
 Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base
+Pre-Depends: ${misc:Pre-Depends}
 Description: proxy for DNS queries
  dnsproxy forwards DNS queries to two previously configured nameservers:
  one for authoritative queries and another for recursive queries.

Con su commit:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git add debian/control
debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git commit -sm "d/control: Add Pre-Depends field"
[master eea18b4] d/control: Add Pre-Depends field
 1 file changed, 1 insertion(+)

Hay que hacer más cambios, principalmente los referidos a la creación de una unidad de systemd, ya que este paquete incluye el sistema de scripts de inicio denominado init System V, que no es el sistema actualmente recomendado en Debian (decisión no exenta de polémica, por cierto). Podemos ver que precisamente esta circunstancia se incluyó en la última actualización de la política de Debian en el momento que escribo esta entrada (4.5.0): Upgrading checklist. Version 4.5.0.

La actualización del paquete para que sea conforme a una versión reciente de la política lo dejamos para un artículo específico más adelante. Puesto que lleguemos un momento en el que lintian no muestra ningún error o advertencia, no significa que el desarrollo esté completamente conforme con la última versión de la política, aunque es un buen comienzo.

dpkg-parsechangelog

Esta herramienta es muy sencilla, simplemente se usa para verificar que el formato del fichero d/changelog es correcto. En nuestro caso no estamos generando manualmente d/changelog, sino que lo obtenemos gracias a gbp, por lo que es difícil que haya errores sintácticos aquí, en cualquier caso podemos usar dpkg-parsechangelog para verificar que dicho formato es correcto:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ dpkg-parsechangelog
Source: dnsproxy
Version: 1.17-1
Distribution: UNRELEASED
Urgency: medium
Maintainer: Alberto Molina Coballes <alb.molina@gmail.com>
Timestamp: 1590066693
Date: Thu, 21 May 2020 13:11:33 +0000
Closes: 876201
Changes:
 dnsproxy (1.17-1) UNRELEASED; urgency=medium
 .
   * [f63febc] New upstream version 1.17
   * [a007371] d/source/format: Set format to 3.0 (quilt)
   * [6ff5edd] d/control: Update maintainer (Closes: #876201)
   * [c95877c] d/control: Set new Vcs-Git and Vcs-Browser
   * [1f67e58] d/control: Use secure URI in Homepage field
   * [b646ec1] d/control: Bump to debhelper-compat 13
   * [988d7a1] d/postinst: Update to comply with the FHS
   * [eea18b4] d/control: Add Pre-Depends field
   * [8e5d4af] d/patches: Add patch to avoid wrong exit status

autopkgtest

autopkgtest es una herramienta que permite la ejecución genérica de tests, que no tienen por qué estar relacionados ni con el desarrollo de Debian, ni con la instalación propia del paquete, sino con algún aspecto propio de la ejecución del programa que queramos verificar que se realiza correctamente.

En este caso vamos a realizar un test muy sencillo, que es simplemente comprobar que la ejecución de la instrucción “dnsproxy -h” se realiza correctamente (precisamente para eso creamos en una entrada anterior un parche en el código). Para incorporar este test, creamos el fichero d/tests/control con el siguiente contenido:

Test-Command: dnsproxy -h
Depends: @
Restrictions: needs-root

Para una descripción del formato para los tests de autopkgtest se puede leer README.package-tests.rst.

Construimos un paquete que incluya esta modificación y comprobamos la ejecución de autopkgtest con ese paquete local de la siguiente manera (aprovechamos el entorno schroot que ya tenemos configurado):

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ autopkgtest ../dnsproxy_1.17-1_amd64.deb -- schroot unstable-amd64-sbuild
...
autopkgtest [14:11:46]: test command1: dnsproxy -h
autopkgtest [14:11:46]: test command1: [-----------------------
usage: dnsproxy [-c file] [-dhV]
	-c file  Read configuration from file
	-d       Detach and run as a daemon
	-h       This help text
	-V       Show version information
autopkgtest [14:11:46]: test command1: -----------------------]
autopkgtest [14:11:46]: test command1:  - - - - - - - - - - results - - - - - - - - - -
command1             PASS
autopkgtest [14:11:46]: @@@@@@@@@@@@@@@@@@@@ summary
command1             PASS

Que podemos comprobar que configura el entorno y termina ejecutando el test definido en el mismo. En este caso dicho test se pasa correctamente.

Añadimos esta modificación al repositorio como habitualmente:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git add debian/tests/control 
debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git commit -sm "d/tests/control: Add basic test
> 
> dnsproxy -h is added as a basic test to check the correct execution of the binary"
[master b653155] d/tests/control: Add basic test
 1 file changed, 3 insertions(+)
 create mode 100644 debian/tests/control

piuparts

piuparts es una herramienta que realiza diferentes pruebas de instalación, actualización o desinstalación del paquete sobre un entorno de pruebas y por tanto se utiliza para encontrar errores que pueda tener el paquete en alguna de estas situaciones. piuparts crea entornos chroot en el directorio /tmp y debe ejecutarse como root. Tras instalar el paquete piuparts, podemos usarlo en nuestro caso con un paquete de dnsproxy todavía en desarrollo con la siguiente instrucción:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ sudo piuparts ../dnsproxy_1.17-1_amd64.deb ../dnsproxy_1.17-1_amd64.changes
...
3m38.8s INFO: PASS: All tests.
3m38.8s INFO: piuparts run ends.

blch

blch proviene de “build log hardening check” y es una herramienta que busca en el fichero de salida de la construcción de un paquete la existencia de las etiquetas de “hardening”, si lo ejecutamos utilizando alguno de los ficheros .build del desarrollo de dnsproxy nos mostrará que no se están utilizando estas etiquetas y que por tanto hay que parchear el código para que lo haga:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ blhc ../dnsproxy_1.17-1_amd64.build
CFLAGS missing (-fstack-protector-strong -Wformat -Werror=format-security): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o dnsproxy.o dnsproxy.c
CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o dnsproxy.o dnsproxy.c
CFLAGS missing (-fstack-protector-strong -Wformat -Werror=format-security): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o daemon.o daemon.c
CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o daemon.o daemon.c
CFLAGS missing (-fstack-protector-strong -Wformat -Werror=format-security): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o hash.o hash.c
CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o hash.o hash.c
CFLAGS missing (-fstack-protector-strong -Wformat -Werror=format-security): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o internal.o internal.c
CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o internal.o internal.c
CFLAGS missing (-fstack-protector-strong -Wformat -Werror=format-security): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o log.o log.c
CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o log.o log.c
CFLAGS missing (-fstack-protector-strong -Wformat -Werror=format-security): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o parse.o parse.c
CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o parse.o parse.c
CFLAGS missing (-fstack-protector-strong -Wformat -Werror=format-security): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o stats.o stats.c
CPPFLAGS missing (-D_FORTIFY_SOURCE=2): gcc -Wall -g -D_GNU_SOURCE -O2 -I. -DHAVE_CONFIG_H -DVERSION="\"1.17\""   -c -o stats.o stats.c
LDFLAGS missing (-Wl,-z,relro): gcc -Wl,-z,defs -o dnsproxy dnsproxy.o daemon.o hash.o internal.o log.o parse.o stats.o -levent

Para incluir estas etiquetas modificamos el fichero d/rules de la siguiente forma:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   debian/rules

no changes added to commit (use "git add" and/or "git commit -a")
debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git diff debian/rules
diff --git a/debian/rules b/debian/rules
index 2c14092..c4c264b 100755
--- a/debian/rules
+++ b/debian/rules
@@ -18,7 +18,8 @@ else
         CONFFLAGS += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
 endif
 
-CFLAGS = -Wall -g -D_GNU_SOURCE
+CFLAGS = -Wall -g -D_GNU_SOURCE -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2
+LDFLAGS = -Wl,-z,relro
 
 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
        CFLAGS += -O0
@@ -40,7 +41,7 @@ endif
                        --infodir=\$${prefix}/share/info \
                        --with-native-libevent \
                        CFLAGS="$(CFLAGS)" \
-                       LDFLAGS="-Wl,-z,defs"
+                       LDFLAGS="$(LDFLAGS)"
 
 build: build-stamp
 
debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git add debian/rules
debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git commit -sm "d/rules: Add hardening flags"
[master 06dec3a] d/rules: Add hardening flags
 1 file changed, 3 insertions(+), 2 deletions(-)
debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 501 bytes | 501.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0
To salsa.debian.org:alberto/pkg-dnsproxy.git
   b653155..06dec3a  master -> master

Aunque en estos momentos está pendiente una actualización completa del fichero d/rules, simplificándolo de acuerdo al uso de una versión más moderna de debhelper. Una vez hechos estos cambios y construyendo de nuevo el paquete, la ejecución de blhc se realiza correctamente y no se muestran errores ni advertencias.

Utilización del sistema de integración continua de salsa

Salsa incluye un sistema de integración continua que permite la ejecución automática de pruebas en determinados casos: cada vez que se suba un commit o cuando se marque de una determinada manera. Existen una serie de pruebas ya preparadas en salsa, que utilizan algunas de las herramientas que ya hemos visto y otras más que no hemos explicado en esta entrada. Hacer uso del sistema de integración continua de salsa es realmente sencillo, en primer lugar debemos habilitarlo en el Menú “Settings/CI/CD/General Pipelines/” Definiendo la variable “Custom CI configuration path” con un fichero YAML dentro del directorio debian, por ejemplo “debian/gitlab-ci.yml”. A continuación creamos el fichero d/gitlab-ci.yml con el siguiente contenido:

include:
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml

variables:
  RELEASE: 'unstable'

Y subir a salsa un commit con el mismo:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git add debian/gitlab-ci.yml 
debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git commit -sm "src:dnsproxy: Add salsa CI integration
> 
> Add basic CI integration following the Basic Use explained in:
> https://salsa.debian.org/salsa-ci-team/pipeline/blob/master/README.md
> 
> "
[master 2014d6b] src:dnsproxy: Add salsa CI integration
 1 file changed, 7 insertions(+)
 create mode 100644 debian/gitlab-ci.yml
debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git push
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 577 bytes | 577.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0), pack-reused 0
To salsa.debian.org:alberto/pkg-dnsproxy.git
   06dec3a..2014d6b  master -> master

En salsa.debian.org/salsa-ci-team/pipeline/blob/master/README.md aparecen más detalles para configurar este fichero de pruebas en salsa.

Salsa lanza por primera vez el sistema de integración continua que trata de construir el paquete y luego lanzar una pila de pruebas sobre el paquete si se construye correctamente, pero en este momento falla la construcción porque hay un desfase entre la versión que se trata de construir (la última que aparece en d/changelog es la 1.16-0.1) y lo que hay en el repositorio que se corresponde con la versión 1.17. La ejecución de pruebas se realiza en un “pipeline” público, en este caso el Pipeline #138952, en el que podemos ver los registros con los errores a la hora de construir el paquete.

Actualizar d/changelog

La situación anterior nos lleva a incluir un d/changelog actualizado en nuestro repositorio, aunque no necesariamente implique la publicación de una versión (eso lo haríamos en el caso de que no se produjesen errores y ya estuviésemos suficientemente satisfechos con el estado del paquete), así que creacmos un fichero d/changelog para unstable con los cambios hechos hasta ahora:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ gbp dch --id-length=7
gbp:info: Found tag for topmost changelog version '195a80463f10b024a82ca87e558d027fad2e0e77'
gbp:info: Continuing from commit '195a80463f10b024a82ca87e558d027fad2e0e77'

Cambiamos UNRELEASED por unstable y vemos el cambio con git:

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ sed -i 's/UNRELEASED/unstable/g' debian/changelog 

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git diff
diff --git a/debian/changelog b/debian/changelog
index 0c5d751..ad3c1a4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,21 @@
+dnsproxy (1.17-1) unstable; urgency=medium
+
+  * [f63febc] New upstream version 1.17
+  * [a007371] d/source/format: Set format to 3.0 (quilt)
+  * [6ff5edd] d/control: Update maintainer (Closes: #876201)
+  * [c95877c] d/control: Set new Vcs-Git and Vcs-Browser
+  * [1f67e58] d/control: Use secure URI in Homepage field
+  * [b646ec1] d/control: Bump to debhelper-compat 13
+  * [988d7a1] d/postinst: Update to comply with the FHS
+  * [eea18b4] d/control: Add Pre-Depends field
+  * [8e5d4af] d/patches: Add patch to avoid wrong exit status
+  * [b653155] d/tests/control: Add basic test
+  * [06dec3a] d/rules: Add hardening flags
+  * [2014d6b] src:dnsproxy: Add salsa CI integration
+  * [f8b0645] d/rules: add mandatory fields build-arch and build-indep
+
+ -- Alberto Molina Coballes <alb.molina@gmail.com>  Fri, 22 May 2020 15:13:08 +0000
+
 dnsproxy (1.16-0.1) unstable; urgency=low
 
   * Non-maintainer upload.

Si estamos conformes con este d/cahngelog, lo añadimos como commit y lo subimos a salsa, lo que volverá a lanzar el sistema de CI, pero en este caso construirá el paquete 1.17-1 que hemos comprobado localmente que se construye correctamente y hemos pasado ya algunas de las pruebas (en este commit añadimos “Git-Dch: Ignore” para que no se incluya en el próximo changelog):

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git add debian/changelog 

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git commit -sm "d/changelog: generate entry for 1.17-1
> 
> New changelog entry
> 
> Git-Dch: Ignore
> "
[master d50439a] d/changelog: generate entry for 1.17-1
 1 file changed, 18 insertions(+)

debian@debian:~/git/debian/dnsproxy/pkg-dnsproxy$ git push
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 2 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 1.33 KiB | 1.33 MiB/s, done.
Total 8 (delta 6), reused 0 (delta 0), pack-reused 0
To salsa.debian.org:alberto/pkg-dnsproxy.git
   2014d6b..d50439a  master -> master

El sistema de CI se vuelve a disparar en salsa en el Pipeline #139018, que tras unos minutos se construye bien el paquete, pero se producen errores en autopkgtest y reprotest:

salsa pipeline

Tenemos los registros de la ejecución de esas pruebas y podemos ver los fallos y por qué están ocurriendo (en particular habrá que hacer algún cambio en el test de autopkgtest ya que localmente sí funciona, pero no es exactamente el mismo entorno). De cualquier forma, la intención de esta entrada era mostrar la forma en que se pueden ir integrando en el desarrollo de un paquete debian diferentes herramientas para realizar pruebas e incluso la utilización del sistema de integración continua de salsa. En cuanto al desarrollo de dnsproxy, seguimos avanzando y cada vez estamos más cerca de una versión publicable, en parte gracias a la ayuda de estas herramientas, que a mí particularmente me sorprendieron gratamente cuando las conocí. Seguimos avanzando, poco a poco, pero a buen ritmo :).

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s