Skip to content

Commit 39270ad

Browse files
committed
merge(main): refresh policy finality base
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
2 parents 06e8538 + 772ce00 commit 39270ad

92 files changed

Lines changed: 8331 additions & 4834 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/build-base-image-platform/action.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@
44
name: build-base-image-platform
55
description: Build and publish one immutable base image digest for a platform.
66

7+
outputs:
8+
digest:
9+
description: Exact digest for the requested platform.
10+
value: ${{ steps.build.outputs.digest }}
11+
amd64-digest:
12+
description: Exact amd64 digest when this action built the amd64 lane.
13+
value: ${{ steps.job-output.outputs.amd64_digest }}
14+
arm64-digest:
15+
description: Exact arm64 digest when this action built the arm64 lane.
16+
value: ${{ steps.job-output.outputs.arm64_digest }}
17+
718
inputs:
819
agent:
920
description: Agent identifier used for build arguments and artifact names.
@@ -129,6 +140,7 @@ runs:
129140
'test -x /usr/bin/dos2unix; test "$(command -v dos2unix)" = /usr/bin/dos2unix; dos2unix --version >/dev/null'
130141
131142
- name: Export platform digest
143+
id: job-output
132144
shell: bash
133145
env:
134146
ARCH: ${{ inputs.arch }}
@@ -145,6 +157,7 @@ runs:
145157
fi
146158
mkdir -p "$RUNNER_TEMP/digests"
147159
touch "$RUNNER_TEMP/digests/${ARCH}-${DIGEST#sha256:}"
160+
printf '%s_digest=%s\n' "$ARCH" "$DIGEST" >> "$GITHUB_OUTPUT"
148161
149162
- name: Upload platform digest
150163
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1

.github/actions/publish-base-image-manifest/action.yaml

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,21 @@
44
name: publish-base-image-manifest
55
description: Validate platform digests and publish one multi-platform base image manifest.
66

7+
outputs:
8+
contract-base64:
9+
description: Exact validated base-image contract for dependent jobs.
10+
value: ${{ steps.contract-output.outputs.contract_base64 }}
11+
712
inputs:
813
agent:
914
description: Agent identifier stored in the managed base image contract.
1015
required: true
16+
amd64-digest:
17+
description: Exact amd64 platform digest from the producer job.
18+
required: true
19+
arm64-digest:
20+
description: Exact arm64 platform digest from the producer job.
21+
required: true
1122
display-name:
1223
description: Agent name used in validation errors.
1324
required: true
@@ -27,12 +38,23 @@ inputs:
2738
runs:
2839
using: composite
2940
steps:
30-
- name: Download platform digests
31-
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
32-
with:
33-
pattern: ${{ inputs.agent }}-base-digest-${{ github.run_id }}-${{ github.run_attempt }}-*
34-
path: ${{ runner.temp }}/digests
35-
merge-multiple: true
41+
- name: Restore exact platform digests
42+
shell: bash
43+
env:
44+
AMD64_DIGEST: ${{ inputs.amd64-digest }}
45+
ARM64_DIGEST: ${{ inputs.arm64-digest }}
46+
run: |
47+
set -euo pipefail
48+
for digest in "$AMD64_DIGEST" "$ARM64_DIGEST"; do
49+
[[ "$digest" =~ ^sha256:[0-9a-f]{64}$ ]] || {
50+
echo "ERROR: base-image producer output has an invalid digest." >&2
51+
exit 1
52+
}
53+
done
54+
digest_root="$RUNNER_TEMP/digests"
55+
install -d -m 0700 "$digest_root"
56+
touch "$digest_root/amd64-${AMD64_DIGEST#sha256:}"
57+
touch "$digest_root/arm64-${ARM64_DIGEST#sha256:}"
3658
3759
- name: Set up Docker Buildx
3860
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
@@ -65,6 +87,22 @@ runs:
6587
IMAGE: ${{ inputs.registry }}/${{ inputs.image }}
6688
TAGS: ${{ steps.meta.outputs.tags }}
6789
run: bash "$GITHUB_ACTION_PATH/publish.sh"
90+
- name: Export managed base image contract
91+
id: contract-output
92+
shell: bash
93+
run: |
94+
set -euo pipefail
95+
contract="$RUNNER_TEMP/managed-base-contract/contract.json"
96+
if [ ! -f "$contract" ] || [ -L "$contract" ]; then
97+
echo "ERROR: managed base image contract is missing or is a symbolic link." >&2
98+
exit 1
99+
fi
100+
contract_size="$(wc -c < "$contract" | tr -d '[:space:]')"
101+
if [[ ! "$contract_size" =~ ^[1-9][0-9]{0,5}$ ]] || [ "$contract_size" -gt 65536 ]; then
102+
echo "ERROR: managed base image contract is empty or oversized." >&2
103+
exit 1
104+
fi
105+
printf 'contract_base64=%s\n' "$(base64 -w 0 "$contract")" >> "$GITHUB_OUTPUT"
68106
- name: Upload managed base image contract
69107
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
70108
with:
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
name: Build base image platform
5+
6+
on:
7+
workflow_call:
8+
inputs:
9+
agent:
10+
description: Agent identifier for the base-image build.
11+
required: true
12+
type: string
13+
arch:
14+
description: Artifact architecture identifier.
15+
required: true
16+
type: string
17+
platform:
18+
description: Docker platform to build.
19+
required: true
20+
type: string
21+
runner:
22+
description: GitHub-hosted runner for the target architecture.
23+
required: true
24+
type: string
25+
dockerfile:
26+
description: Path to the base-image Dockerfile.
27+
required: true
28+
type: string
29+
image:
30+
description: Image repository relative to GHCR.
31+
required: true
32+
type: string
33+
openclaw-version:
34+
description: Optional OpenClaw version build argument.
35+
required: false
36+
type: string
37+
default: ""
38+
outputs:
39+
digest:
40+
description: Exact digest for the requested platform.
41+
value: ${{ jobs.build.outputs.digest }}
42+
secrets:
43+
registry_password:
44+
description: GHCR publication credential.
45+
required: true
46+
47+
permissions:
48+
contents: read
49+
packages: write
50+
51+
jobs:
52+
build:
53+
name: Build ${{ inputs.agent }} base image (${{ inputs.arch }})
54+
runs-on: ${{ inputs.runner }}
55+
timeout-minutes: 60
56+
permissions:
57+
contents: read
58+
packages: write
59+
outputs:
60+
digest: ${{ steps.platform.outputs.digest }}
61+
steps:
62+
- name: Checkout
63+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
64+
with:
65+
persist-credentials: false
66+
67+
- name: Build and publish platform digest
68+
id: platform
69+
uses: ./.github/actions/build-base-image-platform
70+
with:
71+
agent: ${{ inputs.agent }}
72+
arch: ${{ inputs.arch }}
73+
platform: ${{ inputs.platform }}
74+
dockerfile: ${{ inputs.dockerfile }}
75+
image: ${{ inputs.image }}
76+
registry: ghcr.io
77+
registry-username: ${{ github.actor }}
78+
registry-password: ${{ secrets.registry_password }}
79+
openclaw-version: ${{ inputs.openclaw-version }}
80+
metadata-tags: |
81+
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
82+
type=ref,event=tag
83+
type=sha,prefix=,format=short

0 commit comments

Comments
 (0)