Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Run CI tests against multiple versions #246

Merged
merged 1 commit into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 81 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ jobs:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

# ------------------------------------------ Integration Tests ------------------------------------------
integration-tests:
integration-tests-latest-infrahub:
if: |
always() && !cancelled() &&
!contains(needs.*.result, 'failure') &&
Expand Down Expand Up @@ -201,8 +201,87 @@ jobs:
pip install invoke toml codecov
- name: "Install Package"
run: "poetry install --all-extras"
- name: "Set environment variables for python_testcontainers"
run: |
echo INFRAHUB_TESTING_IMAGE_VER=latest >> $GITHUB_ENV
- name: "Integration Tests"
run: "poetry run pytest --cov infrahub_sdk tests/integration/"
run: |
poetry run pytest --cov infrahub_sdk tests/integration/
- name: "Upload coverage to Codecov"
run: |
codecov --flags integration-tests
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

integration-tests-local-infrahub:
if: |
always() && !cancelled() &&
!contains(needs.*.result, 'failure') &&
!contains(needs.*.result, 'cancelled') &&
needs.files-changed.outputs.python == 'true' &&
(github.base_ref == 'stable' || github.base_ref == 'develop')
needs: ["files-changed", "yaml-lint", "python-lint"]
runs-on:
group: "huge-runners"
timeout-minutes: 30
steps:
- name: "Check out repository code"
uses: "actions/checkout@v4"

- name: "Extract target branch name"
id: extract_branch
run: echo "TARGET_BRANCH=${{ github.base_ref }}" >> $GITHUB_ENV

- name: "Checkout infrahub repository"
uses: "actions/checkout@v4"
with:
repository: "opsmill/infrahub"
path: "infrahub-server"
ref: ${{ github.base_ref }}
submodules: true

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: "Setup git credentials prior dev.build"
run: |
cd infrahub-server
git config --global user.name 'Infrahub'
git config --global user.email '[email protected]'
git config --global --add safe.directory '*'
git config --global credential.usehttppath true
git config --global credential.helper /usr/local/bin/infrahub-git-credential
- name: "Set environment variables prior dev.build"
run: |
echo "INFRAHUB_BUILD_NAME=infrahub-${{ runner.name }}" >> $GITHUB_ENV
RUNNER_NAME=$(echo "${{ runner.name }}" | grep -o 'ghrunner[0-9]\+' | sed 's/ghrunner\([0-9]\+\)/ghrunner_\1/')
echo "PYTEST_DEBUG_TEMPROOT=/var/lib/github/${RUNNER_NAME}/_temp" >> $GITHUB_ENV
echo "INFRAHUB_IMAGE_VER=local-${{ runner.name }}-${{ github.sha }}" >> $GITHUB_ENV
echo "INFRAHUB_TESTING_IMAGE_VER=local-${{ runner.name }}-${{ github.sha }}" >> $GITHUB_ENV
echo "INFRAHUB_TESTING_DOCKER_IMAGE=opsmill/infrahub" >> $GITHUB_ENV
- name: "Build container"
run: |
cd infrahub-server
inv dev.build
- name: "Setup environment"
run: |
pipx install poetry==1.8.5
poetry config virtualenvs.create true --local
pip install invoke toml codecov
- name: "Install Package"
run: "poetry install --all-extras"

- name: "Integration Tests"
run: |
echo "Running tests for version: $INFRAHUB_TESTING_IMAGE_VER"
poetry run pytest --cov infrahub_sdk tests/integration/
- name: "Upload coverage to Codecov"
run: |
codecov --flags integration-tests
Expand Down
30 changes: 30 additions & 0 deletions infrahub_sdk/testing/docker.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,40 @@
from __future__ import annotations

import os

import pytest
from infrahub_testcontainers.helpers import TestInfrahubDocker
from packaging.version import InvalidVersion, Version

from .. import Config, InfrahubClient, InfrahubClientSync

INFRAHUB_VERSION = os.getenv("INFRAHUB_TESTING_IMAGE_VER", "latest")


def skip_version(min_infrahub_version: str | None = None, max_infrahub_version: str | None = None) -> bool:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When is it that this skip_version function gets used?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Whenever a SDK test should be running prior/since a given infrahub version. We do not have such tests for now, but should have some in the future

"""
Check if a test should be skipped depending on infrahub version.
"""
try:
version = Version(INFRAHUB_VERSION)
except InvalidVersion:

Check warning on line 20 in infrahub_sdk/testing/docker.py

View check run for this annotation

Codecov / codecov/patch

infrahub_sdk/testing/docker.py#L18-L20

Added lines #L18 - L20 were not covered by tests
# We would typically end up here for development purpose while running a CI test against
# unreleased versions of infrahub, like `stable` or `develop` branch.
# For now, we consider this means we are testing against the most recent version of infrahub,
# so we skip if the test should not be ran against a maximum version.
return max_infrahub_version is None

Check warning on line 25 in infrahub_sdk/testing/docker.py

View check run for this annotation

Codecov / codecov/patch

infrahub_sdk/testing/docker.py#L25

Added line #L25 was not covered by tests

if min_infrahub_version is not None and version < Version(min_infrahub_version):
return True

Check warning on line 28 in infrahub_sdk/testing/docker.py

View check run for this annotation

Codecov / codecov/patch

infrahub_sdk/testing/docker.py#L28

Added line #L28 was not covered by tests

return max_infrahub_version is not None and version > Version(max_infrahub_version)

Check warning on line 30 in infrahub_sdk/testing/docker.py

View check run for this annotation

Codecov / codecov/patch

infrahub_sdk/testing/docker.py#L30

Added line #L30 was not covered by tests


class TestInfrahubDockerClient(TestInfrahubDocker):
@pytest.fixture(scope="class")
def infrahub_version(self) -> str:
return INFRAHUB_VERSION

@pytest.fixture(scope="class")
def client(self, infrahub_port: int) -> InfrahubClient:
return InfrahubClient(
Expand Down
4 changes: 0 additions & 4 deletions tests/integration/test_infrahub_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@


class TestInfrahubNode(TestInfrahubDockerClient, SchemaAnimal):
@pytest.fixture(scope="class")
def infrahub_version(self) -> str:
return "1.1.0"

@pytest.fixture(scope="class")
async def base_dataset(
self,
Expand Down
4 changes: 0 additions & 4 deletions tests/integration/test_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@


class TestInfrahubNode(TestInfrahubDockerClient, SchemaCarPerson):
@pytest.fixture(scope="class")
def infrahub_version(self) -> str:
return "1.1.0"

@pytest.fixture(scope="class")
async def initial_schema(self, default_branch: str, client: InfrahubClient, schema_base: SchemaRoot) -> None:
await client.schema.wait_until_converged(branch=default_branch)
Expand Down
6 changes: 0 additions & 6 deletions tests/integration/test_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

from typing import TYPE_CHECKING

import pytest

from infrahub_sdk.testing.docker import TestInfrahubDockerClient
from infrahub_sdk.testing.repository import GitRepo
from infrahub_sdk.utils import get_fixtures_dir
Expand All @@ -13,10 +11,6 @@


class TestInfrahubRepository(TestInfrahubDockerClient):
@pytest.fixture(scope="class")
def infrahub_version(self) -> str:
return "1.1.0"

async def test_add_repository(self, client: InfrahubClient, remote_repos_dir):
src_directory = get_fixtures_dir() / "integration/mock_repo"
repo = GitRepo(name="mock_repo", src_directory=src_directory, dst_directory=remote_repos_dir)
Expand Down
Loading