
Компилирует исходный код в аудируемые, подписанные APK-пакеты с использованием декларативных конвейеров для Wolfi/Alpine, с мультиархитектурной эмуляцией QEMU и воспроизводимыми сборками.
Сборка apk-пакетов с помощью декларативных конвейеров.
Обычно используется для предоставления пользовательских пакетов для образов контейнеров, собираемых с помощью apko. Большинство apk-пакетов собираются для экосистем Wolfi или Alpine Linux.
Ключевые особенности:
Безопасные фабрики ПО — это эволюция DevOps, позволяющая пользователю доказать происхождение всех артефактов, включённых в программный образ. Собирая и упаковывая программные артефакты в пакеты, команды DevOps могут управлять своими программными артефактами как любым другим компонентом образа.
Это особенно полезно при создании программных образов в форме OCI-образов контейнеров с помощью apko.
Вы можете установить Melange через Homebrew:
brew install melange
Также можно установить Melange из исходного кода:
go install chainguard.dev/melange@latest
Можно использовать и контейнерный образ Melange:
docker run cgr.dev/chainguard/melange version
Для работы с примерами обычно нужно смонтировать текущий каталог в контейнер и предоставить расширенные привилегии, например:
docker run --privileged -v "$PWD":/work cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Запуск вне контейнера требует Docker, но также должен работать с другими средами выполнения, такими как podman.
Файл сборки melange выглядит так:
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
Мы можем собрать это с помощью:
melange build examples/gnu-hello.yaml
или с Docker:
docker run --privileged --rm -v "${PWD}":/work \
cgr.dev/chainguard/melange build examples/gnu-hello.yaml
Будет создана папка packages с каталогом для каждой архитектуры, поддерживаемой пакетом. Если нужно собрать только для текущей архитектуры, добавьте --arch $(uname -m) к команде сборки. Внутри каталога архитектуры вы найдёте apk-файлы для каждого пакета, собранного в конвейере.
Если вы хотите подписывать свои apk-пакеты, создайте ключ подписи с помощью команды 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
Затем передайте аргумент --signing-key команде melange build.
Чтобы включить информацию отладочного уровня в сборках melange, отредактируйте файл melange.yaml и добавьте set -x в конвейер. Этот флаг можно добавить в любой точке команд конвейера для более детальной отладки конкретного участка сборки.
...
pipeline:
- name: Build Minicli application
runs: |
set -x
APP_HOME="${{targets.destdir}}/usr/share/hello-minicli"
...
Melange предоставляет следующие подстановки по умолчанию, которые можно использовать в конвейере файла сборки:
Пример конвейера файла сборки с подстановками:
pipeline:
- name: 'Create tmp dir'
runs: mkdir ${{targets.destdir}}/var/lib/${{package.name}}/tmp
Чтобы использовать собранный в melange apk-пакет в apko, загрузите его в репозиторий пакетов или используйте «локальный» репозиторий. Локальный репозиторий позволяет запускать сборку melange и сборку apko в одном каталоге (или GitHub-репозитории) без использования внешнего хранилища. Пример такого подхода можно увидеть в репозитории nginx-image-demo.
| Подстановка | Описание |
|---|
${{package.name}} | Имя пакета |
${{package.version}} | Версия пакета |
${{package.epoch}} | Эпоха пакета |
${{package.full-version}} | ${{package.version}}-r${{package.epoch}} |
${{package.description}} | Описание пакета |
${{package.srcdir}} | Каталог исходного кода пакета (--source-dir) |
${{subpkg.name}} | Имя подпакета |
${{context.name}} | Имя основного пакета или подпакета |
${{targets.outdir}} | Каталог, в котором будут храниться целевые артефакты |
${{targets.contextdir}} | Каталог, в котором будут храниться целевые артефакты для основных пакетов и подпакетов |
${{targets.destdir}} | Каталог, в котором будут храниться целевые артефакты для основных пакетов |
${{targets.subpkgdir}} | Каталог, в котором будут храниться целевые артефакты для подпакетов |
${{build.arch}} | Архитектура текущей сборки (например, x86_64, aarch64) |
${{build.goarch}} | GOARCH текущей сборки (например, amd64, arm64) |