# reusable workflow name: .test # TODO: hide reusable workflow from the UI. Tracked in https://github.com/community/community/discussions/12025 on: workflow_call: inputs: storage: required: true type: string default: "graphdriver" env: GO_VERSION: "1.21.9" 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_SNAPSHOTTER: ${{ inputs.storage == 'snapshotter' && '1' || '' }} jobs: unit: runs-on: ubuntu-20.04 continue-on-error: ${{ github.event_name != 'pull_request' }} timeout-minutes: 120 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 - name: Build dev image uses: docker/bake-action@v4 with: targets: dev set: | dev.cache-from=type=gha,scope=dev - name: Test run: | make -o build test-unit - name: Prepare reports if: always() run: | 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: Send to Codecov uses: codecov/codecov-action@v4 with: directory: ./bundles env_vars: RUNNER_OS flags: unit token: ${{ secrets.CODECOV_TOKEN }} # used to upload coverage reports: https://github.com/moby/buildkit/pull/4660#issue-2142122533 - name: Upload reports if: always() uses: actions/upload-artifact@v4 with: name: test-reports-unit-${{ inputs.storage }} path: /tmp/reports/* retention-days: 1 unit-report: runs-on: ubuntu-20.04 continue-on-error: ${{ github.event_name != 'pull_request' }} timeout-minutes: 10 if: always() needs: - unit steps: - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Download reports uses: actions/download-artifact@v4 with: name: test-reports-unit-${{ inputs.storage }} path: /tmp/reports - 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 docker-py: runs-on: ubuntu-20.04 continue-on-error: ${{ github.event_name != 'pull_request' }} timeout-minutes: 120 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 - name: Build dev image uses: docker/bake-action@v4 with: targets: dev set: | dev.cache-from=type=gha,scope=dev - name: Test run: | make -o build test-docker-py - name: Prepare reports if: always() run: | 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 curl -sSLf localhost:16686/api/traces?service=integration-test-client > /tmp/reports/jaeger-trace.json - 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-20.04 continue-on-error: ${{ github.event_name != 'pull_request' }} timeout-minutes: 120 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 - name: Build dev image uses: docker/bake-action@v4 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: runs-on: ${{ matrix.os }} continue-on-error: ${{ github.event_name != 'pull_request' }} timeout-minutes: 120 strategy: fail-fast: false matrix: os: - ubuntu-20.04 - ubuntu-22.04 mode: - "" - rootless - systemd #- rootless-systemd FIXME: https://github.com/moby/moby/issues/44084 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 echo "CACHE_DEV_SCOPE=${CACHE_DEV_SCOPE}" >> $GITHUB_ENV - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build dev image uses: docker/bake-action@v4 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 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 sudo chown -R $(id -u):$(id -g) $reportsPath tree -nh $reportsPath curl -sSLf localhost:16686/api/traces?service=integration-test-client > $reportsPath/jaeger-trace.json - 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-20.04 continue-on-error: ${{ github.event_name != 'pull_request' }} timeout-minutes: 10 if: always() needs: - integration steps: - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - 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-20.04 continue-on-error: ${{ github.event_name != 'pull_request' }} outputs: matrix: ${{ steps.tests.outputs.matrix }} steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install gotestlist run: go install github.com/crazy-max/gotestlist/cmd/gotestlist@${{ env.GOTESTLIST_VERSION }} - name: Create 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: Show matrix run: | echo ${{ steps.tests.outputs.matrix }} integration-cli: runs-on: ubuntu-20.04 continue-on-error: ${{ github.event_name != 'pull_request' }} timeout-minutes: 120 needs: - integration-cli-prepare strategy: fail-fast: false matrix: test: ${{ 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: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build dev image uses: docker/bake-action@v4 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 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 sudo chown -R $(id -u):$(id -g) $reportsPath tree -nh $reportsPath curl -sSLf localhost:16686/api/traces?service=integration-test-client > $reportsPath/jaeger-trace.json - 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 }}-${{ env.TESTREPORTS_NAME }} path: /tmp/reports/* retention-days: 1 integration-cli-report: runs-on: ubuntu-20.04 continue-on-error: ${{ github.event_name != 'pull_request' }} timeout-minutes: 10 if: always() needs: - integration-cli steps: - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Download reports uses: actions/download-artifact@v4 with: path: /tmp/reports pattern: test-reports-integration-cli-${{ 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