Skip to content

Commit

Permalink
Use nox for our GitHub Actions workflows (#872)
Browse files Browse the repository at this point in the history
Co-authored-by: Chuck Daniels <chuck@developmentseed.org>
  • Loading branch information
jhkennedy and chuckwondo authored Nov 7, 2024
1 parent 50bf0b9 commit d4f24df
Show file tree
Hide file tree
Showing 9 changed files with 102 additions and 88 deletions.
24 changes: 0 additions & 24 deletions .github/actions/install-pkg/action.yml

This file was deleted.

13 changes: 9 additions & 4 deletions .github/workflows/integration-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,16 +94,21 @@ jobs:
# this point.
ref: ${{ github.event.pull_request.head.sha }}

- name: Install package with dependencies
uses: ./.github/actions/install-pkg
- name: Install uv
uses: astral-sh/setup-uv@v3.2.2
with:
python-version: ${{ matrix.python-version }}
enable-cache: true

- name: Setup nox
uses: wntrblm/nox@2024.10.09
with:
python-versions: ${{ matrix.python-version }}

- name: Run integration tests
env:
EARTHDATA_USERNAME: ${{ secrets.EDL_USERNAME }}
EARTHDATA_PASSWORD: ${{ secrets.EDL_PASSWORD }}
run: ./scripts/integration-test.sh
run: nox -s integration-tests -- --cov=earthaccess --cov-report=term-missing --capture=no --tb=native --log-cli-level=INFO

- name: Upload coverage report
# Don't upload coverage when using the `act` tool to run the workflow locally
Expand Down
17 changes: 5 additions & 12 deletions .github/workflows/test-mindeps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,17 @@ jobs:
uses: actions/checkout@v4.1.1

- name: Install uv
uses: astral-sh/setup-uv@v3
uses: astral-sh/setup-uv@v3.2.2
with:
version: "0.4.7"
enable-cache: true

- name: Set up Python
uses: actions/setup-python@v5
- name: Setup nox
uses: wntrblm/nox@2024.10.09
with:
python-version: 3.9

- name: Install minimum-compatible dependencies
run: uv sync --resolution lowest-direct --extra test

- name: Install earthaccess
run: uv pip install --no-deps .
python-versions: 3.9

- name: Test
run: uv run pytest tests/unit --cov=earthaccess --cov=tests --cov-report=term-missing --capture=no --tb=native --log-cli-level=INFO
run: nox -s test-min-deps -- --verbose --cov=earthaccess --cov-report=term-missing --capture=no --tb=native --log-cli-level=INFO

- name: Upload coverage
# Don't upload coverage when using the `act` tool to run the workflow locally
Expand Down
14 changes: 10 additions & 4 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,21 @@ jobs:
- name: Checkout sources
uses: actions/checkout@v4

- uses: ./.github/actions/install-pkg
- name: Install uv
uses: astral-sh/setup-uv@v3.2.2
with:
python-version: ${{ matrix.python-version }}
enable-cache: true

- name: Setup nox
uses: wntrblm/nox@2024.10.09
with:
python-versions: ${{ matrix.python-version }}

- name: Typecheck
run: mypy
run: nox -s typecheck

- name: Test
run: pytest tests/unit --verbose --cov=earthaccess --cov-report=term-missing --capture=no --tb=native --log-cli-level=INFO
run: nox -s tests -- --verbose --cov=earthaccess --cov-report=term-missing --capture=no --tb=native --log-cli-level=INFO

- name: Upload coverage
# Don't upload coverage when using the `act` tool to run the workflow locally
Expand Down
17 changes: 9 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,6 @@ and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html)

## [Unreleased]

