7. Construindo a Mídia de Instalação do FreeBSD

Esta seção descreve os procedimentos gerais de produção de snapshots e releases de desenvolvimento do FreeBSD.

7.1. Scripts para compilação de Releases

Esta seção descreve os scripts de build usados ​​pela Equipe de Engenharia de Release do FreeBSD para produzir snapshots da versão em desenvolvimento e das releases

7.1.1. O script release.sh

Antes do FreeBSD 9.0-RELEASE, o src/release/Makefile era atualizado para suportar o bsdinstall(8), e o script src/release/generate-release.sh foi introduzido como um wrapper para automatizar a chamada dos targets release(7).

Antes do FreeBSD 9.2-RELEASE, foi introduzido o src/release/release.sh, que baseado fortemente em src/release/generate-release.sh incluía suporte para especificar arquivos de configuração para substituir várias opções e variáveis ​​de ambiente. O suporte para arquivos de configuração forneceu suporte para cross building (compilação para mais de uma arquitetura) de uma release para cada arquitetura, especificando um arquivo de configuração separado para cada chamada.

Como um breve exemplo do uso de src/release/release.sh para construir uma única versão em /scratch:

# /bin/sh /usr/src/release/release.sh

Como um breve exemplo do uso de src/release/release.sh para construir uma única versão cross-build (entre arquiteturas) usando um diretório de destino diferente, crie um release.conf personalizado contendo:

# release.sh configuration for powerpc/powerpc64
CHROOTDIR="/scratch-powerpc64"
TARGET="powerpc"
TARGET_ARCH="powerpc64"
KERNEL="GENERIC64"

Em seguida, invoque src/release/release.sh da seguinte forma:

# /bin/sh /usr/src/release/release.sh -c $HOME/release.conf

Veja release(7) e src/release/release.conf.sample para mais detalhes e exemplos de uso.

7.1.2. O Script Wrapper thermite.sh

Para tornar o cross building do conjunto completo de arquiteturas suportadas em uma determinada branch mais rápido, mais fácil e reduzindo os fatores de erro humano, um script wrapper de apoio ao src/release/release.sh foi escrito para iterar pelas várias combinações de arquiteturas e chamar o script src/release/release.sh usando um arquivo de configuração específico para essa arquitetura.

O script wrapper é chamado de thermite.sh, o qual está disponível no repositório Subversion do FreeBSD em svn://svn.freebsd.org/base/user/gjb/thermite/ , além dos arquivos de configuração usados ​​para construir os snapshots de desenvolvimento head/ e stable/12/.

O uso do thermite.sh é explicado em Seção 7.2, “Construindo Snapshots de Desenvolvimento do FreeBSD” e Seção 7.3, “Construindo Releases do FreeBSD”.

Cada arquitetura e kernel individual tem seu próprio arquivo de configuração usado pelo release.sh. Cada branch tem sua própria configuração defaults-X.conf que contém entradas comuns em cada arquitetura, onde substituições ou variáveis ​​especiais são definidas e/ou substituídas nos arquivos por compilação.

O esquema de nomenclatura do arquivo de configuração por compilação está na forma de ${revision}-${TARGET_ARCH}-${KERNCONF}-${type}.conf, em que as variáveis ​​em maiúsculas são equivalentes a que make(1) usa no sistema de compilação e as variáveis ​​minúsculas são definidas nos arquivos de configuração, mapeando para a versão principal da respectiva branch.

Cada branch também possui sua própria configuração builds-X.conf, que é usada pelo thermite.sh. O script thermite.sh itera através de cada valor ${revision}, ${TARGET_ARCH}, ${KERNCONF} e ${type}, criando uma lista principal do que construir. No entanto, uma determinada combinação da lista só será criada se o respectivo arquivo de configuração existir, que é onde o esquema de nomenclatura acima é relevante.

Existem dois caminhos de fornecimento de arquivos:

  • builds-12.conf -> main.conf

    Isto controla o comportamento do thermite.sh

  • 12-amd64-GENERIC-snap.conf -> defaults-12.conf -> main.conf

    Isto controla o comportamento do release/release.sh dentro do chroot(8) de compilação

Nota:

Os arquivos de configuração builds-12.conf, defaults-12.conf, e main.conf existem para reduzir a repetição entre os vários arquivos por compilação.

7.2. Construindo Snapshots de Desenvolvimento do FreeBSD

