
소스 코드를 선언적 파이프라인을 사용하여 Wolfi/Alpine용 감사 가능하고 서명된 APK 패키지로 컴파일하며, 다중 아키텍처 QEMU 에뮬레이션 및 재현 가능한 빌드를 지원합니다.
선언형 파이프라인을 사용하여 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
그런 다음 melange build에 --signing-key 인수를 전달하세요.
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 저장소에서 볼 수 있습니다.
| Substitution | Description |
|---|
${{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) |