Tutorial de empacotamento Debian - Parte 2
Este tutorial descreve passo-a-passo como criar pacotes de bibliotecas da linguagem de programação Perl para o sistema operacional Debian e submetê-lo aos repositórios oficiais via Debian Perl Group.
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.
Roteiro deste tutorial
Esta é a segunda parte do Tutorial de empacotamento Debian e é importante que você tenha feito a parte 1, caso contrário volte a parte 1 e siga ao menos as etapas de configuração do ambiente de desenvolvimento, link abaixo.
Após fazer as configurações básicas e instalar os pacotes necessários vamos iniciar a parte 2 deste tutorial seguindo o roteiro abaixo.
- Selecionar um dos pacotes candidatos para empacotamento
- Criar o pacote da biblioteca selecionada
- Construir o pacote e verificar problemas
- Executar testes automatizadod do pacote
- Submeter o pacote aos repositórios oficiais via Debian Perl Group
Pacotes candidatos para empacotamento
Seleciona uma das bibliotecas abaixo, algumas já possuem bug do tipo RFP aberto no sistema de acompanhamento de bugs (Bug Tracking System - BTS) do Debian, as demais são bibliotecas Perl com upload recente no cpan.org ainda nao empacotados no Debian, e que possuam uma ou mais dependencias reversas, isso significa que a biblioteca tem usuários.
- Crypt::OpenSSL::CA - Bug RFP #1016950
- Date::Holidays::AW
- Date::Holidays::NL
- DateTime::Format::Atom - Bug RFP #875785
- Devel::AssertOS
- Getopt::EX::Hashed esta foi a biblioteca que eu selecionei e os exemplos escritos serão com ela, por favor selecione uma biblioteca diferente
- Git::CPAN::Patch - Bug RFP #733922
- Hash::Wrap
- Mail::GPG - Bug RFP #866593
- Module::Generic
- Net::AMQP::RabbitMQ - Bug RFP #1005216
- PDL::Graphics::PLplot - Bug RFP #763203
- Perl::Critic::Plicease
- Prima
- Term::ANSIColor::Concise
- WebService::SSLLabs - Bug RFP #853780
Selecionar um dos pacotes abaixo para empacotamento
Selecione um dos pacotes candidatos acima e siga os passos que se seguem adaptando sempre o nome da biblioteca e o nome do pacote que você escolheu, o tutorial irá descrever os passos para o pacote Getopt::EX::Hashed, você deve selecionar um pacote diferente entre os pacotes acima, ou se preferir pode selecionar outra biblioteca qualquer que ainda não esteja empacotada no Debian.
Criar o pacote da biblioteca selecionada
Antes de criar a versão inicial do pacote verifique se o pacote não está empacotado no Debian.
sudo apt-file update
dh-make-perl locate Getopt::EX::Hashed
== dh-make-perl 0.124 ==
Using cached Contents from Wed May 15 21:03:54 2024
Getopt::EX::Hashed is not found in any Debian package
Garantindo que o pacote não está presente, vamos seguir e criar o template inicial
do pacote usando o dh-make-perl
.
dh-make-perl --pkg-perl --cpan Getopt::EX::Hashed
Correções básicas no template inicial
O dh-make-perl
criou o pacote inicial libgetopt-ex-hashed-perl para a biblioteca Getopt::EX::Hashed,
é necessário realizar algumas correções.
Arquivo debian/copyright
A primeira correção é o ano e o email do autor do pacote, será preciso buscar essas duas informações no código fonte da biblioteca Getopt::EX::Hashed.
Files: *
Copyright: <INSERT COPYRIGHT YEAR(S) HERE>, Kazumasa Utashiro
License: Artistic or GPL-1+
Podemos analisar os arquivos manualmente abrindo de um em um para encontrar essa informação ou usar os comandos abaixo para nos auxiliar.
grep -i -r --exclude-dir=.git --exclude-dir=debian copyright
licensecheck --shortname-scheme=debian,spdx --copyright --recursive .
scan-copyrights
Analisando a saída de cada um desse comandos foi possível identificar que o ano
do copyright do Getopt::EX::Hashed é 2021-2024
e o email do author é kaz@utashiro.com
, essas duas
alterações no arquivo debian/copyright
nos dá o seguinte diff abaixo.
joenio@debian-dev-main:~/tutorial/libgetopt-ex-hashed-perl$ git diff
diff --git a/debian/copyright b/debian/copyright
index 4860058..018e342 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -12,7 +12,7 @@ DISCLAIMER: This copyright info was automatically extracted
with this file.
Files: *
-Copyright: <INSERT COPYRIGHT YEAR(S) HERE>, Kazumasa Utashiro
+Copyright: 2021-2024, Kazumasa Utashiro <kaz@utashiro.com>
License: Artistic or GPL-1+
Files: debian/*
Commit.
git commit debian/copyright -m 'd/copyright: add upstream copyright year/email'
Remova também o DISCLAIMER adicionado pelo dh-make-perl
e commit.
git commit debian/copyright -m 'd/copyright: remove dh-make-perl disclaimer'
No exemplo seguido aqui essas duas alterações são suficientes mas é possível que a biblioteca que você escolheu necessite de mais alterações, é possível que exista mais de um nome declarado como dono do copyright nos arquivos de código-fonte, é necessário adicionar cada nome com seus respectivos ano e email.
A título de exemplo é possível definir algo como no exemplo abaixo, com múltiplos nomes,
e ano diferentes no arquivo debian/copyright
.
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+
O que fazer se upstream não informar corretamente o ano do copyright?
Caso o upstream não forneça informação sobre o copyright de algum arquivo será necessário documentar isso de alguma forma, uma opção é adotar o padrão Berne Convention Comment e adicionar o seguinte comentário.
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.
Arquivo debian/control
Verifique o arquivo debian/control
no seu editor de texto preferido e
se necessário atualize o campo Standards-Version
para versão 4.7.0
.
Standards-Version: 4.7.0
Faça commit da mudança.
git commit debian/control -m 'declare compliance with Debian Policy 4.7.0'
Verifique também a versão do debhelper-compat
, deve estar com
a versão mais recente 13
.
Build-Depends: debhelper-compat (= 13),
E commit caso tenha alterado o arquivo.
git commit debian/control -m 'update debhelper compat to 13'
Atualize a descrição do pacote, tanto para a descrição curta (synopsis), quanto para a descrição longa (extended description), veja por exemplo o diff com a descrição do libgetopt-ex-hashed-perl.
joenio@debian-dev-main:~/tutorial/libgetopt-ex-hashed-perl$ git diff
diff --git a/debian/control b/debian/control
index d5bdf38..a5db9da 100644
--- a/debian/control
+++ b/debian/control
@@ -20,19 +20,10 @@ Architecture: all
Depends: ${misc:Depends},
${perl:Depends},
libscalar-list-utils-perl
-Description: Hash store object automation for Getopt::Long
- Getopt::EX::Hashed is a module to automate a hash object to store command
- line option values for Getopt::Long and compatible modules including
- Getopt::EX::Long. Module name shares Getopt::EX prefix, but it works
- independently from other modules in Getopt::EX, so far.
+Description: Perl module to automatically store Getopt::Long options into Hash
+ The Getopt::EX::Hashed is a module to automate a hash object to store command
+ line option values for Getopt::Long and compatible modules, including
+ Getopt::EX::Long.
.
- Major objective of this module is integrating initialization and
- specification into single place. It also provides simple validation
- interface.
- .
- Accessor methods are automatically generated when is parameter is given. If
- the same function is already defined, the program causes fatal error.
- Accessors are removed when the object is destroyed. Problems may occur when
- multiple objects are present at the same time.
- .
- This description was automagically extracted from the module by dh-make-perl.
+ The module name shares the Getopt::EX namespace, but it works independently
+ from other modules with the Getopt::EX prefix.
Commit as modificações feita na descrição.
git commit debian/control -m 'rephrase synopsis and extended description'
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
.
Verifique se debian/control
contém a seguinte definição para declarar que o
build do pacote não precisa de root e pode ser executado com usuário comum,
que é o caso da maioria dos pacotes Perl.
Rules-Requires-Root: no
Por fim, use o cme
para analisar o debian/control
e corriga os eventuais
alertas e problemas relatados.
cme check dpkg-control debian/control
Se a saída for semelhante ao conteúdo abaixo significa que não foi encontrado
nenhum erro ou alerta e o arquivo debian/control
está ok.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Arquivo debian/changelog
Será necessário alterar este arquivo pois nele é onde fazemos referência ao número do bug report no sistema de bugs do Debian, veremos isso mais adiante, algo necessário para pacotes que serão submetidos ao repositório oficial do Debian.
Construir o pacote num ambiente chroot isolado
É importante manter o chroot sempre atualizado, então lembre de sempre executar o comando abaixo antes de buildar um novo pacote.
sudo pbuilder update
Gerar o pacote e verificar a conformidade com lintian
Construir o pacote dentro do chroot além da vantagem de isolamento possui também a
comodidade de não precisar instalar manualmente as dependências de build do pacote pois
o pbuilder
toma conta de instalar tudo que está declarado no debian/control
.
BUILDER=pbuilder git-pbuilder
Lembre de rodar o Lintian com a flag específicas para pacotes Perl --profile
pkg-perl
, isto inclui algumas verificações específicas definidas pelo Debian
Perl Group. Adicione também a flag --info
para ver mais detalhes com explicação sobre os alertas.
lintian -I --profile pkg-perl --info
O lintian produziu os dois alertas abaixo para o pacote libgetopt-ex-hashed-perl
W: libgetopt-ex-hashed-perl: initial-upload-closes-no-bugs [usr/share/doc/libgetopt-ex-hashed-perl/changelog.Debian.gz:1]
W: libgetopt-ex-hashed-perl source: newer-standards-version 4.7.0 (current is 4.6.2)
O primeiro alerta initial-upload-closes-no-bugs será corrigido na próxima etapa, já o alerta newer-standards-version pode ser ignorado pois aparentemente se trata de um falso-positivo que será atualizado numa próxima versão do lintian como pode ser visto no commit abaixo.
Executar o testes funcionals do Debian com autopkgtest
O autopkgtest do time de Perl injeta uma serie de testes que “no caso geral” funciona com qualquer biblioteca do CPAN (exemplo: smokes, use.t, syntax.t, etc…), veja detalhes no link abaixo.
No link abaixo há um tutorial simples, curto e pratico feito no debci sobre o autopkgtest:
Vamos usar o autopkgtest combinado com schroot,
a ferramenta mk-sbuild
torna a vida mais facil para criar chroots sem
precisar root, basta adicionar o seu usuario ao grupo sbuild.
Após adicionar seu usuário ao grupo sbuild
é necessário fazer logout e login
no Debian.
sudo apt-get install ubuntu-dev-tools
sudo adduser joenio sbuild
Entao execute mk-sbuild <release>
, sera criado um chroot com o nome
<release>-<arch>
, exemplo sid-amd64
.
mk-sbuild sid
depois basta rodar no codigo do pacote para buildar com esse chroot:
autopkgtest . -- schroot sid-amd64
As últimas linhas impressas no terminal após a execução do autopkgtest
informa que o pacote
rodou os testes com sucesso.
All tests successful.
Files=1, Tests=4, 0 wallclock secs ( 0.01 usr 0.01 sys + 0.05 cusr 0.00 csys = 0.07 CPU)
Result: PASS
autopkgtest [12:43:16]: test autodep8-perl-recommends: -----------------------]
autopkgtest [12:43:16]: test autodep8-perl-recommends: - - - - - - - - - - results - - - - - - - - - -
autodep8-perl-recommends PASS (superficial)
autopkgtest [12:43:16]: @@@@@@@@@@@@@@@@@@@@ summary
autodep8-perl-build-deps PASS
autodep8-perl PASS (superficial)
autodep8-perl-recommends PASS (superficial)
Atualizar o arquivo debian/changelog
com o número do bug
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.
Mas se você selecionou um dos pacotes candidatos com bug do tipo RFP já aberto
então não é necessário abrir um ITP, basta referenciar o número do bug RFP no
arquivo debian/changelog
.
Deve ser informado no arquivo debian/changelog
uma mensagem referenciando o
fechamendo de um bug do tipo ITP ou RFP, em resumo:
- ITP - Intenção de empacotar (“Intent To Package”) você mesmo.
- RFP - Requisição de empacotamento (“Request For Package”) para uma outra pessoa.
Reportar bug do tipo ITP
É possível usar a ferramenta reportbug
, uma ferramenta de linha de comando para reportar bugs do sistema
Debian em conjunto com o msmtp
. Os dois juntos permitem enviar emails para abertura de bugs
diretamente da linha de comando, o msmtp pode ser útil também em outros contextos, como por
exemplo no uso da ferramenta caff para assinaturas de chaves GPG,
mas
a configuração do reportbug
e do msmtp
está fora de escopo deste tutorial e você deve enviar o email
usando seu cliente de email preferido.
Mas se quiser se aventurar e usar o reportbug
e o msmtp
consulte os
links abaixo.
Vamos utilizar o dpt gen-itp
para gerar o conteúdo do email,
basta executar o comando abaixo a partir do diretório do pacote, no meu caso é libgetopt-ex-hashed-perl
.
O gen-itp
irá ler a descrição curta do debian/control
e outras informações dos arquivos no debian/
.
dpt gen-itp > /tmp/mail
cat /tmp/mail
From: =?UTF-8?B?Sm9lbmlvIE1hcnF1ZXMgZGEgQ29zdGEgPGpvZW5pb0Bqb2VuaW8ubWU+?=
To: Debian Bug Tracking System <submit@bugs.debian.org>
Subject: ITP: libgetopt-ex-hashed-perl -- Perl module to automatically store Getopt::Long options into Hash
Date: Wed, 15 May 2024 23:25:32 +0200
Package: wnpp
Owner: Joenio Marques da Costa <joenio@joenio.me>
Severity: wishlist
X-Debbugs-CC: debian-devel@lists.debian.org, debian-perl@lists.debian.org
* Package name : libgetopt-ex-hashed-perl
Version : 1.0601
Upstream Author : Kazumasa Utashiro
* URL : https://metacpan.org/release/Getopt-EX-Hashed
* License : Artistic or GPL-1+
Programming Lang: Perl
Description : Perl module to automatically store Getopt::Long options into Hash
The Getopt::EX::Hashed is a module to automate a hash object to store command
line option values for Getopt::Long and compatible modules, including
Getopt::EX::Long.
The module name shares the Getopt::EX namespace, but it works independently
from other modules with the Getopt::EX prefix.
The package will be maintained under the umbrella of the Debian Perl Group.
--
Generated with the help of dpt-gen-itp(1) from pkg-perl-tools.
Copie e cole os campos de assunto, destinatário e corpo do email, veja exemplo
abaixo usando o Thunderbird, use o seu cliente de email e envie a mensagem para submit@bugs.debian.org
.
Aguarde alguns minutos e verifique a mensagem nos servidores do Debian, você deve receber uma
cópia do email semelhante a esta mensagem aqui, ela 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>)”, use o comando dch
para auxiliar nesta tarefa.
dch --closes 1071196
Você deve substituir o número 1071196 pelo número do seu bug,
veja
como ficou o changelog do libgetopt-ex-hashed-perl
.
libgetopt-ex-hashed-perl (1.0601-1) UNRELEASED; urgency=low
* Initial release. (Closes: #1071196)
-- Joenio Marques da Costa <joenio@joenio.me> Wed, 15 May 2024 21:14:29 +0200
git commit debian/changelog -m 'd/changelog: add ITP bug number'
Alterar pacote de UNRELEASED para unstable
Esta é a última mudança no pacote antes de fazer upload do pacote,
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
.
Atualizar debian/changelog
e atualize no
cabeçalho do arquivo de UNRELEASED para unstable.
O comando dch -r
(--release
) atualizar automaticamente o debian/changelog
de UNRELEASED para
unstable, e atualiza a data.
dch --release
git commit debian/changelog -m 'd/changelog: ready for review and upload'
Fazer upload do pacote no repositório do time Debian Perl
Está tudo pronto para fazer upload, falta apenas ter acesso ao repositório do Debian Perl Group no Salsa, Salsa é uma instância do Gitlab e funciona como uma plataforma de desenvolvimento colaborativa dentro do Debian. Para escrever no repositório do Debian Perl Group é necessário fazer parte do time, para isso é necessário seguir os seguintes passos.
- Criar uma conta no Salsa se registrando aqui https://salsa.debian.org/users/sign_up
- Configurar uma chave SSH associada ao seu perfil
- Solicitar ser adicionado ao time Debian Perl Group
- Envie um email para debian-perl@lists.debian.org se apresentando brevemente
- O email deve ser escrito em inglês e você deve indicar qual é seu username salsa
- Veja um exemplo aqui: https://lists.debian.org/debian-perl/2022/12/msg00000.html
- Registrar um token em https://salsa.debian.org/profile/personal_access_tokens
e adicionar a variável
DPT_SALSA_PRIVATE_TOKEN
no arquivo~/.dpt.conf
com este token
A conta no Salsa precisa ser validada por um administrador, isso pode levar algum tempo e deve-se aguardar. Use seu nome real ao inscrever-se pora reduzir falsos positivos na heurística de detecção de spammers, mais sobre Salsa em:
Configurar dpt com o token Salsa
Uma vez que seu usuário Salsa foi criado e você foi adicionado ao time Debian Perl Group,
basta atualizar a configuração do dpt
em ~/.dpt.conf
e adicionar o TOKEN de acesso do
Salsa para poder escrever nos repositórios do grupo e poder enviar as
atualizações do pacote.
DPT_SALSA_PRIVATE_TOKEN=***COPIE EU TOKEN AQUI***
Uma vez tendo usuário no Salsa e fazendo parte do time Debian Perl Group, compartilhe o pacote enviando as atualizações para o repositório do grupo com o seguinte comando.
Upload
É 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)
nodebian/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
- Registre 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 odpt
tenha acesso de escrita no servidor Salsa.
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 libgetopt-ex-hashed-perl
.
dpt salsa pushrepo
O módulo Getopt::EX::Hashed
empacotado para libgetopt-ex-hashed-perl
durante a escrita
deste post foi submetido ao repositório do Debian Perl Group e pode ser visualizado em:
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 um DD (Debian Developer) irá
revisar o pacote e caso encontre problemas vai solicitar alterações mudando o status em
debian/changelog
para UNRELEASED
.
Bem, é isso, espero que este texto seja útil ajudando e incentivando mais pessoas a empacotar software no Debian, uma atividade muito importante e que requer um trabalho constante.
Video demo sobre o dpt
a imagem utilizada no cabeçalho do post foi copiada de https://www.deviantart.com/mdh3ll/art/Debian-shot-311580879