From 2e04be3fb92085d49854cc680a2b686ff726dd15 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Sat, 27 Aug 2022 15:05:22 +0200 Subject: [PATCH] ci: gha test workflow for integration and unit test Signed-off-by: CrazyMax --- .github/actions/setup-runner/action.yml | 27 +++ .github/workflows/test.yml | 268 ++++++++++++++++++++++++ Makefile | 10 +- docker-bake.hcl | 21 ++ 4 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 .github/actions/setup-runner/action.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/actions/setup-runner/action.yml b/.github/actions/setup-runner/action.yml new file mode 100644 index 0000000000..d9e5211c23 --- /dev/null +++ b/.github/actions/setup-runner/action.yml @@ -0,0 +1,27 @@ +name: 'Setup Runner' +description: 'Composite action to set up the GitHub Runner for jobs in the test.yml workflow' + +runs: + using: composite + steps: + - run: | + sudo modprobe ip_vs + sudo modprobe ipv6 + sudo modprobe ip6table_filter + sudo modprobe -r overlay + sudo modprobe overlay redirect_dir=off + shell: bash + - run: | + if [ ! -e /etc/docker/daemon.json ]; then + echo '{}' | tee /etc/docker/daemon.json >/dev/null + fi + DOCKERD_CONFIG=$(jq '.+{"experimental":true,"live-restore":true,"ipv6":true,"fixed-cidr-v6":"2001:db8:1::/64"}' /etc/docker/daemon.json) + sudo tee /etc/docker/daemon.json <<<"$DOCKERD_CONFIG" >/dev/null + sudo service docker restart + shell: bash + - run: | + ./contrib/check-config.sh || true + shell: bash + - run: | + docker info + shell: bash diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000..e6408a3719 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,268 @@ +name: test + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: + workflow_dispatch: + push: + branches: + - 'master' + - '[0-9]+.[0-9]{2}' + tags: + - 'v*' + pull_request: + +env: + GO_VERSION: 1.19.1 + GOTESTLIST_VERSION: v0.2.0 + ITG_CLI_MATRIX_SIZE: 6 + BUILDX: docker buildx + USE_BUILDX: 1 + DOCKER_EXPERIMENTAL: 1 + DOCKER_GRAPHDRIVER: overlay2 + +jobs: + build-dev: + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + matrix: + mode: + - "" + - systemd + steps: + - + name: Prepare + run: | + if [ "${{ matrix.mode }}" = "systemd" ]; then + echo "SYSTEMD=true" >> $GITHUB_ENV + fi + - + name: Checkout + uses: actions/checkout@v3 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build dev image + uses: docker/bake-action@v2 + with: + targets: dev + set: | + *.cache-from=type=gha,scope=dev${{ matrix.mode }} + *.cache-to=type=gha,scope=dev${{ matrix.mode }},mode=max + *.output=type=cacheonly + + unit: + runs-on: ubuntu-20.04 + needs: + - build-dev + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Set up runner + uses: ./.github/actions/setup-runner + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build dev image + uses: docker/bake-action@v2 + with: + targets: dev + set: | + dev.cache-from=type=gha,scope=dev + - + name: Test + run: | + make -o build test-unit + + docker-py: + runs-on: ubuntu-20.04 + needs: + - build-dev + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Set up runner + uses: ./.github/actions/setup-runner + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build dev image + uses: docker/bake-action@v2 + with: + targets: dev + set: | + dev.cache-from=type=gha,scope=dev + - + name: Test + run: | + make -o build test-docker-py + - + name: Test daemon logs + if: always() + run: | + cat bundles/test-docker-py/docker.log + + integration-flaky: + runs-on: ubuntu-20.04 + needs: + - build-dev + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Set up runner + uses: ./.github/actions/setup-runner + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build dev image + uses: docker/bake-action@v2 + 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 }} + needs: + - build-dev + 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@v3 + - + name: Set up runner + uses: ./.github/actions/setup-runner + - + 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@v2 + - + name: Build dev image + uses: docker/bake-action@v2 + 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 + - + name: Test daemon logs + if: always() + run: | + cat bundles/test-integration/docker.log + + integration-cli-prepare: + runs-on: ubuntu-20.04 + outputs: + matrix: ${{ steps.tests.outputs.matrix }} + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Set up Go + uses: actions/setup-go@v3 + 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: | + # Distribute integration-cli tests for the matrix in integration-test job. + # Also prepend ./... to the matrix. This is a special case to run "Test integration" step exclusively. + matrix="$(gotestlist -d ${{ env.ITG_CLI_MATRIX_SIZE }} ./...)" + matrix="$(echo "$matrix" | jq -c '. |= ["./..."] + .')" + echo "::set-output name=matrix::$matrix" + - + name: Show matrix + run: | + echo ${{ steps.tests.outputs.matrix }} + + integration-cli: + runs-on: ubuntu-20.04 + needs: + - build-dev + - integration-cli-prepare + strategy: + fail-fast: false + matrix: + test: ${{ fromJson(needs.integration-cli-prepare.outputs.matrix) }} + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Set up runner + uses: ./.github/actions/setup-runner + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build dev image + uses: docker/bake-action@v2 + with: + targets: dev + set: | + dev.cache-from=type=gha,scope=dev + - + name: Test + run: | + make -o build test-integration + env: + TEST_SKIP_INTEGRATION: 1 + TESTFLAGS: "-test.run (${{ matrix.test }})/" + - + name: Test daemon logs + if: always() + run: | + cat bundles/test-integration/docker.log diff --git a/Makefile b/Makefile index 4d21efe28f..ddad782563 100644 --- a/Makefile +++ b/Makefile @@ -118,7 +118,7 @@ DOCKER_IMAGE := docker-dev DOCKER_PORT_FORWARD := $(if $(DOCKER_PORT),-p "$(DOCKER_PORT)",) DELVE_PORT_FORWARD := $(if $(DELVE_PORT),-p "$(DELVE_PORT)",) -DOCKER_FLAGS := $(DOCKER) run --rm -i --privileged $(DOCKER_CONTAINER_NAME) $(DOCKER_ENVS) $(DOCKER_MOUNT) $(DOCKER_PORT_FORWARD) $(DELVE_PORT_FORWARD) +DOCKER_FLAGS := $(DOCKER) run --rm --privileged $(DOCKER_CONTAINER_NAME) $(DOCKER_ENVS) $(DOCKER_MOUNT) $(DOCKER_PORT_FORWARD) $(DELVE_PORT_FORWARD) BUILD_APT_MIRROR := $(if $(DOCKER_BUILD_APT_MIRROR),--build-arg APT_MIRROR=$(DOCKER_BUILD_APT_MIRROR)) export BUILD_APT_MIRROR @@ -137,6 +137,14 @@ ifeq ($(INTERACTIVE), 1) DOCKER_FLAGS += -t endif +# on GitHub Runners input device is not a TTY but we allocate a pseudo-one, +# otherwise keep STDIN open even if not attached if not a GitHub Runner. +ifeq ($(GITHUB_ACTIONS),true) + DOCKER_FLAGS += -t +else + DOCKER_FLAGS += -i +endif + DOCKER_RUN_DOCKER := $(DOCKER_FLAGS) "$(DOCKER_IMAGE)" DOCKER_BUILD_ARGS += --build-arg=GO_VERSION diff --git a/docker-bake.hcl b/docker-bake.hcl index e05fbec4cf..42aebeff4f 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -35,3 +35,24 @@ target "cross" { } target = "cross" } + +# +# dev +# + +variable "DEV_IMAGE" { + default = "docker-dev" +} +variable "SYSTEMD" { + default = "false" +} + +target "dev" { + inherits = ["_common"] + target = "final" + args = { + SYSTEMD = SYSTEMD + } + tags = [DEV_IMAGE] + output = ["type=docker"] +}