melange
使用声明式管道构建 apk 软件包。
通常用于为使用 apko 构建的容器镜像提供自定义软件包。大多数 apk 软件包都是为 Wolfi 或 Alpine Linux 生态系统构建的。
主要特点:
- 面向管道的构建。 构建管道的每个步骤都由你定义和控制,不同于传统的包管理器具有不同的阶段。
- 默认支持多架构。 使用 QEMU 模拟各种架构,避免了交叉编译步骤的需求。
为什么
安全软件工厂是 DevOps 的演进,允许用户证明集成到软件设备中的所有构件的来源。通过构建和捕获软件构件到软件包中,DevOps 团队可以像管理镜像的其他组件一样管理他们的软件构件。
这在使用 apko 以 OCI 容器镜像形式构建软件设备时特别有用。
安装
你可以通过 Homebrew 安装 Melange:
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: "GNU hello world 程序"
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
我们可以通过以下方式构建:
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
正在生成 4096 位素数的密钥对,请稍候...
已将私钥写入 melange.rsa
已将公钥写入 melange.rsa.pub
然后将 --signing-key
参数传递给 melange build
。
调试 melange 构建
要在 melange 构建中包含调试级别的信息,请编辑你的 melange.yaml
文件,并在管道中包含 set -x
。你可以在管道命令的任何位置添加此标志,以进一步调试构建的特定部分。
...
pipeline:
- name: 构建 Minicli 应用程序
runs: |
set -x
APP_HOME="${{targets.destdir}}/usr/share/hello-minicli"
...
默认替换
Melange 提供以下默认替换,可以在构建文件管道中引用:
替换 | 描述 |
---|---|
${{package.name}} | 软件包名称 |
${{package.version}} | 软件包版本 |
${{package.epoch}} | 软件包纪元 |
${{package.full-version}} | ${{package.version}}-r${{package.epoch}} |
${{package.description}} | 软件包描述 |
${{package.contextdir}} | 主软件包和子软件包的目标存储目录 |
${{targets.destdir}} | 主软件包的目标存储目录 |
${{targets.subpkgdir}} | 子软件包的目标存储目录 |
${{build.arch}} | 当前构建的架构(例如 x86_64, aarch64) |
${{build.goarch}} | 当前构建的 GOARCH(例如 amd64, arm64) |
一个带有替换的示例构建文件管道:
pipeline:
- name: '创建临时目录'
runs: mkdir ${{targets.destdir}}/var/lib/${{package.name}}/tmp
与 apko 一起使用
要在 apko 中使用 melange 构建的 apk,可以将其上传到软件包仓库或使用"本地"仓库。使用本地仓库允许 melange 构建和 apko 构建在同一目录(或 GitHub 仓库)中运行,而无需使用外部存储。 这种方法的一个例子可以在 nginx-image-demo 仓库 中看到。