
Compila código fuente en paquetes APK auditables y firmados mediante pipelines declarativos para Wolfi/Alpine, con emulación QEMU multiarquitectura y compilaciones reproducibles.
Compila paquetes apk con pipelines declarativos.
Se usa habitualmente para proporcionar paquetes personalizados para imágenes de contenedor creadas con apko. La mayoría de los apks se crean para usarse con los ecosistemas de Wolfi o Alpine Linux.
Características principales:
Las fábricas de software seguras son la evolución de DevOps, y permiten al usuario demostrar la procedencia de todos los artefactos incorporados a un dispositivo de software. Al compilar y capturar artefactos de software en paquetes, los equipos de DevOps pueden gestionar sus artefactos de software como si fueran cualquier otro componente de una imagen.
Esto es especialmente útil al crear dispositivos de software en forma de imágenes de contenedor OCI con apko.
Puedes instalar Melange desde Homebrew:
brew install melange
También puedes instalar Melange desde el código fuente:
go install chainguard.dev/melange@latest
También puedes usar la imagen de contenedor de Melange:
docker run cgr.dev/chainguard/melange version
Para usar los ejemplos, normalmente querrás montar tu directorio actual en el contenedor y proporcionar privilegios elevados, por ejemplo:
docker run --privileged -v "$PWD":/work cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Ejecutarlo fuera de un contenedor requiere Docker, pero también debería funcionar con otros runtimes como podman.
Un archivo de compilación de melange tiene este aspecto:
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 compilarlo con:
melange build examples/gnu-hello.yaml
o, con Docker:
docker run --privileged --rm -v "${PWD}":/work \
cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Esto creará una carpeta packages, con una entrada para cada arquitectura compatible con el paquete. Si solo quieres compilar para la arquitectura actual, puedes añadir --arch $(uname -m) al comando de compilación. Dentro del directorio de arquitectura encontrarás archivos apk para cada paquete compilado en el pipeline.
Si quieres firmar tus apks, crea una clave de firma con el 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
Y luego pasa el argumento --signing-key a melange build.
Para incluir información de nivel de depuración en las compilaciones de melange, edita tu archivo melange.yaml e incluye set -x en tu pipeline. Puedes añadir esta marca en cualquier punto de los comandos de tu pipeline para depurar más a fondo una sección específica de tu compilación.
...
pipeline:
- name: Build Minicli application
runs: |
set -x
APP_HOME="${{targets.destdir}}/usr/share/hello-minicli"
...
Melange proporciona las siguientes sustituciones por defecto a las que se puede hacer referencia en el pipeline del archivo de compilación:
Un ejemplo de pipeline en un archivo de compilación con sustituciones:
pipeline:
- name: 'Create tmp dir'
runs: mkdir ${{targets.destdir}}/var/lib/${{package.name}}/tmp
Para usar un apk compilado con melange en apko, súbelo a un repositorio de paquetes o usa un repositorio "local". El uso de un repositorio local permite que una compilación de melange y una compilación de apko se ejecuten en el mismo directorio (o repositorio de GitHub) sin usar almacenamiento externo. Un ejemplo de este enfoque se puede ver en el repositorio nginx-image-demo.
| Substitution | Description |
|---|
${{package.name}} | Nombre del paquete |
${{package.version}} | Versión del paquete |
${{package.epoch}} | Epoch del paquete |
${{package.full-version}} | ${{package.version}}-r${{package.epoch}} |
${{package.description}} | Descripción del paquete |
${{package.srcdir}} | Directorio de origen del paquete (--source-dir) |
${{subpkg.name}} | Nombre del subpaquete |
${{context.name}} | main package or subpackage name |
${{targets.outdir}} | Directorio donde se almacenarán los targets |
${{targets.contextdir}} | Directorio donde se almacenarán los targets para paquetes principales y subpaquetes |
${{targets.destdir}} | Directorio donde se almacenarán los targets para main |
${{targets.subpkgdir}} | Directorio donde se almacenarán los targets para subpaquetes |
${{build.arch}} | Arquitectura de la compilación actual (p. ej., x86_64, aarch64) |
${{build.goarch}} | GOARCH de la compilación actual (p. ej., amd64, arm64) |