
يُجمّع الكود المصدري إلى حزم 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
لاستخدام حزمة apk مبنية بواسطة melange في apko، إمّا ارفعها إلى مستودع حزم أو استخدم مستودعًا "محليًا". يسمح استخدام مستودع محلي بتشغيل بناء melange وبناء apko في نفس الدليل (أو مستودع GitHub) دون الحاجة إلى تخزين خارجي. يمكن رؤية مثال على هذا الأسلوب في مستودع nginx-image-demo.
| Substitution | Description |
|---|
${{package.name}} | Package name |
${{package.version}} | Package version |
${{package.epoch}} | Package epoch |
${{package.full-version}} | ${{package.version}}-r${{package.epoch}} |
${{package.description}} | Package description |
${{package.srcdir}} | Package source directory (--source-dir) |
${{subpkg.name}} | Subpackage name |
${{context.name}} | main package or subpackage name |
${{targets.outdir}} | Directory where targets will be stored |
${{targets.contextdir}} | Directory where targets will be stored for main packages and subpackages |
${{targets.destdir}} | Directory where targets will be stored for main |
${{targets.subpkgdir}} | Directory where targets will be stored for subpackages |
${{build.arch}} | Architecture of current build (e.g. x86_64, aarch64) |
${{build.goarch}} | GOARCH of current build (e.g. amd64, arm64) |