Initial uv migration #573
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- | |
| # yamllint disable rule:truthy rule:truthy rule:line-length | |
| name: "CI" | |
| on: | |
| pull_request: | |
| push: | |
| branches: | |
| - develop | |
| - stable | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| INFRAHUB_DB_USERNAME: neo4j | |
| INFRAHUB_DB_PASSWORD: admin | |
| INFRAHUB_DB_ADDRESS: localhost | |
| INFRAHUB_DB_PORT: 7687 | |
| INFRAHUB_DB_PROTOCOL: bolt | |
| INFRAHUB_BROKER_ADDRESS: message-queue | |
| INFRAHUB_LOG_LEVEL: CRITICAL | |
| INFRAHUB_IMAGE_NAME: "opsmill/infrahub" | |
| INFRAHUB_IMAGE_VER: "local" | |
| PYTEST_XDIST_WORKER_COUNT: 4 | |
| INFRAHUB_TEST_IN_DOCKER: 1 | |
| VALE_VERSION: "3.0.7" | |
| GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }} | |
| METRICS_ENDPOINT: ${{ secrets.METRICS_ENDPOINT }} | |
| jobs: | |
| # ------------------------------------------ Check Files Changes ------------------------------------------ | |
| files-changed: | |
| name: Detect which file has changed | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 5 | |
| outputs: | |
| documentation: ${{ steps.changes.outputs.documentation_all }} | |
| helm: ${{ steps.changes.outputs.helm_all }} | |
| python: ${{ steps.changes.outputs.python_all }} | |
| yaml: ${{ steps.changes.outputs.yaml_all }} | |
| uv_files: ${{ steps.changes.outputs.uv_files }} | |
| github_workflows: ${{ steps.changes.outputs.github_workflows }} | |
| steps: | |
| - name: "Check out repository code" | |
| uses: "actions/checkout@v4" | |
| - name: Check for file changes | |
| uses: dorny/paths-filter@v3 | |
| id: changes | |
| with: | |
| token: ${{ github.token }} | |
| filters: .github/file-filters.yml | |
| # ------------------------------------------ All Linter ------------------------------------------ | |
| yaml-lint: | |
| if: needs.files-changed.outputs.yaml == 'true' | |
| needs: ["files-changed"] | |
| runs-on: "ubuntu-latest" | |
| timeout-minutes: 5 | |
| steps: | |
| - name: "Check out repository code" | |
| uses: "actions/checkout@v4" | |
| - name: "Setup environment" | |
| run: "pip install yamllint==1.35.1" | |
| - name: "Linting: yamllint" | |
| run: "yamllint -s ." | |
| python-lint: | |
| if: needs.files-changed.outputs.python == 'true' | |
| needs: ["files-changed"] | |
| runs-on: "ubuntu-latest" | |
| timeout-minutes: 5 | |
| steps: | |
| - name: "Check out repository code" | |
| uses: "actions/checkout@v4" | |
| - name: "Setup environment" | |
| run: "pip install ruff==0.8.6" | |
| - name: "Linting: ruff check" | |
| run: "ruff check ." | |
| - name: "Linting: ruff format" | |
| run: "ruff format --check --diff ." | |
| markdown-lint: | |
| if: needs.files-changed.outputs.documentation == 'true' | |
| needs: ["files-changed"] | |
| runs-on: "ubuntu-latest" | |
| timeout-minutes: 5 | |
| steps: | |
| - name: "Check out repository code" | |
| uses: "actions/checkout@v4" | |
| - name: "Linting: markdownlint" | |
| uses: DavidAnson/markdownlint-cli2-action@v19 | |
| with: | |
| config: .markdownlint.yaml | |
| globs: | | |
| **/*.{md,mdx} | |
| !changelog/*.md | |
| action-lint: | |
| if: needs.files-changed.outputs.github_workflows == 'true' | |
| needs: ["files-changed"] | |
| runs-on: "ubuntu-latest" | |
| timeout-minutes: 5 | |
| steps: | |
| - name: "Check out repository code" | |
| uses: "actions/checkout@v4" | |
| - name: Check workflow files | |
| run: | | |
| bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) | |
| ./actionlint -color | |
| shell: bash | |
| env: | |
| SHELLCHECK_OPTS: --exclude=SC2086 --exclude=SC2046 --exclude=SC2004 --exclude=SC2129 | |
| unit-tests: | |
| env: | |
| # workaround for Rich table column width | |
| COLUMNS: 140 | |
| strategy: | |
| matrix: | |
| python-version: | |
| - "3.9" | |
| - "3.10" | |
| - "3.11" | |
| - "3.12" | |
| - "3.13" | |
| if: | | |
| always() && !cancelled() && | |
| !contains(needs.*.result, 'failure') && | |
| !contains(needs.*.result, 'cancelled') && | |
| needs.files-changed.outputs.python == 'true' | |
| needs: ["files-changed", "yaml-lint", "python-lint"] | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - name: "Check out repository code" | |
| uses: "actions/checkout@v4" | |
| - name: "Set up Python ${{ matrix.python-version }}" | |
| uses: "actions/setup-python@v5" | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: "Setup environment" | |
| run: | | |
| pipx install uv | |
| uv venv | |
| uv pip install invoke toml codecov | |
| - name: "Install Package" | |
| run: "uv pip install --all-extras ." | |
| - name: "Mypy Tests" | |
| run: "uv venv run mypy --show-error-codes infrahub_sdk/" | |
| - name: "Unit Tests" | |
| run: "uv venv run pytest --cov infrahub_sdk tests/unit/" | |
| - name: "Upload coverage to Codecov" | |
| run: | | |
| uv venv run codecov --flags python-${{ matrix.python-version }} | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| # The pytest-cov plugin doesn't quite work with content that is | |
| # auto-imported by our own infrahub pytest plugin, this workaround | |
| # reports the missing lines | |
| - name: "Report coverage for pytest-plugin" | |
| if: matrix.python-version == '3.12' | |
| run: | | |
| uv venv run coverage run --source=infrahub_sdk -m pytest tests/unit/pytest_plugin | |
| uv venv run coverage report -m | |
| uv venv run coverage xml | |
| uv venv run codecov --flags python-filler-${{ matrix.python-version }} | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| # ------------------------------------------ Integration Tests ------------------------------------------ | |
| integration-tests: | |
| if: | | |
| always() && !cancelled() && | |
| !contains(needs.*.result, 'failure') && | |
| !contains(needs.*.result, 'cancelled') && | |
| needs.files-changed.outputs.python == 'true' | |
| 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: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.12" | |
| - name: "Set environment variables" | |
| run: | | |
| 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 | |
| - name: "Setup environment" | |
| run: | | |
| pipx install uv | |
| uv venv | |
| uv pip install invoke toml codecov | |
| - name: "Install Package" | |
| run: "uv pip install --all-extras ." | |
| - name: "Integration Tests" | |
| run: "uv venv run pytest --cov infrahub_sdk tests/integration/" | |
| - name: "Upload coverage to Codecov" | |
| run: | | |
| uv venv run codecov --flags integration-tests | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} |