--- name: Build and Test using containerized environment on: push: paths-ignore: - 'docs/**' - '**/*.md' - '**/*.rst' branches: - master - '[0-9].*' pull_request: branches: - master - '[0-9].*' schedule: - cron: '0 1 * * *' # nightly build jobs: build: name: Build and Test runs-on: ubuntu-latest env: REDIS_ENV_WORK_DIR: ${{ github.workspace }}/redis-env-work REDIS_ENV_CONF_DIR: ${{ github.workspace }}/src/test/resources/env CLIENT_LIBS_IMAGE_PREFIX: "redislabs/client-libs-test" strategy: fail-fast: false matrix: redis_version: - "7.4.1" - "7.2.6" - "6.2.16" - "8.0-M01" go_version: - "1.19.x" - "1.20.x" - "1.21.x" steps: - name: Set up ${{ matrix.go_version }} uses: actions/setup-go@v5 with: go-version: ${{ matrix.go_version }} - name: Checkout code uses: actions/checkout@v4 # Set up Docker Compose environment - name: Set up Docker Compose environment run: | mkdir -m 777 $REDIS_ENV_WORK_DIR export REDIS_VERSION="${{ matrix.redis_version }}" export COMPOSE_ENV_FILES="src/test/resources/env/.env" if [[ "${{ matrix.redis_version }}" == "6.2.16" ]]; then COMPOSE_ENV_FILES+=",src/test/resources/env/.env.v${{ matrix.redis_version }}" fi docker compose -f src/test/resources/env/docker-compose.yml up -d - name: Run tests env: GO_VERSION: ${{ matrix.go_version }} run: | set -e GO_MOD_DIRS=$(find . -type d -name go.mod | xargs -n 1 dirname) for dir in $GO_MOD_DIRS; do if echo "$dir" | grep -q "./example" && [ "$GO_VERSION" = "19" ]; then echo "Skipping go test in $dir due to Go version 1.19 and dir contains ./example" continue fi echo "Running tests in $dir" ( cd "$dir" go mod tidy -compat=1.18 go test ./... -short -race go test ./... -run=NONE -bench=. -benchmem env GOOS=linux GOARCH=386 go test ./... go test -coverprofile=coverage.txt -covermode=atomic ./... go vet ) done - name: Build custom vet tool run: | cd internal/customvet && go build . go vet -vettool ./internal/customvet/customvet # Collect logs on failure - name: Collect logs on failure if: failure() # This runs only if the previous steps failed run: | echo "Collecting logs from $WORK_DIR..." ls -la $REDIS_ENV_WORK_DIR # Upload logs as artifacts - name: Upload logs on failure if: failure() uses: actions/upload-artifact@v3 with: name: redis-env-work-logs path: ${{ env.REDIS_ENV_WORK_DIR }} # Bring down the Docker Compose test environment - name: Tear down Docker Compose environment if: always() run: | docker compose $COMPOSE_ENV_FILES -f src/test/resources/env/docker-compose.yml down continue-on-error: true # Upload code coverage - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: fail_ci_if_error: false token: ${{ secrets.CODECOV_TOKEN }} - name: Upload test results to Codecov if: ${{ github.event_name == 'schedule' || (github.event_name == 'push') || github.event_name == 'workflow_dispatch'}} uses: codecov/test-results-action@v1 with: fail_ci_if_error: false files: ./target/surefire-reports/TEST* token: ${{ secrets.CODECOV_TOKEN }}