descricao imagem aqui

Neste post irei demonstrar como criar pacotes para o sistema operacional livre Debian GNU/Linux, submeter esses pacotes ao projeto oficial, resolver e documentar questões sobre licenças, e uma série de outras informações relacionadas ao processo de empacotamento Debian, especialmente sobre o empacotamento de módulos Perl.

O Debian é um sistema operacional livre criado e mantido por um grupo independente de desenvolvedores espalhados ao redor do mundo, o projeto foi iniciado em 1993 e tem sido desenvolvido abertamente desde então, sempre seguindo o espírito livre do projeto GNU. O sistema de gerenciamento de pacotes Debian, chamado APT, foi criado originalmente pelos desenvolvedores do projeto e conta hoje com 51 mil pacotes em seus repositórios oficiais.

A enorme quantidade de pacotes disponíveis torna extremamente simples pesquisar, instalar, atualizar ou remover qualquer software em seu computador, seja desktop, servidor ou qualquer outra plataforma suportada pelo Debian. Contribuir com o empacotamento de novos projetos de software ou com a manutenção dos pacotes existentes é uma forma muito simples e útil de melhorar a qualidade geral deste sistema operacional universal.

Vamos lá! Os exemplos relatados aqui serão com o módulo Devel::FindPerl, empacotado durante a escrita deste post e que até a data de publicação ainda não estava empacotado no Debian.

Instalar as dependências para empacotamento

Primeiro, antes de tudo, é necessário utilizar alguma versão do Debian, stable, testing, ou unstable e ter os seguintes pacotes instalados.


apt install devscripts debhelper git-buildpackage pkg-perl-tools

Consulte o guia do Debian Perl Group sobre uso do Git para mais detalhes sobre os pacotes necessários. Instale também o apt-file e atualize a sua base de dados para que o dh-make-perl possa descobrir qual pacote é de qual módulo.


apt install apt-file
apt-file update

Assim é possível descobrir quando um certo módulo Perl já está empacotado no Debian, execute o comando abaixo para descobrir se o módulo Devel::FindPerl está empacotado e qual é o nome do pacote em caso afirmativo.


dh-make-perl locate Devel::FindPerl

Até o momento da escrita deste post o módulo Devel::FindPerl não está empacotado no Debian então o dh-make-perl reporta o seguinte.


== dh-make-perl 0.95 ==
Using cached Contents from Sun Jul 16 19:21:00 2017
Devel::FindPerl is not found in any Debian package

Criar a versão inicial do pacote

Infome ao Git quem você é para que o dh-make-perl gere o template inicial do pacote com as informações corretas.


git config --global user.email "you@example.com"
git config --global user.name "Your Name"

Crie também as variáveis de ambiente abaixo com seu nome e email, isso ajuda o dh-make-perl a criar os arquivos do pacote em debian/ com seus dados corretamente.

export EMAIL=you@example.com
export DEBFULLNAME="Your Name"

Crie a versão inicial do pacote.


dh-make-perl --pkg-perl --cpan Devel::FindPerl

Atenção! Se o cpan nunca foi utilizado execute-o antes do dh-make-perl para que sejam criadas as configurações básicas.

O dh-make-perl criará um repositório Git local com a cópia da última versão do módulo Devel::FindPerl já com os arquivos necessários para o pacote Debian, o nome dado ao pacote será libdevel-findperl-perl, este é o padrão definido pela política de nomes para pacotes do Debian Perl Group.

Correções básicas no template inicial

O template inicial do pacote criado pelo dh-make-perl é bom mas não é ideal, muitas alterações são necessárias até o pacote estar pronto para entrar nos repositórios oficiais do projeto Debian, geralmente é necessário alterar ao menos os seguintes arquivos:

debian/copyright

Adicionar o ano em cada linha do copyright, exemplo:

