
Wolfi/Alpine向けの宣言的パイプラインを使用して、ソースコードを監査可能かつ署名済みのAPKパッケージにコンパイルし、マルチアーキテクチャのQEMUエミュレーションと再現可能なビルドを実現します。
宣言的パイプラインを使用して apk パッケージをビルドします。
apko でビルドされたコンテナイメージにカスタムパッケージを提供するためによく使用されます。大多数の apk は、Wolfi または Alpine Linux エコシステムのいずれかで使用するためにビルドされます。
主な特徴:
セキュアソフトウェアファクトリーは DevOps の進化形であり、ユーザーはソフトウェアアプライアンスに組み込まれるすべてのアーティファクトの来歴(provenance)を証明できます。ソフトウェアアーティファクトをビルドしてパッケージに取り込むことで、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
melange でビルドした apk を apko で使用するには、パッケージリポジトリにアップロードするか、「ローカル」リポジトリを使用します。ローカルリポジトリを使用すると、外部ストレージを使用せずに、melange ビルドと apko ビルドを同じディレクトリ(または GitHub リポジトリ)で実行できます。 このアプローチの例は、nginx-image-demo リポジトリ で確認できます。
| Substitution | Description |
|---|
${{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) |