redis/.github/workflows/test-on-docker.yml

121 lines
4.3 KiB
YAML

---
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 }}