Repository: feast-dev/feast

Issue:
Add cross-environment testing to GitHub Actions
Instead of just testing `python:3.7`, we should test
* Multiple operating systems
* Multiple versions of Python

https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on


Discussion:

Resolving patch:
diff --git a/sdk/python/setup.py b/sdk/python/setup.py
--- a/sdk/python/setup.py
+++ b/sdk/python/setup.py
@@ -43,15 +43,14 @@
     "fastavro>=0.22.11,<0.23",
     "google-api-core>=1.23.0",
     "googleapis-common-protos==1.52.*",
-    "grpcio>=1.32.0",
+    "grpcio>=1.34.0",
     "Jinja2>=2.0.0",
     "jsonschema",
     "mmh3",
-    "numpy<1.20.0",
-    "pandas~=1.0.0",
+    "pandas>=1.0.0",
     "pandavro==1.5.*",
     "protobuf>=3.10",
-    "pyarrow==2.0.0",
+    "pyarrow>=2.0.0",
     "pydantic>=1.0.0",
     "PyYAML==5.3.*",
     "tabulate==0.8.*",
@@ -72,8 +71,8 @@
     "flake8",
     "black==19.10b0",
     "isort>=5",
-    "grpcio-tools>=1.32.0",
-    "grpcio-testing>=1.32.0",
+    "grpcio-tools==1.34.0",
+    "grpcio-testing==1.34.0",
     "mock==2.0.0",
     "moto",
     "mypy==0.790",
@@ -205,7 +204,7 @@ def run(self):
     ],
     entry_points={"console_scripts": ["feast=feast.cli:cli"]},
     use_scm_version={"root": "../..", "relative_to": __file__, "tag_regex": TAG_REGEX},
-    setup_requires=["setuptools_scm", "grpcio", "grpcio-tools>=1.32.0", "mypy-protobuf", "sphinx"],
+    setup_requires=["setuptools_scm", "grpcio", "grpcio-tools==1.34.0", "mypy-protobuf", "sphinx"],
     package_data={
         "": [
             "protos/feast/**/*.proto",


Test patch:
diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml
--- a/.github/workflows/integration_tests.yml
+++ b/.github/workflows/integration_tests.yml
@@ -7,10 +7,19 @@ on:
 
 jobs:
   integration-test-python:
-    runs-on: ubuntu-latest
-    container: python:3.7
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        python-version: [ 3.7, 3.8, 3.9 ]
+        os: [ ubuntu-latest, macOS-latest ]
     steps:
       - uses: actions/checkout@v2
+      - name: Setup Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: ${{ matrix.python-version }}
+          architecture: x64
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@master
         with:
diff --git a/.github/workflows/pr_integration_tests.yml b/.github/workflows/pr_integration_tests.yml
--- a/.github/workflows/pr_integration_tests.yml
+++ b/.github/workflows/pr_integration_tests.yml
@@ -12,8 +12,12 @@ jobs:
     # all jobs MUST have this if check for 'ok-to-test' or 'approved' for security purposes.
     if: (github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'ok-to-test'))
       || (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved')))
-    runs-on: ubuntu-latest
-    container: python:3.7
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        python-version: [ 3.7, 3.8, 3.9 ]
+        os: [ ubuntu-latest, macOS-latest ]
     services:
       redis:
         image: redis
@@ -30,6 +34,11 @@ jobs:
           # code from the PR.
           ref: refs/pull/${{ github.event.pull_request.number }}/merge
           submodules: recursive
+      - name: Setup Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: ${{ matrix.python-version }}
+          architecture: x64
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@master
         with:
diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml
--- a/.github/workflows/unit_tests.yml
+++ b/.github/workflows/unit_tests.yml
@@ -1,13 +1,21 @@
 name: unit-tests
 
 on: [push, pull_request]
-
 jobs:
   unit-test-python:
-    runs-on: ubuntu-latest
-    container: python:3.7
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        python-version: [ 3.7, 3.8, 3.9 ]
+        os: [ ubuntu-latest, macOS-latest]
     steps:
       - uses: actions/checkout@v2
+      - name: Setup Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: ${{ matrix.python-version }}
+          architecture: x64
       - name: Install dependencies
         run: make install-python-ci-dependencies
       - name: Test Python