使用声明式流水线构建 apk 软件包。
通常用于为使用 apko 构建的容器镜像提供自定义软件包。大多数 apk 都是为 Wolfi 或 Alpine Linux 生态系统而构建的。
主要特性:
安全软件工厂是 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: "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
要在 apko 中使用 melange 构建的 apk,可以将其上传到软件包存储库,或使用“本地”存储库。使用本地存储库可以让 melange 构建和 apko 构建在同一目录(或 GitHub 仓库)中运行,而无需使用外部存储。可以在 nginx-image-demo 仓库 中看到此方法的示例。
| 替换变量 | 描述 |
|---|
${{package.name}} | 软件包名称 |
${{package.version}} | 软件包版本 |
${{package.epoch}} | 软件包 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) |