Files: debian/*
Copyright: 2006, Florian Ragwitz <rafl@debian.org>
 2008-2014, gregor herrmann <gregoa@debian.org>
 2008, Damyan Ivanov <dmn@debian.org>
License: Artistic or GPL-1+

Remover DISCLAIMER do copyright adicionado pelo dh-make-perl automaticamente.

Se o upstream não informar o ano nas notas de copyright do código fonte então será necessário documentar isso de alguma forma, as opções são (1) fazer um comentário como feito no liblog-dispatch-config-perl/debian/copyright ou (2) utilizar o padrão Berne Convention Comment.

(1) liblog-dispatch-config-perl:

Comment: Rationale from the author was:
  All of my modules available at http://search.cpan.org/~miyagawa/ with the
  statement "AUTHOR: Tatsuhiko Miyagawa" are, unless otherwise noted,
  Copyright (c) Tatsuhiko Miyagawa.

(2) Berne Convention:

Comment: The upstream distribution does not contain an explicit statement of
 copyright ownership. Pursuant to the Berne Convention for the Protection of
 Literary and Artistic Works, it is assumed that all content is copyright by
 its respective authors unless otherwise stated.

Eu, geralmente, prefiro usar o comentário no formato Berne Convention.

debian/control

Escolher uma boa descrição é fundamental, deve-se levar um bom tempo nisso, tanto para a descrição curta, quanto para a descrição longa do pacote.

Consulte a política para descrição de pacotes no manual de políticas do Debian para mais detalhes sobre como descrever os pacotes de forma adequada. A descrição curta deve, usualmente, iniciar com letra minúscula e deve ser uma “noum phrase” (substantivo). No caso do pacote Devel::FindPerl alterei a descrição gerada pelo dh-make-perl para o seguinte.

single line synopsis:

Description: Perl module to find the path to the currently running perl

Usei descrição curta iniciando com maiúscula por se tratar de um nome próprio neste caso, a linguagem de programação é Perl e não perl, perl é o interpretador.

extended description:

 The Devel::FindPerl module tries to find the path to the currently running
 perl. It implements a function to try (really really hard) to find the path to
 the perl running your program and another function to test if the perl in
 `$path` is the same perl as the currently running one.
 .
 SECURITY ALERT: This module by default does things that are not particularly
 secure (run programs based on external input).

debian/changelog

Deve ser informado no arquivo debian/changelog uma mensagem referenciando o fechamendo de um bug do tipo ITP e o pacote deve ser indicado como unstable, isto significa que os pacotes sempre entram na distribuição unstable, a partir disso segue seu fluxo até chegar na versão stable, passando pela testing.

Reportar bug do tipo ITP com reportbug

reportbug é uma ferramenta de linha de comando para reportar bugs do sistema Debian. Ao empacotar um software é importante registrar que temos a intenção de empacotar este software para que a comunidade Debian tenha conhecimento de que alguém está trabalhando nisso e assim evitar re-trabalho e sobreposição, um pseudo-pacote chamado wnpp (Work-Needing and Prospective Packages) é utilizado para concentrar os bugreports relativos a novos pacotes.

Os bugs reportados no pseudo-pacote wnpp recebem tags indicando o tipo do “bug”, neste caso queremos reportar um bug indicando que estamos trabalhando (ou iremos trabalhar) num novo pacote, a tag para isso é a ITP (Intent To Package), consulte a documentação oficial do reportbug para saber como configurá-lo e execute o seguinte comando para registrar um bug do tipo ITP.


reportbug wnpp

Selecione 1 ITP, informe o nome do pacote como libdevel-findperl-perl, informe a descrição do pacote, use a mesma descrição curta utilizada no debian/control. Após isso o reportbug abrirá um editor de texto com o template da mensagem de bug a ser enviada, adicione as seguintes informações:

  1. versão do pacote = 0.015
  2. nome do upstream = Leon Timmermans leont@cpan.org, Randy Sims randys@thepierianspring.org
  3. url do upstream = https://metacpan.org/release/Devel-FindPerl
  4. licença = Artistic or GPL-1+
  5. linguagem = Perl
  6. inclua a descrição longa (use o mesmo do arquivo debian/control) no corpo da mensagem

Apague as mensagens adicionadas pelo template do reportbug, salve e feche o arquivo para retornar ao reportbug, ele solicitará confirmação para o envio do email ao sistema de bugs do Debian, responda Y. No exemplo seguido aqui para o pacote Devel::FindPerl a mensagem do reportbug ficou da seguinte forma.

Subject: ITP: libdevel-findperl-perl -- Perl module to find the path to the currently running perl
Package: wnpp
Owner: Joenio Costa <joenio@joenio.me>
Severity: wishlist

* Package name    : libdevel-findperl-perl
  Version         : 0.015
  Upstream Author : Leon Timmermans <leont@cpan.org>
                    Randy Sims <randys@thepierianspring.org>
* URL             : https://metacpan.org/release/Devel-FindPerl
* License         : Artistic or GPL-1+
  Programming Lang: Perl
  Description     : Perl module to find the path to the currently running perl

The Devel::FindPerl module tries to find the path to the currently running
perl. It implements a function to try (really really hard) to find the path to
the perl running your program and another function to test if the perl in
`$path` is the same perl as the currently running one.

SECURITY ALERT: This module by default does things that are not particularly
secure (run programs based on external input).

Verifique a mensagem nos servidores do Debian, você deve receber uma cópia do email, esta mensagem contém o número do bug, adicione o número do bug no arquivo debian/changelog com a mensagem “(Closes #<numero do bug>)”, veja como ficou o changelog do libdevel-findperl-perl.

libdevel-findperl-perl (0.015-1) unstable; urgency=low

  * Initial release. (Closes #928632)

 -- Joenio Costa <joenio@joenio.me>  Tue, 7 May 2019 12:21:30 -0300

A mensagem automática com o número do bug ITP criado para o pacote libdevel-findperl-perl recebida dos servidores do Debian foi a seguinte.

Subject: Bug#928632: Acknowledgement (ITP: libdevel-findperl-perl -- Perl module to find the path to the currently running perl)

Thank you for filing a new Bug report with Debian.

You can follow progress on this Bug here: 928632: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=928632.

This is an automatically generated reply to let you know your message
has been received.

Your message is being forwarded to the package maintainers and other
interested parties for their attention; they will reply in due course.

As you requested using X-Debbugs-CC, your message was also forwarded to
  debian-devel@lists.debian.org
(after having been given a Bug report number, if it did not have one).

Your message has been sent to the package maintainer(s):
 wnpp@debian.org

If you wish to submit further information on this problem, please
send it to 928632@bugs.debian.org.

Please do not send mail to owner@bugs.debian.org unless you wish
to report a problem with the Bug-tracking system.

-- 
928632: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=928632
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems

Atenção sobre dependendências declaradas no debian/control

Não se deve incluir dependencias para os pacotes perl-modules ou perl-base, apenas para perl, lembrar que perl é fornecido por ${perl:Depends}.

Verifique a versão das dependências, nem sempre as sugestões dos desenvolvedores no Makefile.PL está correta, ou pode ocorrer do Debian não possuir versão mais antiga que as versões no Makefile.PL.

Neste ponto já temos o pacote minimamente pronto, vamos testar e usar o lintian para debugar possíveis problemas.

Gerar o pacote e verificar a conformidade com lintian

Commite as mudanças realizadas nos arquivos em debian/ e use o git-buildpackage para gerar o pacote.


gbp buildpackage -us -uc

As flags -us e -uc informam ao processo de build para não assinar o pacote ao final do processo, usamos estas flags apenas enquanto estamos testando, ao final quando for o momento de submeter o pacote ao Debian iremos gerar o pacote e assinar ele com o GnuPG.

O lintian encontrou alguns problemas no empacotamento do módulo Devel::FindPerl:

Now running lintian libdevel-findperl-perl_0.015-1_amd64.changes ...
W: libdevel-findperl-perl: new-package-should-close-itp-bug
E: libdevel-findperl-perl: possible-missing-colon-in-closes Closes #928632
W: libdevel-findperl-perl: spelling-error-in-description really really (duplicate word) really

Dois dos três problemas relatados pelo lintian indica que faltou adicionar dois pontos (:) após a palavra Closes, o diff da mudança necessária para resolver esse problema é o seguinte.

diff --git a/debian/changelog b/debian/changelog
index 914b680..8e8e6f6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,5 @@
 libdevel-findperl-perl (0.015-1) unstable; urgency=low
 
-  * Initial release. (Closes #928632)
+  * Initial release. (Closes: #928632)
 
  -- Joenio Costa <joenio@joenio.me>  Tue, 7 May 2019 12:21:30 -0300

O terceiro warning do lintian spelling-error-in-description é um falso positivo pois a palavra really duplicada está assim de propósito, a descrição do upstream usa essa forma para enfatizar a mensagem, usei a mesma descrição do upstream, neste caso podemos criar um arquivo no pacote para fazer o lintian não mais reclamar desse falso warning, para isso usamos o lintian Override criando o arquivo debian/libdevel-findperl-perl.lintian-overrides com o seguinte conteúdo.

# The package long description duplicate the word "really" on purpose
libdevel-findperl-perl binary: spelling-error-in-description

Após corrigir os warnings do lintian vamos re-gerar o pacote e verificar novamente usando a flag -I para obter mensagens mais descritivas do lintian. Commite as mudanças realizadas no código do pacote (arquivo em debian/), execute novamente gbp buildpackage -us -uc e rode o lintian.


lintian -I

Uma vez que temos uma versão inicial do pacote pronta é interessante publicar em algum repositório para testar a instalação com o APT, claro que é possível instalar o pacote localmente usando o dpkg diretamente.

Publicar o pacote em repositório (não-oficial)

Veja no post Aprenda a criar repositórios de pacotes Debian como criar seu próprio repositório de pacotes Debian usando dput + mini-dinstall + nginx. É necessário gerar o pacote novamente sem o uso das flags -us e -uc para assinar o pacote com GnuPG, o upload para o repositório via dput requer que o pacote esteja assinado.

Irei publicar no repositório http://debian.joenio.me usando o dput para testar a publicação do pacote e na sequência testar a instalação via APT. O dput aceita como parâmetro o arquivo .changes do pacote, para o pacote libdevel-findperl-perl vamos executar o seguinte.


dput debian.joenio.me ../libdevel-findperl-perl_0.015-1_amd64.changes

Altere o endereço do repositório debian.joenio.me pelo seu próprio repositório ou por qualquer outro repositório onde você tem permissão de escrita. Teste a instalação do pacote e garanta que ele instala corretamente, caso encontre problemas resolva e só então submeta o pacote ao Debian. É uma boa prática testar também a construção do pacote num ambiente chroot limpo.

Construir o pacote num ambiente chroot isolado

Existem diversas ferramentas para criar um ambiente Debian limpo voltado para construção de pacotes, geralmente usando chroot, entre os mais comuns estão o sbuild, pbuilder e cowbuilder. Aqui vou mostrar o uso do pbuilder por ser o que costumo utilizar no meu fluxo de empacotamento, execute os comandos abaixo a partir do diretório do pacote.


sudo pbuilder create
sudo pbuilder update
pdebuild

O git-buildpackage oferece um wrapper para o pdebuild, para usar ele e evitar alertas a respeito dos arquivos binários existentes no diretório .git basta executar o pdebuild da seguinte forma:


BUILDER=pbuilder git-pbuilder

Passe a opção --force-sign para assinar os arquivos do pacote, se desejar informar um mirror alternativo passe o parâmetro --othermirror "deb http://local/mirror stable main".

Fazer upload do pacote no repositório do grupo Debian Perl

É necessário solicitar acesso ao Salsa do time Perl do Debian enviando um email com uma curta apresentação pessoal para o seguinte email debian-perl@lists.debian.org. Após ter acesso ao repositório do grupo Perl é hora de fazer upload do pacote no repositório do grupo, mas antes faça uma revisão final no pacote:

  • Verifique se o status do pacote em debian/changelog foi alterado de UNRELEASED para unstable
  • Garanta que há uma mensagem (Closes: #NNNNNN) no debian/changelog indicando o número do bug ITP
  • Verifique a versão correta de “Standards-Version:”, aqui a versão utilizada foi 4.3.0
  • Use o formato correto no arquivo debian/copyright, atualmente usar DEP-5
  • Verificar o COPYRIGHT de cada arquivo (usar grep ou ack) para buscar a quem pertence o copyright de cada arquivo

Feito as verificações finais, use o comando abaixo para criar e configurar um novo projeto no Salsa, e subir o repositório local do nosso novo pacote libdevel-findperl-perl.


dpt salsa pushrepo

Atenção! Lembre de registrar um token em https://salsa.debian.org/profile/personal_access_tokens e defina este token na variável de ambiente DPT_SALSA_PRIVATE_TOKEN para que o dpt tenha acesso de escrita no servidor Salsa.

Para saber mais detalhes de como fazer upload do seu pacote veja a documentação pushing to salsa.debian.org, além do token é necessário também fazer upload de sua chave ssh no Salsa, ele é uma instância do Gitlab, então basta acessar sua conta ir em preferências e configurar uma chave ssh por lá.

Algum tempo após o upload o pacote entra no PET (Package Entropy Tracker), mas apenas caso nenhum revisor solicite alterações mudando o status em debian/changelog para UNRELEASED. Além disso, alguns pacotes marcados na whitelist são executados contra o autopkgtest no servidor CI do Debian e podem ser consultados em ci.debian.net.

O módulo Devel::FindPerl empacotado para libdevel-findperl-perl durante a escrita deste post foi submetido ao repositório do Debian Perl Group e pode ser visualizado em: