mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-08 15:41:15 +02:00
* ci: composite action that signs and verifies an image with cosign Keyless, by digest, with a verification pass against the calling workflow's own identity right after signing. Signatures use the .sig tag layout rather than the OCI-referrer bundle cosign 3 writes by default, since that is what the verifiers people run today read. Dependabot is pointed at the action so the cosign-installer pin keeps moving. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker release: sign every variant on both registries The merge job signs each variant's multi-arch index on GHCR and Docker Hub once the tag exists, recursively so the platform images are covered too. latest re-tags the same manifest and inherits the signature. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker dev: sign the dev image Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker latest: sign a latest rebuilt by hand Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker release: sign the foundationdb image Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker: sign the per-version foundationdb and rocksdb builds They push to the same repository as the releases, so an admission policy that verifies chrislusf/seaweedfs would otherwise reject them. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker: document image signature verification Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * ci: pin the actions the signing jobs newly run by commit These run with registry credentials and the OIDC token that signs under the repository's identity, so a retargeted tag upstream must not be able to reach them. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker latest: pass the dispatch tag through env, not the script Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker: complete Kyverno policy, digest note, identity scope Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker latest: keep the dispatch tag out of the manifest script too The step predates signing, but the job now holds the OIDC identity. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * ci: pin every action in the jobs that sign The jobs that hold the OIDC identity run these with registry credentials, so a retargeted tag upstream must not reach them. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker release: copy and sign the digest the run created, pin the rest crane copy and the signature both resolved the tag, which another publisher could move between the two steps. The index digest is read once, right after it is created, and the Docker Hub copy and both signatures use it. The manual latest rebuild gets the same treatment. The actions in these jobs are pinned to commits, crane to v0.22.0 by checksum, and the sparse checkout no longer keeps the token. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker latest: the signing job checks out the workflow's own commit The job only assembles and signs manifests, so nothing there needs the source_ref checkout; the local signing action now comes from the same revision as the workflow file that calls it. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa * docker release: take the index digest from the create result imagetools create writes the descriptor it pushed with --metadata-file (buildx 0.32+, the runners ship 0.36), so the digest no longer comes from re-resolving the tag even within the same step. Claude-Session: https://claude.ai/code/session_01A5zMqzaUg1Snur4Yg8xJGa
183 lines
6.6 KiB
YAML
183 lines
6.6 KiB
YAML
name: "docker: build foundationdb image by version"
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [ master, main ]
|
|
paths:
|
|
- 'weed/filer/foundationdb/**'
|
|
- 'test/foundationdb/**'
|
|
- 'docker/Dockerfile.foundationdb_large'
|
|
- 'docker/filer_foundationdb.toml'
|
|
- '.github/workflows/container_foundationdb_version.yml'
|
|
workflow_dispatch:
|
|
inputs:
|
|
fdb_version:
|
|
description: 'FoundationDB version to build (e.g. 7.4.5)'
|
|
required: true
|
|
default: '7.4.5'
|
|
seaweedfs_ref:
|
|
description: 'SeaweedFS git tag, branch, or commit to build'
|
|
required: true
|
|
default: 'master'
|
|
image_tag:
|
|
description: 'Optional Docker tag suffix (defaults to foundationdb_<fdb>_seaweedfs_<ref>)'
|
|
required: false
|
|
default: ''
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
build-foundationdb-image:
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
id-token: write
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Install FoundationDB client libraries
|
|
run: |
|
|
set -euo pipefail
|
|
sudo apt-get update
|
|
sudo apt-get install -y ca-certificates wget
|
|
FDB_VERSION="${{ inputs.fdb_version || '7.4.5' }}"
|
|
case "${FDB_VERSION}_amd64" in
|
|
"7.4.5_amd64") EXPECTED_SHA256="eea6b98cf386a0848655b2e196d18633662a7440a7ee061c10e32153c7e7e112" ;;
|
|
"7.3.43_amd64") EXPECTED_SHA256="c3fa0a59c7355b914a1455dac909238d5ea3b6c6bc7b530af8597e6487c1651a" ;;
|
|
*)
|
|
echo "Unsupported FoundationDB version ${FDB_VERSION} for CI client install" >&2
|
|
exit 1 ;;
|
|
esac
|
|
PACKAGE="foundationdb-clients_${FDB_VERSION}-1_amd64.deb"
|
|
wget --timeout=30 --tries=3 -O "${PACKAGE}" "https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/${PACKAGE}"
|
|
echo "${EXPECTED_SHA256} ${PACKAGE}" | sha256sum -c -
|
|
sudo dpkg -i "${PACKAGE}"
|
|
rm "${PACKAGE}"
|
|
sudo ldconfig
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7
|
|
with:
|
|
go-version-file: go.mod
|
|
|
|
- name: Run FoundationDB tagged tests
|
|
env:
|
|
CGO_ENABLED: 1
|
|
run: |
|
|
go test ./weed/filer/foundationdb -tags foundationdb -count=1
|
|
|
|
- name: Prepare Docker tag
|
|
id: tag
|
|
env:
|
|
FDB_VERSION_INPUT: ${{ inputs.fdb_version }}
|
|
SEAWEEDFS_REF_INPUT: ${{ inputs.seaweedfs_ref }}
|
|
CUSTOM_TAG_INPUT: ${{ inputs.image_tag }}
|
|
EVENT_NAME: ${{ github.event_name }}
|
|
HEAD_REF: ${{ github.head_ref }}
|
|
REF_NAME: ${{ github.ref_name }}
|
|
run: |
|
|
set -euo pipefail
|
|
sanitize() {
|
|
local value="$1"
|
|
value="${value,,}"
|
|
value="${value// /-}"
|
|
value="${value//[^a-z0-9_.-]/-}"
|
|
value="${value#-}"
|
|
value="${value%-}"
|
|
printf '%s' "$value"
|
|
}
|
|
version="${FDB_VERSION_INPUT}"
|
|
seaweed="${SEAWEEDFS_REF_INPUT}"
|
|
tag="${CUSTOM_TAG_INPUT}"
|
|
# Use defaults for PR builds
|
|
if [ -z "$version" ]; then
|
|
version="7.4.5"
|
|
fi
|
|
if [ -z "$seaweed" ]; then
|
|
if [ "$EVENT_NAME" = "pull_request" ]; then
|
|
seaweed="${HEAD_REF}"
|
|
else
|
|
seaweed="${REF_NAME}"
|
|
fi
|
|
fi
|
|
sanitized_version="$(sanitize "$version")"
|
|
if [ -z "$sanitized_version" ]; then
|
|
echo "Unable to sanitize FoundationDB version '$version'." >&2
|
|
exit 1
|
|
fi
|
|
sanitized_seaweed="$(sanitize "$seaweed")"
|
|
if [ -z "$sanitized_seaweed" ]; then
|
|
echo "Unable to sanitize SeaweedFS ref '$seaweed'." >&2
|
|
exit 1
|
|
fi
|
|
if [ -z "$tag" ]; then
|
|
tag="foundationdb_${sanitized_version}_seaweedfs_${sanitized_seaweed}"
|
|
else
|
|
tag="$(sanitize "$tag")"
|
|
fi
|
|
if [ -z "$tag" ]; then
|
|
echo "Resulting Docker tag is empty." >&2
|
|
exit 1
|
|
fi
|
|
echo "docker_tag=$tag" >> "$GITHUB_OUTPUT"
|
|
echo "full_image=chrislusf/seaweedfs:$tag" >> "$GITHUB_OUTPUT"
|
|
echo "seaweedfs_ref=$seaweed" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Set up QEMU
|
|
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
|
|
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
|
|
|
|
- name: Login to Docker Hub
|
|
if: github.event_name != 'pull_request'
|
|
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
|
with:
|
|
username: ${{ secrets.DOCKER_USERNAME }}
|
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
|
|
- name: Determine branch to build
|
|
id: branch
|
|
env:
|
|
INPUT_REF: ${{ inputs.seaweedfs_ref }}
|
|
HEAD_REF: ${{ github.head_ref }}
|
|
REF_NAME: ${{ github.ref_name }}
|
|
run: |
|
|
if [ -n "$INPUT_REF" ]; then
|
|
echo "branch=$INPUT_REF" >> "$GITHUB_OUTPUT"
|
|
elif [ "${{ github.event_name }}" = "pull_request" ]; then
|
|
echo "branch=$HEAD_REF" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "branch=$REF_NAME" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
- name: Build and push image
|
|
id: build
|
|
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7
|
|
with:
|
|
context: ./docker
|
|
push: ${{ github.event_name != 'pull_request' }}
|
|
file: ./docker/Dockerfile.foundationdb_large
|
|
build-args: |
|
|
FDB_VERSION=${{ inputs.fdb_version || '7.4.5' }}
|
|
BRANCH=${{ steps.branch.outputs.branch }}
|
|
# Note: ARM64 support requires FoundationDB ARM64 packages which are not available for all versions
|
|
# Currently only building for amd64. To enable ARM64, verify package availability and add checksums.
|
|
platforms: linux/amd64
|
|
tags: ${{ steps.tag.outputs.full_image || 'seaweedfs:foundationdb-test' }}
|
|
labels: |
|
|
org.opencontainers.image.title=seaweedfs
|
|
org.opencontainers.image.description=SeaweedFS is a distributed storage system for blobs, objects, files, and data lake, to store and serve billions of files fast!
|
|
org.opencontainers.image.vendor=Chris Lu
|
|
|
|
- name: Sign
|
|
if: github.event_name != 'pull_request'
|
|
uses: ./.github/actions/sign-image
|
|
with:
|
|
images: chrislusf/seaweedfs@${{ steps.build.outputs.digest }}
|