
Compila il codice sorgente in pacchetti APK firmati e verificabili utilizzando pipeline dichiarative per Wolfi/Alpine, con emulazione QEMU multi-architettura e build riproducibili.
Crea pacchetti apk utilizzando pipeline dichiarative.
Comunemente usato per fornire pacchetti personalizzati per immagini container costruite con apko. La maggior parte degli apk è costruita per l'uso con gli ecosistemi Wolfi o Alpine Linux.
Caratteristiche principali:
Le fabbriche software sicure sono l'evoluzione del DevOps e consentono a un utente di dimostrare la provenienza di tutti gli artefatti incorporati in un'appliance software. Costruendo e catturando artefatti software in pacchetti, i team DevOps possono gestire i propri artefatti software come se fossero qualsiasi altro componente di un'immagine.
Questo è particolarmente utile quando si costruiscono appliance software sotto forma di immagini container OCI con apko.
Puoi installare Melange da Homebrew:
brew install melange
Puoi anche installare Melange dai sorgenti:
go install chainguard.dev/melange@latest
Puoi anche usare l'immagine container di Melange:
docker run cgr.dev/chainguard/melange version
Per usare gli esempi, in genere vorrai montare la directory corrente nel container e fornire privilegi elevati, ad es.:
docker run --privileged -v "$PWD":/work cgr.dev/chainguard/melange build examples/gnu-hello.yaml
L'esecuzione al di fuori di un container richiede Docker, ma dovrebbe funzionare anche con altri runtime come podman.
Un file di build melange appare così:
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
Possiamo costruirlo con:
melange build examples/gnu-hello.yaml
oppure, con Docker:
docker run --privileged --rm -v "${PWD}":/work \
cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Questo creerà una cartella packages, con una voce per ogni architettura supportata dal pacchetto. Se vuoi costruire solo per l'architettura corrente, puoi aggiungere --arch $(uname -m) al comando di build. All'interno della directory dell'architettura dovresti trovare i file apk per ogni pacchetto costruito nella pipeline.
Se vuoi firmare i tuoi apk, crea una chiave di firma con il 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 poi passa l'argomento --signing-key a melange build.
Per includere informazioni a livello di debug nelle build di melange, modifica il tuo file melange.yaml e includi set -x nella tua pipeline. Puoi aggiungere questo flag in qualsiasi punto dei comandi della pipeline per eseguire ulteriori debug di una sezione specifica della build.
...
pipeline:
- name: Build Minicli application
runs: |
set -x
APP_HOME="${{targets.destdir}}/usr/share/hello-minicli"
...
Melange fornisce le seguenti sostituzioni predefinite che possono essere referenziate nella pipeline del file di build:
Un esempio di pipeline di file di build con sostituzioni:
pipeline:
- name: 'Create tmp dir'
runs: mkdir ${{targets.destdir}}/var/lib/${{package.name}}/tmp
Documentazione più dettagliata
Per usare un apk costruito con melange in apko, puoi caricarlo in un repository di pacchetti oppure usare un repository "locale". L'uso di un repository locale consente di eseguire una build di melange e una build di apko nella stessa directory (o repository GitHub) senza usare storage esterno. Un esempio di questo approccio può essere visto nel repo nginx-image-demo.
| Sostituzione | Descrizione |
|---|
${{package.name}} | Nome del pacchetto |
${{package.version}} | Versione del pacchetto |
${{package.epoch}} | Epoch del pacchetto |
${{package.full-version}} | ${{package.version}}-r${{package.epoch}} |
${{package.description}} | Descrizione del pacchetto |
${{package.srcdir}} | Directory sorgente del pacchetto (--source-dir) |
${{subpkg.name}} | Nome del sottopacchetto |
${{context.name}} | nome del pacchetto principale o del sottopacchetto |
${{targets.outdir}} | Directory in cui verranno memorizzati i target |
${{targets.contextdir}} | Directory in cui verranno memorizzati i target per pacchetti principali e sottopacchetti |
${{targets.destdir}} | Directory in cui verranno memorizzati i target per il pacchetto principale |
${{targets.subpkgdir}} | Directory in cui verranno memorizzati i target per i sottopacchetti |
${{build.arch}} | Architettura della build corrente (es. x86_64, aarch64) |
${{build.goarch}} | GOARCH della build corrente (es. amd64, arm64) |