mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
These releases include 2 security fixes following the security policy:
- crypto/x509: excessive resource consumption in printing error string for host certificate validation
Within HostnameError.Error(), when constructing an error string, there is no limit to the number of hosts that will be printed out.
Furthermore, the error string is constructed by repeated string concatenation, leading to quadratic runtime.
Therefore, a certificate provided by a malicious actor can result in excessive resource consumption.
HostnameError.Error() now limits the number of hosts and utilizes strings.Builder when constructing an error string.
Thanks to Philippe Antoine (Catena cyber) for reporting this issue.
This is CVE-2025-61729 and Go issue https://go.dev/issue/76445.
- crypto/x509: excluded subdomain constraint does not restrict wildcard SANs
An excluded subdomain constraint in a certificate chain does not restrict the
usage of wildcard SANs in the leaf certificate. For example a constraint that
excludes the subdomain test.example.com does not prevent a leaf certificate from
claiming the SAN *.example.com.
This is CVE-2025-61727 and Go issue https://go.dev/issue/76442.
View the release notes for more information:
https://go.dev/doc/devel/release#go1.25.5
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
504 lines
17 KiB
YAML
504 lines
17 KiB
YAML
# reusable workflow
|
|
name: .test
|
|
|
|
# TODO: hide reusable workflow from the UI. Tracked in https://github.com/community/community/discussions/12025
|
|
|
|
# Default to 'contents: read', which grants actions to read commits.
|
|
#
|
|
# If any permission is set, any permission not included in the list is
|
|
# implicitly set to "none".
|
|
#
|
|
# see https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions
|
|
permissions:
|
|
contents: read
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
storage:
|
|
required: true
|
|
type: string
|
|
default: "graphdriver"
|
|
|
|
env:
|
|
GO_VERSION: "1.25.5"
|
|
GOTESTLIST_VERSION: v0.3.1
|
|
TESTSTAT_VERSION: v0.1.25
|
|
ITG_CLI_MATRIX_SIZE: 6
|
|
DOCKER_EXPERIMENTAL: 1
|
|
DOCKER_GRAPHDRIVER: ${{ inputs.storage == 'snapshotter' && 'overlayfs' || 'overlay2' }}
|
|
TEST_INTEGRATION_USE_GRAPHDRIVER: ${{ inputs.storage == 'graphdriver' && '1' || '' }}
|
|
SETUP_BUILDX_VERSION: edge
|
|
SETUP_BUILDKIT_IMAGE: moby/buildkit:latest
|
|
|
|
jobs:
|
|
docker-py:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 120 # guardrails timeout for the whole job
|
|
continue-on-error: ${{ github.event_name != 'pull_request' }}
|
|
steps:
|
|
-
|
|
name: Checkout
|
|
uses: actions/checkout@v4
|
|
-
|
|
name: Set up runner
|
|
uses: ./.github/actions/setup-runner
|
|
-
|
|
name: Set up tracing
|
|
uses: ./.github/actions/setup-tracing
|
|
-
|
|
name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
with:
|
|
version: ${{ env.SETUP_BUILDX_VERSION }}
|
|
driver-opts: image=${{ env.SETUP_BUILDKIT_IMAGE }}
|
|
buildkitd-flags: --debug
|
|
-
|
|
name: Build dev image
|
|
uses: docker/bake-action@v6
|
|
with:
|
|
targets: dev
|
|
set: |
|
|
dev.cache-from=type=gha,scope=dev
|
|
-
|
|
name: Test
|
|
run: |
|
|
make TEST_SKIP_INTEGRATION_CLI=1 -o build test-docker-py
|
|
-
|
|
name: Prepare reports
|
|
if: always()
|
|
run: |
|
|
docker stop otelcol
|
|
mkdir -p bundles /tmp/reports
|
|
find bundles -path '*/root/*overlay2' -prune -o -type f \( -name '*-report.json' -o -name '*.log' -o -name '*.out' -o -name '*.prof' -o -name '*-report.xml' \) -print | xargs sudo tar -czf /tmp/reports.tar.gz
|
|
tar -xzf /tmp/reports.tar.gz -C /tmp/reports
|
|
sudo chown -R $(id -u):$(id -g) /tmp/reports
|
|
tree -nh /tmp/reports
|
|
-
|
|
name: Test daemon logs
|
|
if: always()
|
|
run: |
|
|
cat bundles/test-docker-py/docker.log
|
|
-
|
|
name: Upload reports
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: test-reports-docker-py-${{ inputs.storage }}
|
|
path: /tmp/reports/*
|
|
retention-days: 1
|
|
|
|
integration-flaky:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 120 # guardrails timeout for the whole job
|
|
continue-on-error: ${{ github.event_name != 'pull_request' }}
|
|
steps:
|
|
-
|
|
name: Checkout
|
|
uses: actions/checkout@v4
|
|
-
|
|
name: Set up runner
|
|
uses: ./.github/actions/setup-runner
|
|
-
|
|
name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
with:
|
|
version: ${{ env.SETUP_BUILDX_VERSION }}
|
|
driver-opts: image=${{ env.SETUP_BUILDKIT_IMAGE }}
|
|
buildkitd-flags: --debug
|
|
-
|
|
name: Build dev image
|
|
uses: docker/bake-action@v6
|
|
with:
|
|
targets: dev
|
|
set: |
|
|
dev.cache-from=type=gha,scope=dev
|
|
-
|
|
name: Test
|
|
run: |
|
|
make -o build test-integration-flaky
|
|
env:
|
|
TEST_SKIP_INTEGRATION_CLI: 1
|
|
|
|
integration-prepare:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 10 # guardrails timeout for the whole job
|
|
continue-on-error: ${{ github.event_name != 'pull_request' }}
|
|
outputs:
|
|
includes: ${{ steps.set.outputs.includes }}
|
|
steps:
|
|
-
|
|
name: Create matrix includes
|
|
id: set
|
|
uses: actions/github-script@v7
|
|
with:
|
|
script: |
|
|
let includes = [
|
|
{ os: 'ubuntu-22.04', mode: '' },
|
|
{ os: 'ubuntu-22.04', mode: 'rootless' },
|
|
{ os: 'ubuntu-22.04', mode: 'systemd' },
|
|
{ os: 'ubuntu-24.04', mode: '' },
|
|
// { os: 'ubuntu-24.04', mode: 'rootless' }, // FIXME: https://github.com/moby/moby/pull/49579#issuecomment-2698622223
|
|
{ os: 'ubuntu-24.04', mode: 'systemd' },
|
|
// { os: 'ubuntu-24.04', mode: 'rootless-systemd' }, // FIXME: https://github.com/moby/moby/issues/44084
|
|
];
|
|
if ("${{ inputs.storage }}" == "snapshotter") {
|
|
includes.push({ os: 'ubuntu-24.04', mode: 'iptables+firewalld' });
|
|
includes.push({ os: 'ubuntu-24.04', mode: 'nftables' });
|
|
includes.push({ os: 'ubuntu-24.04', mode: 'nftables+firewalld' });
|
|
}
|
|
await core.group(`Set matrix`, async () => {
|
|
core.info(`matrix: ${JSON.stringify(includes)}`);
|
|
core.setOutput('includes', JSON.stringify(includes));
|
|
});
|
|
-
|
|
name: Show matrix
|
|
run: |
|
|
echo ${{ steps.set.outputs.includes }}
|
|
|
|
integration:
|
|
runs-on: ${{ matrix.os }}
|
|
timeout-minutes: 120 # guardrails timeout for the whole job
|
|
continue-on-error: ${{ github.event_name != 'pull_request' }}
|
|
needs:
|
|
- integration-prepare
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include: ${{ fromJson(needs.integration-prepare.outputs.includes) }}
|
|
steps:
|
|
-
|
|
name: Checkout
|
|
uses: actions/checkout@v4
|
|
-
|
|
name: Set up runner
|
|
uses: ./.github/actions/setup-runner
|
|
-
|
|
name: Set up tracing
|
|
uses: ./.github/actions/setup-tracing
|
|
-
|
|
name: Prepare
|
|
run: |
|
|
CACHE_DEV_SCOPE=dev
|
|
if [[ "${{ matrix.mode }}" == *"rootless"* ]]; then
|
|
echo "DOCKER_ROOTLESS=1" >> $GITHUB_ENV
|
|
fi
|
|
if [[ "${{ matrix.mode }}" == *"systemd"* ]]; then
|
|
echo "SYSTEMD=true" >> $GITHUB_ENV
|
|
CACHE_DEV_SCOPE="${CACHE_DEV_SCOPE}systemd"
|
|
fi
|
|
if [[ "${{ matrix.mode }}" == *"firewalld"* ]]; then
|
|
echo "FIREWALLD=true" >> $GITHUB_ENV
|
|
CACHE_DEV_SCOPE="${CACHE_DEV_SCOPE}firewalld"
|
|
fi
|
|
if [[ "${{ matrix.mode }}" == *"nftables"* ]]; then
|
|
echo "DOCKER_FIREWALL_BACKEND=nftables" >> $GITHUB_ENV
|
|
fi
|
|
echo "CACHE_DEV_SCOPE=${CACHE_DEV_SCOPE}" >> $GITHUB_ENV
|
|
-
|
|
name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
with:
|
|
version: ${{ env.SETUP_BUILDX_VERSION }}
|
|
driver-opts: image=${{ env.SETUP_BUILDKIT_IMAGE }}
|
|
buildkitd-flags: --debug
|
|
-
|
|
name: Build dev image
|
|
uses: docker/bake-action@v6
|
|
with:
|
|
targets: dev
|
|
set: |
|
|
dev.cache-from=type=gha,scope=${{ env.CACHE_DEV_SCOPE }}
|
|
-
|
|
name: Test
|
|
run: |
|
|
make -o build test-integration
|
|
env:
|
|
TEST_SKIP_INTEGRATION_CLI: 1
|
|
TESTCOVERAGE: 1
|
|
-
|
|
name: Prepare reports
|
|
if: always()
|
|
run: |
|
|
reportsName=${{ matrix.os }}
|
|
if [ -n "${{ matrix.mode }}" ]; then
|
|
reportsName="$reportsName-${{ matrix.mode }}"
|
|
fi
|
|
reportsPath="/tmp/reports/$reportsName"
|
|
echo "TESTREPORTS_NAME=$reportsName" >> $GITHUB_ENV
|
|
|
|
docker stop otelcol
|
|
mkdir -p bundles $reportsPath
|
|
find bundles -path '*/root/*overlay2' -prune -o -type f \( -name '*-report.json' -o -name '*.log' -o -name '*.out' -o -name '*.prof' -o -name '*-report.xml' \) -print | xargs sudo tar -czf /tmp/reports.tar.gz
|
|
tar -xzf /tmp/reports.tar.gz -C $reportsPath
|
|
mv /tmp/reports/otel-trace*.jsonl $reportsPath/
|
|
sudo chown -R $(id -u):$(id -g) $reportsPath
|
|
tree -nh $reportsPath
|
|
-
|
|
name: Send to Codecov
|
|
uses: codecov/codecov-action@v4
|
|
with:
|
|
directory: ./bundles/test-integration
|
|
env_vars: RUNNER_OS
|
|
flags: integration,${{ matrix.mode }}
|
|
token: ${{ secrets.CODECOV_TOKEN }} # used to upload coverage reports: https://github.com/moby/buildkit/pull/4660#issue-2142122533
|
|
-
|
|
name: Test daemon logs
|
|
if: always()
|
|
run: |
|
|
cat bundles/test-integration/docker.log
|
|
-
|
|
name: Upload reports
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: test-reports-integration-${{ inputs.storage }}-${{ env.TESTREPORTS_NAME }}
|
|
path: /tmp/reports/*
|
|
retention-days: 1
|
|
|
|
integration-report:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 10
|
|
continue-on-error: ${{ github.event_name != 'pull_request' }}
|
|
if: always()
|
|
needs:
|
|
- integration
|
|
steps:
|
|
-
|
|
name: Set up Go
|
|
uses: actions/setup-go@v6
|
|
with:
|
|
go-version: ${{ env.GO_VERSION }}
|
|
cache: false
|
|
-
|
|
name: Download reports
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
path: /tmp/reports
|
|
pattern: test-reports-integration-${{ inputs.storage }}-*
|
|
merge-multiple: true
|
|
-
|
|
name: Install teststat
|
|
run: |
|
|
go install github.com/vearutop/teststat@${{ env.TESTSTAT_VERSION }}
|
|
-
|
|
name: Create summary
|
|
run: |
|
|
find /tmp/reports -type f -name '*-go-test-report.json' -exec teststat -markdown {} \+ >> $GITHUB_STEP_SUMMARY
|
|
|
|
integration-cli-prepare:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 120 # guardrails timeout for the whole job
|
|
continue-on-error: ${{ github.event_name != 'pull_request' }}
|
|
outputs:
|
|
matrix: ${{ steps.set.outputs.matrix }}
|
|
steps:
|
|
-
|
|
name: Checkout
|
|
uses: actions/checkout@v4
|
|
-
|
|
name: Set up Go
|
|
uses: actions/setup-go@v6
|
|
with:
|
|
go-version: ${{ env.GO_VERSION }}
|
|
cache: false
|
|
-
|
|
name: Install gotestlist
|
|
run:
|
|
go install github.com/crazy-max/gotestlist/cmd/gotestlist@${{ env.GOTESTLIST_VERSION }}
|
|
-
|
|
name: Create test matrix
|
|
id: tests
|
|
working-directory: ./integration-cli
|
|
run: |
|
|
# This step creates a matrix for integration-cli tests. Tests suites
|
|
# are distributed in integration-cli job through a matrix. There is
|
|
# also overrides being added to the matrix like "./..." to run
|
|
# "Test integration" step exclusively and specific tests suites that
|
|
# take a long time to run.
|
|
matrix="$(gotestlist -d ${{ env.ITG_CLI_MATRIX_SIZE }} -o "./..." -o "DockerSwarmSuite" -o "DockerNetworkSuite|DockerExternalVolumeSuite" ./...)"
|
|
echo "matrix=$matrix" >> $GITHUB_OUTPUT
|
|
-
|
|
name: Create gha matrix
|
|
id: set
|
|
uses: actions/github-script@v7
|
|
with:
|
|
script: |
|
|
let matrix = {
|
|
test: ${{ steps.tests.outputs.matrix }},
|
|
include: [],
|
|
};
|
|
// For some reasons, GHA doesn't combine a dynamically defined
|
|
// 'include' with other matrix variables that aren't part of the
|
|
// include items.
|
|
// Moreover, since the goal is to run only relevant tests with
|
|
// firewalld/nftables enabled to minimize the number of CI jobs, we
|
|
// statically define the list of test suites that we want to run.
|
|
if ("${{ inputs.storage }}" == "snapshotter") {
|
|
matrix.include.push({
|
|
'mode': 'iptables+firewalld',
|
|
'test': 'DockerCLINetworkSuite|DockerCLIPortSuite|DockerDaemonSuite'
|
|
});
|
|
matrix.include.push({
|
|
'mode': 'iptables+firewalld',
|
|
'test': 'DockerSwarmSuite'
|
|
});
|
|
matrix.include.push({
|
|
'mode': 'iptables+firewalld',
|
|
'test': 'DockerNetworkSuite'
|
|
});
|
|
matrix.include.push({
|
|
'mode': 'nftables',
|
|
'test': 'DockerCLINetworkSuite|DockerCLIPortSuite|DockerDaemonSuite'
|
|
});
|
|
matrix.include.push({
|
|
'mode': 'nftables',
|
|
'test': 'DockerSwarmSuite'
|
|
});
|
|
matrix.include.push({
|
|
'mode': 'nftables',
|
|
'test': 'DockerNetworkSuite'
|
|
});
|
|
matrix.include.push({
|
|
'mode': 'nftables+firewalld',
|
|
'test': 'DockerCLINetworkSuite|DockerCLIPortSuite|DockerDaemonSuite'
|
|
});
|
|
matrix.include.push({
|
|
'mode': 'nftables+firewalld',
|
|
'test': 'DockerSwarmSuite'
|
|
});
|
|
matrix.include.push({
|
|
'mode': 'nftables+firewalld',
|
|
'test': 'DockerNetworkSuite'
|
|
});
|
|
}
|
|
await core.group(`Set matrix`, async () => {
|
|
core.info(`matrix: ${JSON.stringify(matrix)}`);
|
|
core.setOutput('matrix', JSON.stringify(matrix));
|
|
});
|
|
-
|
|
name: Show final gha matrix
|
|
run: |
|
|
echo ${{ steps.set.outputs.matrix }}
|
|
|
|
integration-cli:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 120 # guardrails timeout for the whole job
|
|
continue-on-error: ${{ github.event_name != 'pull_request' }}
|
|
needs:
|
|
- integration-cli-prepare
|
|
strategy:
|
|
fail-fast: false
|
|
matrix: ${{ fromJson(needs.integration-cli-prepare.outputs.matrix) }}
|
|
steps:
|
|
-
|
|
name: Checkout
|
|
uses: actions/checkout@v4
|
|
-
|
|
name: Set up runner
|
|
uses: ./.github/actions/setup-runner
|
|
-
|
|
name: Set up tracing
|
|
uses: ./.github/actions/setup-tracing
|
|
-
|
|
name: Prepare
|
|
run: |
|
|
CACHE_DEV_SCOPE=dev
|
|
if [[ "${{ matrix.mode }}" == *"firewalld"* ]]; then
|
|
echo "FIREWALLD=true" >> $GITHUB_ENV
|
|
CACHE_DEV_SCOPE="${CACHE_DEV_SCOPE}firewalld"
|
|
fi
|
|
if [[ "${{ matrix.mode }}" == *"nftables"* ]]; then
|
|
echo "DOCKER_FIREWALL_BACKEND=nftables" >> $GITHUB_ENV
|
|
fi
|
|
echo "CACHE_DEV_SCOPE=${CACHE_DEV_SCOPE}" >> $GITHUB_ENV
|
|
-
|
|
name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
with:
|
|
version: ${{ env.SETUP_BUILDX_VERSION }}
|
|
driver-opts: image=${{ env.SETUP_BUILDKIT_IMAGE }}
|
|
buildkitd-flags: --debug
|
|
-
|
|
name: Build dev image
|
|
uses: docker/bake-action@v6
|
|
with:
|
|
targets: dev
|
|
set: |
|
|
dev.cache-from=type=gha,scope=dev
|
|
-
|
|
name: Test
|
|
run: |
|
|
make -o build test-integration
|
|
env:
|
|
TEST_SKIP_INTEGRATION: 1
|
|
TESTCOVERAGE: 1
|
|
TESTFLAGS: "-test.run (${{ matrix.test }})/"
|
|
-
|
|
name: Prepare reports
|
|
if: always()
|
|
run: |
|
|
reportsName=$(echo -n "${{ matrix.test }}" | sha256sum | cut -d " " -f 1)
|
|
reportsPath=/tmp/reports/$reportsName
|
|
echo "TESTREPORTS_NAME=$reportsName" >> $GITHUB_ENV
|
|
|
|
docker stop otelcol
|
|
mkdir -p bundles $reportsPath
|
|
echo "${{ matrix.test }}" | tr -s '|' '\n' | tee -a "$reportsPath/tests.txt"
|
|
find bundles -path '*/root/*overlay2' -prune -o -type f \( -name '*-report.json' -o -name '*.log' -o -name '*.out' -o -name '*.prof' -o -name '*-report.xml' \) -print | xargs sudo tar -czf /tmp/reports.tar.gz
|
|
tar -xzf /tmp/reports.tar.gz -C $reportsPath
|
|
mv /tmp/reports/otel-trace*.jsonl $reportsPath/
|
|
sudo chown -R $(id -u):$(id -g) $reportsPath
|
|
tree -nh $reportsPath
|
|
-
|
|
name: Send to Codecov
|
|
uses: codecov/codecov-action@v4
|
|
with:
|
|
directory: ./bundles/test-integration
|
|
env_vars: RUNNER_OS
|
|
flags: integration-cli
|
|
token: ${{ secrets.CODECOV_TOKEN }} # used to upload coverage reports: https://github.com/moby/buildkit/pull/4660#issue-2142122533
|
|
-
|
|
name: Test daemon logs
|
|
if: always()
|
|
run: |
|
|
cat bundles/test-integration/docker.log
|
|
-
|
|
name: Upload reports
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: test-reports-integration-cli-${{ inputs.storage }}-${{ matrix.mode }}-${{ env.TESTREPORTS_NAME }}
|
|
path: /tmp/reports/*
|
|
retention-days: 1
|
|
|
|
integration-cli-report:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 10
|
|
continue-on-error: ${{ github.event_name != 'pull_request' }}
|
|
if: always()
|
|
needs:
|
|
- integration-cli
|
|
steps:
|
|
-
|
|
name: Set up Go
|
|
uses: actions/setup-go@v6
|
|
with:
|
|
go-version: ${{ env.GO_VERSION }}
|
|
cache: false
|
|
-
|
|
name: Download reports
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
path: /tmp/reports
|
|
pattern: test-reports-integration-cli-${{ inputs.storage }}-${{ matrix.mode }}-*
|
|
merge-multiple: true
|
|
-
|
|
name: Install teststat
|
|
run: |
|
|
go install github.com/vearutop/teststat@${{ env.TESTSTAT_VERSION }}
|
|
-
|
|
name: Create summary
|
|
run: |
|
|
find /tmp/reports -type f -name '*-go-test-report.json' -exec teststat -markdown {} \+ >> $GITHUB_STEP_SUMMARY
|