
Kompiliert Quellcode mithilfe deklarativer Pipelines für Wolfi/Alpine in prüfbare, signierte APK-Pakete, mit Multi-Architektur-QEMU-Emulation und reproduzierbaren Builds.
Erstelle apk-Pakete mithilfe deklarativer Pipelines.
Häufig verwendet, um benutzerdefinierte Pakete für Container-Images bereitzustellen, die mit apko erstellt wurden. Die meisten apks werden für die Verwendung mit den Ökosystemen Wolfi oder Alpine Linux erstellt.
Hauptfunktionen:
Sichere Software-Fabriken sind die Weiterentwicklung von DevOps und ermöglichen es einem Benutzer, die Herkunft aller in eine Software-Appliance aufgenommenen Artefakte nachzuweisen. Indem DevOps-Teams Software-Artefakte zu Paketen bauen und darin erfassen, können sie diese wie jede andere Komponente eines Images verwalten.
Dies ist besonders nützlich, wenn Software-Appliance in Form von OCI-Container-Images mit apko erstellt werden.
Du kannst Melange über Homebrew installieren:
brew install melange
Du kannst Melange auch aus dem Quellcode installieren:
go install chainguard.dev/melange@latest
Du kannst auch das Melange-Container-Image verwenden:
docker run cgr.dev/chainguard/melange version
Um die Beispiele zu verwenden, solltest du dein aktuelles Verzeichnis in den Container einbinden und erhöhte Rechte bereitstellen, z. B.:
docker run --privileged -v "$PWD":/work cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Das Ausführen außerhalb eines Containers erfordert Docker, sollte aber auch mit anderen Laufzeiten wie podman funktionieren.
Eine Melange-Build-Datei sieht wie folgt aus:
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
Wir können dies mit folgendem Befehl bauen:
melange build examples/gnu-hello.yaml
oder mit Docker:
docker run --privileged --rm -v "${PWD}":/work \
cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Dadurch wird ein Ordner packages erstellt, mit einem Eintrag für jede vom Paket unterstützte Architektur. Wenn du nur für die aktuelle Architektur bauen möchtest, kannst du dem Build-Befehl --arch $(uname -m) hinzufügen. Im Architekturverzeichnis findest du apk-Dateien für jedes in der Pipeline gebaute Paket.
Wenn du deine apks signieren möchtest, erstelle mit dem Befehl melange keygen einen Signaturschlüssel:
melange keygen
generating keypair with a 4096 bit prime, please wait...
wrote private key to melange.rsa
wrote public key to melange.rsa.pub
Übergib dann das Argument --signing-key an melange build.
Um Debug-Informationen in Melange-Builds aufzunehmen, bearbeite deine melange.yaml-Datei und füge set -x in deine Pipeline ein. Du kannst dieses Flag an beliebiger Stelle deiner Pipeline-Befehle hinzufügen, um einen bestimmten Abschnitt deines Builds genauer zu debuggen.
...
pipeline:
- name: Build Minicli application
runs: |
set -x
APP_HOME="${{targets.destdir}}/usr/share/hello-minicli"
...
Melange stellt die folgenden Standard-Substitutionen bereit, die in der Build-Datei-Pipeline referenziert werden können:
Ein Beispiel für eine Build-Datei-Pipeline mit Substitutionen:
pipeline:
- name: 'Create tmp dir'
runs: mkdir ${{targets.destdir}}/var/lib/${{package.name}}/tmp
Um ein mit Melange gebautes apk in apko zu verwenden, lade es entweder in ein Paket-Repository hoch oder verwende ein „lokales“ Repository. Die Verwendung eines lokalen Repositorys ermöglicht es, einen Melange-Build und einen apko-Build im selben Verzeichnis (oder GitHub-Repo) auszuführen, ohne externen Speicher zu verwenden. Ein Beispiel für diesen Ansatz findest du im nginx-image-demo-Repo.
| Substitution | Description |
|---|
${{package.name}} | Paketname |
${{package.version}} | Paketversion |
${{package.epoch}} | Paket-Epoche |
${{package.full-version}} | ${{package.version}}-r${{package.epoch}} |
${{package.description}} | Paketbeschreibung |
${{package.srcdir}} | Paketquellverzeichnis (--source-dir) |
${{subpkg.name}} | Unterpaketname |
${{context.name}} | Name des Hauptpakets oder Unterpakets |
${{targets.outdir}} | Verzeichnis, in dem Zielobjekte gespeichert werden |
${{targets.contextdir}} | Verzeichnis, in dem Zielobjekte für Haupt- und Unterpakete gespeichert werden |
${{targets.destdir}} | Verzeichnis, in dem Zielobjekte für das Hauptpaket gespeichert werden |
${{targets.subpkgdir}} | Verzeichnis, in dem Zielobjekte für Unterpakete gespeichert werden |
${{build.arch}} | Architektur des aktuellen Builds (z. B. x86_64, aarch64) |
${{build.goarch}} | GOARCH des aktuellen Builds (z. B. amd64, arm64) |