Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package melange for openSUSE:Factory checked in at 2025-12-11 18:40:15 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/melange (Old) and /work/SRC/openSUSE:Factory/.melange.new.1939 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "melange" Thu Dec 11 18:40:15 2025 rev:126 rq:1322138 version:0.36.0 Changes: -------- --- /work/SRC/openSUSE:Factory/melange/melange.changes 2025-12-09 12:54:50.627258588 +0100 +++ /work/SRC/openSUSE:Factory/.melange.new.1939/melange.changes 2025-12-11 18:43:06.045908445 +0100 @@ -1,0 +2,15 @@ +Thu Dec 11 07:52:11 UTC 2025 - Johannes Kastl <[email protected]> + +- Update to version 0.36.0: + * fix(bump & cache): Do not fail when main pipeline is not + present (#2263) + * build(deps): bump golang.org/x/sys from 0.38.0 to 0.39.0 + (#2261) + * build(deps): bump the actions group with 3 updates (#2262) + * build(deps): bump golang.org/x/sync from 0.18.0 to 0.19.0 + (#2260) + * build(deps): bump the gomod group with 3 updates (#2259) + * feat: add test resource configuration and CLI flags (#2244) + * git-checkout: Invoke `git fetch` with `--unshallow` (#2258) + +------------------------------------------------------------------- Old: ---- melange-0.35.1.obscpio New: ---- melange-0.36.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ melange.spec ++++++ --- /var/tmp/diff_new_pack.kTxQi1/_old 2025-12-11 18:43:06.993948277 +0100 +++ /var/tmp/diff_new_pack.kTxQi1/_new 2025-12-11 18:43:06.993948277 +0100 @@ -17,7 +17,7 @@ Name: melange -Version: 0.35.1 +Version: 0.36.0 Release: 0 Summary: Build APKs from source code License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.kTxQi1/_old 2025-12-11 18:43:07.041950294 +0100 +++ /var/tmp/diff_new_pack.kTxQi1/_new 2025-12-11 18:43:07.049950631 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/chainguard-dev/melange</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.35.1</param> + <param name="revision">v0.36.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.kTxQi1/_old 2025-12-11 18:43:07.077951807 +0100 +++ /var/tmp/diff_new_pack.kTxQi1/_new 2025-12-11 18:43:07.085952143 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/chainguard-dev/melange</param> - <param name="changesrevision">f28e457f74f15f5af9f9f1370e34943567633255</param></service></servicedata> + <param name="changesrevision">c32e57daa58da05d589ec801b6c5c4c3086a83f9</param></service></servicedata> (No newline at EOF) ++++++ melange-0.35.1.obscpio -> melange-0.36.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/docs/BUILD-FILE.md new/melange-0.36.0/docs/BUILD-FILE.md --- old/melange-0.35.1/docs/BUILD-FILE.md 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/docs/BUILD-FILE.md 2025-12-09 09:15:58.000000000 +0100 @@ -261,6 +261,104 @@ TODO(vaikas): What does it mean to monitor, when new files are added/removed to those directories? Something else?? +### timeout +Optional timeout duration for the build. Specifies the maximum amount of time the build is allowed to take before timing out. The value is specified in seconds as an integer. + +```yaml +package: + timeout: 3600 # 1 hour in seconds +``` + +### resources +Optional resource specifications for the build. Used by external schedulers (like elastic build) to provision appropriately-sized build pods/VMs. For local builds with the QEMU runner, these can be used as resource limits via CLI flags. + +**Resource Fields:** + +- `cpu`: CPU resource count as a quoted string (e.g., `"4"`, `"8"`, `"16"`) +- `cpumodel`: Specific CPU model requirements (e.g., `"intel-xeon"`, `"amd-epyc"`) +- `memory`: Memory size in Kubernetes format (e.g., `"8Gi"`, `"16Gi"`, `"128Mi"`) +- `disk`: Disk space in Kubernetes format (e.g., `"50Gi"`, `"100Gi"`, `"1Ti"`) + +**Value Formats:** +- CPU values are typically whole numbers as strings: `"1"`, `"2"`, `"4"`, `"8"`, etc. +- Memory and disk use Kubernetes resource quantities: `Mi` (mebibytes), `Gi` (gibibytes), `Ti` (tebibytes) +- All fields are optional and interpretation depends on the scheduler/runner + +**How resources are interpreted:** +- **External schedulers**: Use these values to provision build pods/VMs +- **QEMU runner** (via CLI flags like `--cpu`, `--memory`): Treats values as **maximum limits** + - CPU: Defaults to all available cores, capped at the specified value if lower + - Memory: Defaults to 85% of available memory, capped at the specified value if lower +- **Docker/Bubblewrap runners**: Resource fields are not enforced + +```yaml +package: + resources: + cpu: "8" + memory: "16Gi" + disk: "100Gi" +``` + +### test-resources +Optional resource specifications for test execution. Used by external schedulers to provision test pods/VMs with different resource constraints than the build phase. + +**When to use test-resources:** +- Tests require significantly different resources than builds +- Integration tests need more CPU/memory than unit tests +- Tests can run with fewer resources to optimize costs +- External schedulers need separate test and build resource specifications + +**How test-resources are interpreted:** + +The `test-resources` field is primarily **informational** for external schedulers: + +**For external schedulers** (reading the YAML): +- Use `test-resources` if specified, otherwise fall back to `resources` +- This determines test pod/VM sizing + +**For local testing with `melange test`:** +- The `test-resources` field in the YAML is **NOT automatically used** by melange +- Resources must be explicitly specified via CLI flags: `--cpu`, `--memory`, `--disk`, `--cpumodel`, `--timeout` +- Resource enforcement depends on the runner (same as `resources` field): + - **QEMU runner**: Enforces CPU and memory as **maximum limits** (caps at specified value) + - **Docker/Bubblewrap runners**: Do not enforce resource limits + +**Resource fields** are identical to `resources` (see above for formats and interpretation). + +Example where tests need less resources than build: +```yaml +package: + resources: + cpu: "8" + memory: "16Gi" + disk: "100Gi" + test-resources: + cpu: "4" + memory: "8Gi" + disk: "50Gi" +``` + +Example where tests need more resources than build: +```yaml +package: + resources: + cpu: "2" + memory: "4Gi" + test-resources: + cpu: "32" + memory: "128Gi" + disk: "500Gi" +``` + +Example with only test-resources specified: +```yaml +package: + test-resources: + cpu: "4" + memory: "8Gi" + # No build resources specified - scheduler uses defaults +``` + # environment Environment defines the build environment, including what the dependencies are, including repositories, packages, etc. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/docs/md/melange_test.md new/melange-0.36.0/docs/md/melange_test.md --- old/melange-0.35.1/docs/md/melange_test.md 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/docs/md/melange_test.md 2025-12-09 09:15:58.000000000 +0100 @@ -32,13 +32,17 @@ --arch strings architectures to build for (e.g., x86_64,ppc64le,arm64) -- default is all, unless specified in config --cache-dir string directory used for cached inputs --cache-source string directory or bucket used for preloading the cache + --cpu string default CPU resources to use for tests + --cpumodel string default CPU model to use for tests --debug enables debug logging of test pipelines (sets -x for steps) --debug-runner when enabled, the builder pod will persist after the build succeeds or fails + --disk string disk size to use for tests --env-file string file to use for preloaded environment variables -h, --help help for test --ignore-signatures ignore repository signature verification -i, --interactive when enabled, attaches stdin with a tty to the pod on failure -k, --keyring-append strings path to extra keys to include in the build environment keyring + --memory string default memory resources to use for tests --pipeline-dirs strings directories used to extend defined built-in pipelines -r, --repository-append strings path to extra repositories to include in the build environment --rm clean up intermediate artifacts (e.g. container images, temp dirs) (default true) @@ -46,6 +50,7 @@ --source-dir string directory used for included sources --test-option strings build options to enable --test-package-append strings extra packages to install for each of the test environments + --timeout duration default timeout for tests --workspace-dir string directory used for the workspace at /home/build ``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/examples/test-resources-example1.yaml new/melange-0.36.0/examples/test-resources-example1.yaml --- old/melange-0.35.1/examples/test-resources-example1.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/melange-0.36.0/examples/test-resources-example1.yaml 2025-12-09 09:15:58.000000000 +0100 @@ -0,0 +1,67 @@ +package: + name: gcc-13 + version: 13.2.0 + epoch: 0 + description: GNU Compiler Collection - requires significant resources to build + # Build resources - compilation is resource-intensive + resources: + cpu: "8" + memory: "16Gi" + disk: "100Gi" + # Test resources - unit tests need less + test-resources: + cpu: "4" + memory: "8Gi" + disk: "50Gi" +environment: + contents: + repositories: + - https://packages.wolfi.dev/os + keyring: + - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub + packages: + - build-base + - busybox + - gmp-dev + - mpfr-dev + - mpc-dev +pipeline: + - uses: fetch + with: + uri: https://ftp.gnu.org/gnu/gcc/gcc-${{package.version}}/gcc-${{package.version}}.tar.xz + expected-sha256: e275e76442a6067341a27f04c5c6b83d8613144004c0413528863dc6b5c743da + - runs: | + ./configure \ + --prefix=/usr \ + --enable-languages=c,c++,fortran \ + --disable-multilib + make -j$(nproc) + make install DESTDIR="${{targets.destdir}}" +test: + environment: + contents: + packages: + - build-base + pipeline: + - name: Test C compilation + runs: | + cat > hello.c << 'EOF' + #include <stdio.h> + int main() { + printf("Hello, World!\n"); + return 0; + } + EOF + gcc hello.c -o hello + ./hello | grep "Hello, World" + - name: Test C++ compilation + runs: | + cat > hello.cpp << 'EOF' + #include <iostream> + int main() { + std::cout << "Hello, C++!" << std::endl; + return 0; + } + EOF + g++ hello.cpp -o hello-cpp + ./hello-cpp | grep "Hello, C++" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/examples/test-resources-example2.yaml new/melange-0.36.0/examples/test-resources-example2.yaml --- old/melange-0.35.1/examples/test-resources-example2.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/melange-0.36.0/examples/test-resources-example2.yaml 2025-12-09 09:15:58.000000000 +0100 @@ -0,0 +1,97 @@ +package: + name: tensorflow-lite + version: 2.14.0 + epoch: 0 + description: TensorFlow Lite - tests require more resources than build + # Build is straightforward + resources: + cpu: "4" + memory: "8Gi" + # Integration tests with models need significant resources + test-resources: + cpu: "32" + memory: "128Gi" + disk: "500Gi" +environment: + contents: + repositories: + - https://packages.wolfi.dev/os + keyring: + - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub + packages: + - build-base + - busybox + - cmake + - python-3 +pipeline: + - uses: fetch + with: + uri: https://github.com/tensorflow/tensorflow/archive/v${{package.version}}.tar.gz + expected-sha256: abcd1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab + - runs: | + cd tensorflow/lite + cmake -B build \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release + cmake --build build -j$(nproc) + cmake --install build --prefix "${{targets.destdir}}/usr" +test: + environment: + contents: + packages: + - python-3 + - py3-numpy + - wget + pipeline: + - name: Download test models + runs: | + mkdir -p models + wget -O models/mobilenet_v1.tflite \ + https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_224_quant.tflite + - name: Run inference benchmark + runs: | + python3 << 'EOF' + import tensorflow as tf + import numpy as np + import time + + # Load model + interpreter = tf.lite.Interpreter(model_path="models/mobilenet_v1.tflite") + interpreter.allocate_tensors() + + # Get input/output details + input_details = interpreter.get_input_details() + output_details = interpreter.get_output_details() + + # Run benchmark with multiple iterations + iterations = 1000 + input_data = np.random.random_sample(input_details[0]['shape']).astype(np.float32) + + start = time.time() + for i in range(iterations): + interpreter.set_tensor(input_details[0]['index'], input_data) + interpreter.invoke() + output_data = interpreter.get_tensor(output_details[0]['index']) + + elapsed = time.time() - start + print(f"Completed {iterations} iterations in {elapsed:.2f}s") + print(f"Average inference time: {elapsed/iterations*1000:.2f}ms") + EOF + - name: Run stress test + runs: | + # Simulate heavy load testing with multiple parallel inferences + for i in {1..32}; do + python3 -c " + import tensorflow as tf + import numpy as np + interpreter = tf.lite.Interpreter(model_path='models/mobilenet_v1.tflite') + interpreter.allocate_tensors() + input_details = interpreter.get_input_details() + for _ in range(100): + interpreter.set_tensor(input_details[0]['index'], + np.random.random_sample(input_details[0]['shape']).astype(np.float32)) + interpreter.invoke() + " & + done + wait + echo "Stress test completed" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/examples/test-resources-example3.yaml new/melange-0.36.0/examples/test-resources-example3.yaml --- old/melange-0.35.1/examples/test-resources-example3.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/melange-0.36.0/examples/test-resources-example3.yaml 2025-12-09 09:15:58.000000000 +0100 @@ -0,0 +1,74 @@ +package: + name: nginx-module-geoip + version: 1.24.0 + epoch: 0 + description: NGINX GeoIP module - simple build, needs resources for integration tests + # Only test resources specified + test-resources: + cpu: "4" + memory: "8Gi" +environment: + contents: + repositories: + - https://packages.wolfi.dev/os + keyring: + - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub + packages: + - build-base + - busybox + - nginx-dev + - geoip-dev +pipeline: + - uses: fetch + with: + uri: https://github.com/leev/ngx_http_geoip2_module/archive/${{package.version}}.tar.gz + expected-sha256: 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef + - runs: | + ./configure --add-dynamic-module=. + make modules + install -Dm755 objs/ngx_http_geoip2_module.so \ + "${{targets.destdir}}/usr/lib/nginx/modules/ngx_http_geoip2_module.so" +test: + environment: + contents: + packages: + - nginx + - geoip + - curl + pipeline: + - name: Download GeoIP database + runs: | + mkdir -p /usr/share/GeoIP + # In real scenario, would download actual GeoIP database + # For this example, create a minimal test database + echo "Creating test GeoIP database..." + - name: Test module loading + runs: | + cat > /tmp/nginx.conf << 'EOF' + load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so; + events {} + http { + server { + listen 8080; + location / { + return 200 "Module loaded successfully\n"; + } + } + } + EOF + nginx -t -c /tmp/nginx.conf + - name: Integration test with requests + runs: | + # Start nginx in background + nginx -c /tmp/nginx.conf & + NGINX_PID=$! + sleep 2 + + # Test endpoints + for i in {1..100}; do + curl -s http://localhost:8080/ | grep "Module loaded" + done + + # Cleanup + kill $NGINX_PID + echo "Integration test completed successfully" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/go.mod new/melange-0.36.0/go.mod --- old/melange-0.35.1/go.mod 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/go.mod 2025-12-09 09:15:58.000000000 +0100 @@ -3,10 +3,10 @@ go 1.24.6 require ( - chainguard.dev/apko v0.30.27 + chainguard.dev/apko v0.30.29 github.com/chainguard-dev/clog v1.7.0 github.com/chainguard-dev/go-pkgconfig v0.0.0-20240404163941-6351b37b2a10 - github.com/chainguard-dev/yam v0.2.42 + github.com/chainguard-dev/yam v0.2.43 github.com/charmbracelet/log v0.4.2 github.com/docker/cli v29.1.2+incompatible github.com/docker/docker v28.5.2+incompatible @@ -29,7 +29,7 @@ github.com/pkg/errors v0.9.1 github.com/psanford/memfs v0.0.0-20241019191636-4ef911798f9b github.com/spdx/tools-golang v0.5.5 - github.com/spf13/cobra v1.10.1 + github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.11.1 github.com/ulikunitz/xz v0.5.15 github.com/yookoala/realpath v1.0.0 @@ -40,8 +40,8 @@ go.yaml.in/yaml/v2 v2.4.3 golang.org/x/crypto v0.45.0 golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b - golang.org/x/sync v0.18.0 - golang.org/x/sys v0.38.0 + golang.org/x/sync v0.19.0 + golang.org/x/sys v0.39.0 golang.org/x/term v0.37.0 golang.org/x/text v0.31.0 golang.org/x/time v0.14.0 @@ -60,6 +60,7 @@ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect go.opencensus.io v0.24.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/tools v0.39.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect ) @@ -161,13 +162,13 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect go.opentelemetry.io/otel/metric v1.38.0 // indirect go.opentelemetry.io/otel/trace v1.38.0 // indirect - go.step.sm/crypto v0.74.0 // indirect + go.step.sm/crypto v0.75.0 // indirect golang.org/x/mod v0.30.0 // indirect golang.org/x/net v0.47.0 // indirect golang.org/x/oauth2 v0.33.0 // indirect - google.golang.org/api v0.256.0 // indirect + google.golang.org/api v0.257.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 // indirect google.golang.org/grpc v1.77.0 // indirect google.golang.org/protobuf v1.36.10 gopkg.in/warnings.v0 v0.1.2 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/go.sum new/melange-0.36.0/go.sum --- old/melange-0.35.1/go.sum 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/go.sum 2025-12-09 09:15:58.000000000 +0100 @@ -1,5 +1,5 @@ -chainguard.dev/apko v0.30.27 h1:MIbezuYcRAyvHUv0y41LV62haE18V/z1wQmjk+xjpJM= -chainguard.dev/apko v0.30.27/go.mod h1:xZnPoBLTslFeebuAV+us05NpWVjeXi2syQ1SzeZnkc8= +chainguard.dev/apko v0.30.29 h1:/uQYBoLsq92KSuKWTLj9s/5Cs5a/b57zLNz1MUWja8s= +chainguard.dev/apko v0.30.29/go.mod h1:4FN9ULTi71cdylQx9XACNsZANRzroDOjY2yXSLdDT6Q= chainguard.dev/go-grpc-kit v0.17.15 h1:y+FBjta2lsC0XxlkG+W5P1VxYl0zG74GRvoYN2o+p7s= chainguard.dev/go-grpc-kit v0.17.15/go.mod h1:1wAVAX2CCamtFlfMs9PFzfgQQxX1/TQyF6cbWApbJ2U= chainguard.dev/sdk v0.1.44 h1:N65xDKBSgZ/y8M8F/BZUv2sjMHxDKTPV5RieTg6mqew= @@ -45,8 +45,8 @@ github.com/chainguard-dev/clog v1.7.0/go.mod h1:4+WFhRMsGH79etYXY3plYdp+tCz/KCkU8fAr0HoaPvs= github.com/chainguard-dev/go-pkgconfig v0.0.0-20240404163941-6351b37b2a10 h1:XR2vgQC024I9/boh9r1ihVv8Z14+pbvWqXeYMCnZJpc= github.com/chainguard-dev/go-pkgconfig v0.0.0-20240404163941-6351b37b2a10/go.mod h1:1p6+MesLcjKeON5BRWa7I87mvAY0QmKjgginIM3w6BI= -github.com/chainguard-dev/yam v0.2.42 h1:HOJ0R3PoDAXQ6YYo9HnbKBD4Z8MwFaJbty/hAAuUn/k= -github.com/chainguard-dev/yam v0.2.42/go.mod h1:dJCqG2IpMyRXd4W0zwTpsRhPGQcHSt3sN9Mmgyr3coE= +github.com/chainguard-dev/yam v0.2.43 h1:WRIYo9WbqOmls+CbmKWpt/vUQ0g4IiVjANrJj7hOAUI= +github.com/chainguard-dev/yam v0.2.43/go.mod h1:Dwk2i+W3mifDxxM5nILZrvUs9GYZsIjVjEONgKMtBrI= github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI= github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= @@ -314,8 +314,8 @@ github.com/spf13/afero v1.2.0/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= -github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= -github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -381,8 +381,8 @@ go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= -go.step.sm/crypto v0.74.0 h1:/APBEv45yYR4qQFg47HA8w1nesIGcxh44pGyQNw6JRA= -go.step.sm/crypto v0.74.0/go.mod h1:UoXqCAJjjRgzPte0Llaqen7O9P7XjPmgjgTHQGkKCDk= +go.step.sm/crypto v0.75.0 h1:UAHYD6q6ggYyzLlIKHv1MCUVjZIesXRZpGTlRC/HSHw= +go.step.sm/crypto v0.75.0/go.mod h1:wwQ57+ajmDype9mrI/2hRyrvJd7yja5xVgWYqpUN3PE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= @@ -428,8 +428,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -447,8 +447,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -481,8 +481,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.256.0 h1:u6Khm8+F9sxbCTYNoBHg6/Hwv0N/i+V94MvkOSor6oI= -google.golang.org/api v0.256.0/go.mod h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqcU964= +google.golang.org/api v0.257.0 h1:8Y0lzvHlZps53PEaw+G29SsQIkuKrumGWs9puiexNAA= +google.golang.org/api v0.257.0/go.mod h1:4eJrr+vbVaZSqs7vovFd1Jb/A6ml6iw2e6FBYf3GAO4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -490,8 +490,8 @@ google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 h1:mepRgnBZa07I4TRuomDE4sTIYieg/osKmzIf4USdWS4= google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 h1:tRPGkdGHuewF4UisLzzHHr1spKw92qLM98nIzxbC0wY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 h1:Wgl1rcDNThT+Zn47YyCXOXyX/COgMTIdhJ717F0l4xk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/build/pipelines/git-checkout.yaml new/melange-0.36.0/pkg/build/pipelines/git-checkout.yaml --- old/melange-0.35.1/pkg/build/pipelines/git-checkout.yaml 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/build/pipelines/git-checkout.yaml 2025-12-09 09:15:58.000000000 +0100 @@ -121,7 +121,7 @@ if [ -n "$branch" ]; then case " $fetched_branches " in *" $branch "*) ;; - *) vr git fetch origin $branch:$branch || { + *) vr git fetch --unshallow origin $branch:$branch || { msg "failed to fetch branch $branch" return 1 } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/build/test.go new/melange-0.36.0/pkg/build/test.go --- old/melange-0.35.1/pkg/build/test.go 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/build/test.go 2025-12-09 09:15:58.000000000 +0100 @@ -23,6 +23,7 @@ "path/filepath" "runtime" "slices" + "time" "chainguard.dev/apko/pkg/apk/apk" apkofs "chainguard.dev/apko/pkg/apk/fs" @@ -65,6 +66,11 @@ Interactive bool Auth map[string]options.Auth IgnoreSignatures bool + DefaultCPU string + DefaultCPUModel string + DefaultDisk string + DefaultMemory string + DefaultTimeout time.Duration } func NewTest(ctx context.Context, opts ...TestOption) (*Test, error) { @@ -106,6 +112,11 @@ parsedCfg, err := config.ParseConfiguration(ctx, t.ConfigFile, config.WithEnvFileForParsing(t.EnvFile), + config.WithDefaultCPU(t.DefaultCPU), + config.WithDefaultCPUModel(t.DefaultCPUModel), + config.WithDefaultDisk(t.DefaultDisk), + config.WithDefaultMemory(t.DefaultMemory), + config.WithDefaultTimeout(t.DefaultTimeout), ) if err != nil { return nil, fmt.Errorf("failed to load configuration: %w", err) @@ -447,6 +458,13 @@ RunAs: runAs(imgcfg.Accounts), RunAsGID: runAsGID(imgcfg.Accounts), } + + if t.Configuration.Package.Resources != nil { + cfg.CPU = t.Configuration.Package.Resources.CPU + cfg.CPUModel = t.Configuration.Package.Resources.CPUModel + cfg.Memory = t.Configuration.Package.Resources.Memory + cfg.Disk = t.Configuration.Package.Resources.Disk + } if t.Configuration.Capabilities.Add != nil { cfg.Capabilities.Add = t.Configuration.Capabilities.Add } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/build/test_options.go new/melange-0.36.0/pkg/build/test_options.go --- old/melange-0.35.1/pkg/build/test_options.go 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/build/test_options.go 2025-12-09 09:15:58.000000000 +0100 @@ -15,6 +15,8 @@ package build import ( + "time" + apko_types "chainguard.dev/apko/pkg/build/types" "chainguard.dev/apko/pkg/options" @@ -206,3 +208,38 @@ return nil } } + +func WithTestCPU(cpu string) TestOption { + return func(t *Test) error { + t.DefaultCPU = cpu + return nil + } +} + +func WithTestCPUModel(cpumodel string) TestOption { + return func(t *Test) error { + t.DefaultCPUModel = cpumodel + return nil + } +} + +func WithTestDisk(disk string) TestOption { + return func(t *Test) error { + t.DefaultDisk = disk + return nil + } +} + +func WithTestMemory(memory string) TestOption { + return func(t *Test) error { + t.DefaultMemory = memory + return nil + } +} + +func WithTestTimeout(dur time.Duration) TestOption { + return func(t *Test) error { + t.DefaultTimeout = dur + return nil + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/cli/test.go new/melange-0.36.0/pkg/cli/test.go --- old/melange-0.35.1/pkg/cli/test.go 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/cli/test.go 2025-12-09 09:15:58.000000000 +0100 @@ -20,6 +20,7 @@ "fmt" "os" "strings" + "time" apko_types "chainguard.dev/apko/pkg/build/types" "github.com/chainguard-dev/clog" @@ -51,6 +52,11 @@ fs.StringSliceVar(&flags.ExtraTestPackages, "test-package-append", []string{}, "extra packages to install for each of the test environments") fs.BoolVar(&flags.Remove, "rm", true, "clean up intermediate artifacts (e.g. container images, temp dirs)") fs.BoolVar(&flags.IgnoreSignatures, "ignore-signatures", false, "ignore repository signature verification") + fs.StringVar(&flags.CPU, "cpu", "", "default CPU resources to use for tests") + fs.StringVar(&flags.CPUModel, "cpumodel", "", "default CPU model to use for tests") + fs.StringVar(&flags.Disk, "disk", "", "disk size to use for tests") + fs.StringVar(&flags.Memory, "memory", "", "default memory resources to use for tests") + fs.DurationVar(&flags.Timeout, "timeout", 0, "default timeout for tests") } // TestFlags holds all parsed test command flags @@ -73,6 +79,11 @@ ExtraTestPackages []string Remove bool IgnoreSignatures bool + CPU string + CPUModel string + Memory string + Disk string + Timeout time.Duration } // ParseTestFlags parses test flags from the provided args and returns a TestFlags struct @@ -112,6 +123,11 @@ build.WithTestInteractive(flags.Interactive), build.WithTestRemove(flags.Remove), build.WithTestIgnoreSignatures(flags.IgnoreSignatures), + build.WithTestCPU(flags.CPU), + build.WithTestCPUModel(flags.CPUModel), + build.WithTestMemory(flags.Memory), + build.WithTestDisk(flags.Disk), + build.WithTestTimeout(flags.Timeout), } if len(args) > 0 { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/config/config.go new/melange-0.36.0/pkg/config/config.go --- old/melange-0.35.1/pkg/config/config.go 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/config/config.go 2025-12-09 09:15:58.000000000 +0100 @@ -138,6 +138,11 @@ Timeout time.Duration `json:"timeout,omitempty" yaml:"timeout,omitempty"` // Optional: Resources to allocate to the build. Resources *Resources `json:"resources,omitempty" yaml:"resources,omitempty"` + // Optional: Resources to allocate for test execution. + // Used by external schedulers (like elastic build) to provision + // appropriately-sized test pods/VMs. If not specified, falls back + // to Resources. + TestResources *Resources `json:"test-resources,omitempty" yaml:"test-resources,omitempty"` } // CPE stores values used to produce a CPE to describe the package, suitable for @@ -1358,6 +1363,7 @@ CPE: in.CPE, Timeout: in.Timeout, Resources: in.Resources, + TestResources: in.TestResources, SetCap: in.SetCap, } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/config/config_test.go new/melange-0.36.0/pkg/config/config_test.go --- old/melange-0.35.1/pkg/config/config_test.go 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/config/config_test.go 2025-12-09 09:15:58.000000000 +0100 @@ -1387,3 +1387,264 @@ }) } } + +func TestTestResources(t *testing.T) { + ctx := slogtest.Context(t) + + tests := []struct { + name string + yaml string + expectResources *Resources + expectTestResources *Resources + expectParseError bool + }{ + { + name: "both resources and test-resources specified", + yaml: ` +package: + name: test-pkg + version: 1.0.0 + epoch: 0 + resources: + cpu: "8" + memory: 16Gi + disk: 100Gi + test-resources: + cpu: "4" + memory: 8Gi + disk: 50Gi +`, + expectResources: &Resources{ + CPU: "8", + Memory: "16Gi", + Disk: "100Gi", + }, + expectTestResources: &Resources{ + CPU: "4", + Memory: "8Gi", + Disk: "50Gi", + }, + expectParseError: false, + }, + { + name: "only test-resources specified", + yaml: ` +package: + name: test-pkg + version: 1.0.0 + epoch: 0 + test-resources: + cpu: "4" + memory: 8Gi +`, + expectResources: &Resources{ + CPU: "", + Memory: "", + }, + expectTestResources: &Resources{ + CPU: "4", + Memory: "8Gi", + }, + expectParseError: false, + }, + { + name: "only resources specified (backward compatible)", + yaml: ` +package: + name: test-pkg + version: 1.0.0 + epoch: 0 + resources: + cpu: "4" + memory: 8Gi +`, + expectResources: &Resources{ + CPU: "4", + Memory: "8Gi", + }, + expectTestResources: nil, + expectParseError: false, + }, + { + name: "neither resources nor test-resources specified", + yaml: ` +package: + name: test-pkg + version: 1.0.0 + epoch: 0 +`, + expectResources: &Resources{ + CPU: "", + Memory: "", + }, + expectTestResources: nil, + expectParseError: false, + }, + { + name: "test-resources needs more resources than build", + yaml: ` +package: + name: ml-pkg + version: 2.0.0 + epoch: 0 + resources: + cpu: "2" + memory: 4Gi + test-resources: + cpu: "32" + memory: 128Gi + disk: 500Gi +`, + expectResources: &Resources{ + CPU: "2", + Memory: "4Gi", + }, + expectTestResources: &Resources{ + CPU: "32", + Memory: "128Gi", + Disk: "500Gi", + }, + expectParseError: false, + }, + { + name: "cpumodel in test-resources", + yaml: ` +package: + name: test-pkg + version: 1.0.0 + epoch: 0 + test-resources: + cpu: "4" + cpumodel: "intel-xeon" + memory: 8Gi +`, + expectResources: &Resources{ + CPU: "", + Memory: "", + }, + expectTestResources: &Resources{ + CPU: "4", + CPUModel: "intel-xeon", + Memory: "8Gi", + }, + expectParseError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fp := filepath.Join(t.TempDir(), "melange-test-resources-"+tt.name) + if err := os.WriteFile(fp, []byte(tt.yaml), 0o644); err != nil { + t.Fatal(err) + } + + cfg, err := ParseConfiguration(ctx, fp) + if tt.expectParseError { + require.Error(t, err) + return + } + + require.NoError(t, err) + + if tt.expectResources != nil { + require.NotNil(t, cfg.Package.Resources) + require.Equal(t, tt.expectResources.CPU, cfg.Package.Resources.CPU) + require.Equal(t, tt.expectResources.Memory, cfg.Package.Resources.Memory) + require.Equal(t, tt.expectResources.Disk, cfg.Package.Resources.Disk) + require.Equal(t, tt.expectResources.CPUModel, cfg.Package.Resources.CPUModel) + } else { + require.Nil(t, cfg.Package.Resources) + } + + if tt.expectTestResources != nil { + require.NotNil(t, cfg.Package.TestResources) + require.Equal(t, tt.expectTestResources.CPU, cfg.Package.TestResources.CPU) + require.Equal(t, tt.expectTestResources.Memory, cfg.Package.TestResources.Memory) + require.Equal(t, tt.expectTestResources.Disk, cfg.Package.TestResources.Disk) + require.Equal(t, tt.expectTestResources.CPUModel, cfg.Package.TestResources.CPUModel) + } else { + require.Nil(t, cfg.Package.TestResources) + } + }) + } +} + +func TestTestResourcesEdgeCases(t *testing.T) { + ctx := slogtest.Context(t) + + tests := []struct { + name string + yaml string + expectParseError bool + checkFunc func(*testing.T, *Configuration) + }{ + { + name: "empty test-resources object", + yaml: ` +package: + name: test-pkg + version: 1.0.0 + epoch: 0 + test-resources: {} +`, + expectParseError: false, + checkFunc: func(t *testing.T, cfg *Configuration) { + require.NotNil(t, cfg.Package.TestResources) + require.Empty(t, cfg.Package.TestResources.CPU) + require.Empty(t, cfg.Package.TestResources.Memory) + }, + }, + { + name: "malformed yaml - invalid indentation", + yaml: ` +package: + name: test-pkg +version: 1.0.0 + epoch: 0 +`, + expectParseError: true, + }, + { + name: "test-resources with all fields specified", + yaml: ` +package: + name: test-pkg + version: 1.0.0 + epoch: 0 + test-resources: + cpu: "16" + cpumodel: "intel-xeon-platinum" + memory: "256Gi" + disk: "2Ti" +`, + expectParseError: false, + checkFunc: func(t *testing.T, cfg *Configuration) { + require.NotNil(t, cfg.Package.TestResources) + require.Equal(t, "16", cfg.Package.TestResources.CPU) + require.Equal(t, "intel-xeon-platinum", cfg.Package.TestResources.CPUModel) + require.Equal(t, "256Gi", cfg.Package.TestResources.Memory) + require.Equal(t, "2Ti", cfg.Package.TestResources.Disk) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fp := filepath.Join(t.TempDir(), "melange-test-resources-edge-"+tt.name) + if err := os.WriteFile(fp, []byte(tt.yaml), 0o644); err != nil { + t.Fatal(err) + } + + cfg, err := ParseConfiguration(ctx, fp) + if tt.expectParseError { + require.Error(t, err) + return + } + + require.NoError(t, err) + if tt.checkFunc != nil { + tt.checkFunc(t, cfg) + } + }) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/config/schema.cue new/melange-0.36.0/pkg/config/schema.cue --- old/melange-0.35.1/pkg/config/schema.cue 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/config/schema.cue 2025-12-09 09:15:58.000000000 +0100 @@ -329,7 +329,15 @@ timeout?: int // Optional: Resources to allocate to the build. + // Used by external schedulers (like elastic build) to provision + // appropriately-sized build pods/VMs. resources?: #Resources + + // Optional: Resources to allocate for test execution. + // Used by external schedulers (like elastic build) to provision + // appropriately-sized test pods/VMs. If not specified, external + // schedulers should fall back to the resources configuration. + "test-resources"?: #Resources }) #PackageOption: close({ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/config/schema.json new/melange-0.36.0/pkg/config/schema.json --- old/melange-0.35.1/pkg/config/schema.json 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/config/schema.json 2025-12-09 09:15:58.000000000 +0100 @@ -669,6 +669,10 @@ "resources": { "$ref": "#/$defs/Resources", "description": "Optional: Resources to allocate to the build." + }, + "test-resources": { + "$ref": "#/$defs/Resources", + "description": "Optional: Resources to allocate for test execution.\nUsed by external schedulers (like elastic build) to provision\nappropriately-sized test pods/VMs. If not specified, falls back\nto Resources." } }, "additionalProperties": false, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/renovate/bump/bump.go new/melange-0.36.0/pkg/renovate/bump/bump.go --- old/melange-0.35.1/pkg/renovate/bump/bump.go 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/renovate/bump/bump.go 2025-12-09 09:15:58.000000000 +0100 @@ -120,6 +120,12 @@ // Find our main pipeline YAML node. pipelineNode, err := renovate.NodeFromMapping(rc.Configuration.Root().Content[0], "pipeline") if err != nil { + // The main pipeline doesn't exist. This is valid for empty virtual and metapackages so + // we will just return early instead of throwing an error + if strings.Contains(err.Error(), "not found in mapping") { + log.Infof("no main pipeline found, will not update expected commits or checksums") + return nil + } return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/melange-0.35.1/pkg/renovate/cache/cache.go new/melange-0.36.0/pkg/renovate/cache/cache.go --- old/melange-0.35.1/pkg/renovate/cache/cache.go 2025-12-05 21:15:25.000000000 +0100 +++ new/melange-0.36.0/pkg/renovate/cache/cache.go 2025-12-09 09:15:58.000000000 +0100 @@ -99,6 +99,12 @@ // Find our main pipeline YAML node. pipelineNode, err := renovate.NodeFromMapping(rc.Configuration.Root().Content[0], "pipeline") if err != nil { + // The main pipeline doesn't exist. This is valid for empty virtual and metapackages so + // we will just return early instead of throwing an error + if strings.Contains(err.Error(), "not found in mapping") { + log.Infof("no main pipeline found, will not cache any artifacts") + return nil + } return err } ++++++ melange.obsinfo ++++++ --- /var/tmp/diff_new_pack.kTxQi1/_old 2025-12-11 18:43:07.977989622 +0100 +++ /var/tmp/diff_new_pack.kTxQi1/_new 2025-12-11 18:43:07.993990295 +0100 @@ -1,5 +1,5 @@ name: melange -version: 0.35.1 -mtime: 1764965725 -commit: f28e457f74f15f5af9f9f1370e34943567633255 +version: 0.36.0 +mtime: 1765268158 +commit: c32e57daa58da05d589ec801b6c5c4c3086a83f9 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/melange/vendor.tar.gz /work/SRC/openSUSE:Factory/.melange.new.1939/vendor.tar.gz differ: char 14, line 1