- Fix `earthaccess.download` to not ignore errors by default
([#581](https://github.com/nsidc/earthaccess/issues/581))
([**@Sherwin-14**](https://github.com/Sherwin-14),
[**@chuckwondo**](https://github.com/chuckwondo),
[**@mfisher87**](https://github.com/mfisher87))

### Changed

- Use built-in `assert` statements instead of `unittest` assertions in
Expand All @@ -25,16 +19,23 @@ and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
location ([#480](https://github.com/nsidc/earthaccess/issues/480))
([@chuckwondo](https://github.com/chuckwondo))
- Add `nox` session for running integration tests locally
([#815](https://github.com/nsidc/earthaccess/issues/815)) ([@chuckwondo](https://github.com/chuckwondo))
([#815](https://github.com/nsidc/earthaccess/issues/815); [@chuckwondo](https://github.com/chuckwondo) and ([#872](https://github.com/nsidc/earthaccess/issues/872); [@jhkennedy](https://github.com/jhkennedy))
- Auto-add comment to PR that requires maintainer to review and re-run
integration tests ([#824](https://github.com/nsidc/earthaccess/issues/824))
([@chuckwondo](https://github.com/chuckwondo))

### Removed

### Fixed
- The `scripts/integration-test.sh` script has been removed in favor of the `integration-tests` nox session.
([#872](https://github.com/nsidc/earthaccess/issues/872)) ([@jhkennedy](https://github.com/jhkennedy))

### Fixed

- `earthaccess.download` will not ignore errors by default
([#581](https://github.com/nsidc/earthaccess/issues/581))
([**@Sherwin-14**](https://github.com/Sherwin-14),
[**@chuckwondo**](https://github.com/chuckwondo),
[**@mfisher87**](https://github.com/mfisher87))
- Integration tests no longer clobber existing `.netrc` file
([#806](https://github.com/nsidc/earthaccess/issues/806))
(@chuckwondo)
Expand Down
51 changes: 36 additions & 15 deletions docs/contributing/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,49 @@ If you don't have pipx (pip for applications), then you can install with
pip is reasonable). If you use macOS, then pipx and nox are both in brew, use
`brew install pipx nox`.

To use, run `nox` without any arguments. This will run type checks and unit
tests using the installed version of Python on your system.
To use, run `nox` without any arguments. This will run the type check and unit
test "sessions" (tasks) using your local (and active) Python version.
Nox handles everything for you, including setting up a temporary virtual
environment for each run.

You can see all available sessions with `nox --list`:

```
$ nox --list
Sessions defined in earthaccess/noxfile.py:
* typecheck -> Typecheck with mypy.
* tests -> Run the unit tests.
- test-min-deps -> Run the unit tests using the lowest compatible version of all direct dependencies.
- integration-tests -> Run the integration tests.
- build-pkg -> Build a source distribution and binary distribution (wheel).
- serve-docs -> Build the documentation and serve it.
sessions marked with * are selected, sessions marked with - are skipped.
```

You can also run individual tasks (_sessions_ in `nox` parlance, hence the `-s`
option below), like so:

```console
nox -s typecheck # Run typechecks
nox -s tests # Run unit tests
nox -s integration-tests # Run integration tests (see note below)
nox -s serve_docs # Build and serve the docs
nox -s build_pkg # Build an SDist and Wheel
```bash
nox -s integration-tests
```

Nox handles everything for you, including setting up a temporary virtual
environment for each run.
and pass options to the underlying session like:

```bash
nox -s integration-tests -- [ARGS]
```

!!! tip

In order to run integration tests locally, you must set the
environment variables `EARTHDATA_USERNAME` and `EARTHDATA_PASSWORD` to your
username and password, respectively, of your
[NASA Earthdata](https://urs.earthdata.nasa.gov/) account (registration is
free).


**NOTE:** In order to run integration tests locally, you must set the
environment variables `EARTHDATA_USERNAME` and `EARTHDATA_PASSWORD` to your
username and password, respectively, of your
[NASA Earthdata](https://urs.earthdata.nasa.gov/) account (registration is
free).

## Manual development environment setup

Expand Down
26 changes: 22 additions & 4 deletions noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,19 @@ def tests(session: nox.Session) -> None:
session.run(
"pytest",
"tests/unit",
"-rxXs", # Show provided reason in summary for (x)fail, (X)pass, and (s)kipped statuses
"-rxXs", # Show provided reason in summary for (x)fail, (X)pass, and (s)kipped tests
*session.posargs,
)


@nox.session(name="test-min-deps", python="3.9", venv_backend="uv")
def test_min_deps(session: nox.Session) -> None:
"""Run the unit tests using the lowest compatible version of all direct dependencies."""
session.install("--resolution", "lowest-direct", "--editable", ".[test]")
session.run(
"pytest",
"tests/unit",
"-rxXs", # Show provided reason in summary for (x)fail, (X)pass, and (s)kipped tests
*session.posargs,
)

Expand All @@ -37,17 +49,23 @@ def integration_tests(session: nox.Session) -> None:
"""Run the integration tests."""
session.install("--editable", ".[test]")
session.run(
"scripts/integration-test.sh",
"pytest",
"tests/integration",
"-rxXs", # Show provided reason in summary for (x)fail, (X)pass, and (s)kipped tests
*session.posargs,
env=dict(
EARTHDATA_USERNAME=os.environ["EARTHDATA_USERNAME"],
EARTHDATA_PASSWORD=os.environ["EARTHDATA_PASSWORD"],
),
external=True,
# NOTE: integration test are permitted to pass if the failure rate was less than a hardcoded threshold.
# PyTest will return 99 if there were some failures, but less than the threshold. For more details, see:
# `pytest_sessionfinish` in tests/integration/conftest.py
success_codes=[0, 99],
)


@nox.session
@nox.session(name="build-pkg")
def build_pkg(session: nox.Session) -> None:
"""Build a source distribution and binary distribution (wheel)."""
build_path = DIR.joinpath("build")
Expand All @@ -58,7 +76,7 @@ def build_pkg(session: nox.Session) -> None:
session.run("python", "-m", "build")


@nox.session
@nox.session(name="serve-docs")
def serve_docs(session: nox.Session) -> None:
"""Build the documentation and serve it."""
session.install("--editable", ".[docs]")
Expand Down
16 changes: 0 additions & 16 deletions scripts/integration-test.sh

This file was deleted.

12 changes: 11 additions & 1 deletion tests/integration/conftest.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import pathlib
from warnings import warn

import earthaccess
import pytest
Expand All @@ -22,6 +23,9 @@ def pytest_sessionfinish(session, exitstatus):
ratio will change depending on which tests are executed! E.g. executing integration
tests and unit tests at the same time allows more tests to fail than executing
integration tests alone.
NOTE: The return exit code can be customized with the `EARTHACCESS_ALLOWABLE_FAILURE_STATUS_CODE`
environment variable.
"""
if exitstatus != pytest.ExitCode.TESTS_FAILED:
# Exit status 1 in PyTest indicates "Tests were collected and run but some of
Expand All @@ -32,7 +36,13 @@ def pytest_sessionfinish(session, exitstatus):

failure_rate = (100.0 * session.testsfailed) / session.testscollected
if failure_rate <= ACCEPTABLE_FAILURE_RATE:
session.exitstatus = 99
status_code = os.environ.get("EARTHACCESS_ALLOWABLE_FAILURE_STATUS_CODE", 99)
warn(
f"\nWARNING: The integration test suite has returned {status_code} because the "
"failure rate was less than a hardcoded threshold. For more details see:\n"
"`pytest_sessionfinish` in tests/integration/conftest.py."
)
session.exitstatus = status_code


@pytest.fixture
Expand Down

0 comments on commit d4f24df

Please sign in to comment.