As máquinas oficiais de compilação de versões têm um layout do sistema de arquivos específico, que utiliza ZFS, o thermite.sh tira grande proveito de clones e snapshots, garantindo um ambiente de compilação uniforme e consistente.

Os scripts de compilação localizam-se respectivamente em /releng/scripts-snapshot/scripts ou /releng/scripts-release/scripts, para evitar colisões entre uma compilação RC de uma branch releng contra um snapshot STABLE da respectiva branch stable.

Existe um dataset (conjunto de dados) separado para as imagens finais de compilação, /snap/ftp. Este diretório contém diretórios de snapshots e releases. Eles são usados ​​apenas se a variável EVERYTHINGISFINE estiver definida em main.conf.

Nota:

O nome da variável EVERYTHINGISFINE foi escolhido para evitar a colisão com uma variável possivelmente definida no ambiente do usuário, ativando acidentalmente o comportamento que depende de sua definição.

Como o thermite.sh percorre a lista principal de combinações e localiza o arquivo de configuração por compilação, um dataset ZFS é criado sob o /releng, tal como /releng/12-amd64-GENERIC-snap. O checkout das árvores src/, ports/ e doc/ é realizado em diferentes datasets ZFS, tal como /releng/12-src-snap, os quais são então clonados e montados nos respectivos datasets de compilação. Isso é feito para evitar a remoção de uma determinada árvore mais de uma vez.

Assumindo esses caminhos do sistema de arquivos, o thermite.sh deveria ser chamado como:

# cd /releng/scripts-snapshot/scripts
# ./setrev.sh -b stable/12/
# ./zfs-setup.sh -c ./builds-12.conf
# ./thermite.sh -c ./builds-12.conf

Quando as compilações forem concluídas, scripts adicionais auxiliares estarão disponíveis para gerar e-mails de snapshots de desenvolvimento que são enviados para a lista de e-mail freebsd-snapshots@freebsd.org:

# cd /releng/scripts-snapshot/scripts
# ./get-checksums.sh -c ./builds-12.conf | ./generate-email.pl > snapshot-12-mail

Nota:

A saída gerada deve ser checada duas vezes para garantir a exatidão, e o próprio e-mail deve ter assinatura PGP, in-line (no arquivo).

Nota:

Esses scripts auxiliares aplicam-se apenas às compilações de snapshot (versão instantânea) de desenvolvimento. Os anúncios durante o ciclo de lançamento (excluindo o anúncio de versão final) são criados a partir de um modelo de email. Uma amostra do modelo de email usado atualmente pode ser encontrada aqui.

7.3. Construindo Releases do FreeBSD

Similar a compilação de snapshots de desenvolvimento do FreeBSD, o thermite.sh seria invocado da mesma maneira. A diferença entre snapshots de desenvolvimento e builds de releases, BETA e RC inclusos, é que os arquivos de configuração do chroot(8) devem ser nomeados com release ao invés de snap no "type", como mencionado acima.

Além disso, BUILDTYPE e types devem ser alterados de snap para release em defaults-12.conf e builds-12.conf, respectivamente.

Ao construir o BETA, o RC, e o RELEASE final, também ajuste estaticamente o BUILDSVNREV para a revisão na branch refletindo a mudança de nome, BUILDDATE para a data em que as compilações são iniciadas no formato YYYYMMDD. Se as árvores doc/ e ports/ tiverem sido marcadas, defina também o PORTBRANCH e o DOCBRANCH para o caminho da tag relevante no repositório Subversion, substituindo HEAD pela última revisão alterada. Também defina releasesrc em builds-12.conf para a branch relevante, como stable/12/ ou releng/12.0/.

Durante o ciclo de release, uma cópia do CHECKSUM.SHA512 e do CHECKSUM.SHA256 para cada arquitetura é armazenada no repositório interno da Equipe de Engenharia de Release do FreeBSD, além de ser incluída nos diversos e-mails de anúncio. Cada MANIFEST contendo os hashes do base.txz, do kernel.txz, etc. também são adicionados ao misc/freebsd-release-manifests na coleção de ports.

Depois de construir a RELEASE final, a branch releng/12.0/ é marcada como release/12.0.0/ usando a revisão a partir da qual a RELEASE foi construída. Semelhante a criar as branches stable/12/ e releng/12.0/, isso é feito com svn cp. Da raiz do repositório:

% svn cp ^/releng/12.0/@r306420 release/12.0.0/
% svn commit release/12.0.0/

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.