
Compila código-fonte em pacotes APK auditáveis e assinados usando pipelines declarativos para Wolfi/Alpine, com emulação QEMU multi-arquitetura e builds reproduzíveis.
Construa pacotes apk usando pipelines declarativos.
Comumente usado para fornecer pacotes personalizados para imagens de contêiner construídas com apko. A maioria dos apks é construída para uso com os ecossistemas Wolfi ou Alpine Linux.
Principais recursos:
Fábricas de software seguras são a evolução do DevOps, permitindo que um usuário prove a proveniência de todos os artefatos incorporados em um appliance de software. Ao construir e capturar artefatos de software em pacotes, as equipes de DevOps podem gerenciar seus artefatos de software como se fossem qualquer outro componente de uma imagem.
Isso é especialmente útil ao construir appliances de software na forma de imagens de contêiner OCI com apko.
Você pode instalar o Melange via Homebrew:
brew install melange
Você também pode instalar o Melange a partir do código-fonte:
go install chainguard.dev/melange@latest
Você também pode usar a imagem de contêiner do Melange:
docker run cgr.dev/chainguard/melange version
Para usar os exemplos, você geralmente vai querer montar seu diretório atual no contêiner e fornecer privilégios elevados, por exemplo:
docker run --privileged -v "$PWD":/work cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Executar fora de um contêiner requer Docker, mas também deve funcionar com outros runtimes, como podman.
Um arquivo de build do melange tem a seguinte aparência:
package:
name: hello
version: 2.12
epoch: 0
description: "the GNU hello world program"
copyright:
- attestation: |
Copyright 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2005,
2006, 2007, 2008, 2010, 2011, 2013, 2014, 2022 Free Software Foundation,
Inc.
license: GPL-3.0-or-later
dependencies:
runtime:
environment:
contents:
repositories:
- https://dl-cdn.alpinelinux.org/alpine/edge/main
packages:
- alpine-baselayout-data
- busybox
- build-base
- scanelf
- ssl_client
- ca-certificates-bundle
pipeline:
- uses: fetch
with:
uri: https://ftp.gnu.org/gnu/hello/hello-${{package.version}}.tar.gz
expected-sha256: cf04af86dc085268c5f4470fbae49b18afbc221b78096aab842d934a76bad0ab
- uses: autoconf/configure
- uses: autoconf/make
- uses: autoconf/make-install
- uses: strip
subpackages:
- name: "hello-doc"
description: "Documentation for hello"
dependencies:
runtime:
- foo
pipeline:
- uses: split/manpages
test:
pipeline:
- uses: test/docs
test:
environment:
contents:
packages:
- bar
pipeline:
- runs: |
hello
hello --version
Podemos construir isso com:
melange build examples/gnu-hello.yaml
ou, com Docker:
docker run --privileged --rm -v "${PWD}":/work \
cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Isso criará uma pasta packages, com uma entrada para cada arquitetura suportada pelo pacote. Se você quiser construir apenas para a arquitetura atual, pode adicionar --arch $(uname -m) ao comando de build. Dentro do diretório da arquitetura, você deve encontrar arquivos apk para cada pacote construído no pipeline.
Se você quiser assinar seus apks, crie uma chave de assinatura com o comando melange keygen:
melange keygen
generating keypair with a 4096 bit prime, please wait...
wrote private key to melange.rsa
wrote public key to melange.rsa.pub
E então passe o argumento --signing-key para melange build.
Para incluir informações em nível de depuração nos builds do melange, edite seu arquivo melange.yaml e inclua set -x no seu pipeline. Você pode adicionar essa flag em qualquer ponto dos comandos do pipeline para depurar ainda mais uma seção específica do seu build.
...
pipeline:
- name: Build Minicli application
runs: |
set -x
APP_HOME="${{targets.destdir}}/usr/share/hello-minicli"
...
O Melange fornece as seguintes substituições padrão que podem ser referenciadas no pipeline do arquivo de build:
Um exemplo de pipeline de arquivo de build com substituições:
pipeline:
- name: 'Create tmp dir'
runs: mkdir ${{targets.destdir}}/var/lib/${{package.name}}/tmp
Para usar um apk construído com melange no apko, envie-o para um repositório de pacotes ou use um repositório "local". Usar um repositório local permite que um build do melange e um build do apko sejam executados no mesmo diretório (ou repositório GitHub) sem usar armazenamento externo. Um exemplo dessa abordagem pode ser visto no repositório nginx-image-demo.
| Substituição | Descrição |
|---|
${{package.name}} | Nome do pacote |
${{package.version}} | Versão do pacote |
${{package.epoch}} | Epoch do pacote |
${{package.full-version}} | ${{package.version}}-r${{package.epoch}} |
${{package.description}} | Descrição do pacote |
${{package.srcdir}} | Diretório de origem do pacote (--source-dir) |
${{subpkg.name}} | Nome do subpacote |
${{context.name}} | nome do pacote principal ou subpacote |
${{targets.outdir}} | Diretório onde os alvos serão armazenados |
${{targets.contextdir}} | Diretório onde os alvos serão armazenados para pacotes principais e subpacotes |
${{targets.destdir}} | Diretório onde os alvos serão armazenados para o pacote principal |
${{targets.subpkgdir}} | Diretório onde os alvos serão armazenados para subpacotes |
${{build.arch}} | Arquitetura do build atual (por exemplo, x86_64, aarch64) |
${{build.goarch}} | GOARCH do build atual (por exemplo, amd64, arm64) |