Skip to content

CI - Check pyproject.toml dependencies

File to use: ci_check_pyproject_dependencies.yml

This workflow runs an Invoke task to check dependencies in a pyproject.toml file.

The reason for having this workflow and not using Dependabot is because it seems to not function properly with this use case.

Warning

If a PAT is not passed through for the PAT secret and GITHUB_TOKEN is used, beware that any other CI/CD jobs that run for, e.g., pull request events, may not run since GITHUB_TOKEN-generated PRs are designed to not start more workflows to avoid escalation. Hence, if it is important to run CI/CD workflows for pull requests, consider passing a PAT as a secret to this workflow represented by the PAT secret.

Ignoring dependencies

To ignore or configure how specific dependencies should be updated, the ignore input option can be utilized. This is done by specifying a line per dependency that contains ellipsis-separated (...) key/value-pairs of:

Key Description
dependency-name Ignore updates for dependencies with matching names, optionally using * to match zero or more characters.
versions Ignore specific versions or ranges of versions. Examples: ~=1.0.5, >= 1.0.5,<2, >=0.1.1.
update-types Ignore types of updates, such as SemVer major, minor, patch updates on version updates (for example: version-update:semver-patch will ignore patch updates). This can be combined with dependency-name=* to ignore particular update-types for all dependencies.

Supported update-types values

Currently, only version-update:semver-major, version-update:semver-minor, and version-update:semver-patch are supported options for update-types.

The ignore option is essentially similar to the ignore option of Dependabot. If versions and update-types are used together, they will both be respected jointly.

Here is an example of different lines given as value for the ignore option that accomplishes different things:

# ...
jobs:
  check-dependencies:
    uses: SINTEF/ci-cd/.github/workflows/ci_check_pyproject_dependencies.yml@v2.3.0
    with:
      # ...
      # For Sphinx, ignore all updates for/from version 4.5.0 and up / keep the minimum version for Sphinx at 4.5.0.
      # For pydantic, ignore all patch updates
      # For numpy, ignore any and all updates
      ignore: |
        dependency-name=Sphinx...versions=>=4.5.0
        dependency-name=pydantic...update-types=version-update:semver-patch
        dependency-name=numpy
# ...

Expectations

The repository contains the following:

  • (required) A repository root pyproject.toml file with the Python package's dependencies.

Inputs

Name Description Required Default Type
git_username A git username (used to set the 'user.name' config option). Yes string
git_email A git user's email address (used to set the 'user.email' config option). Yes string
permanent_dependencies_branch The branch name for the permanent dependency updates branch. No ci/dependency-updates string
python_version The Python version to use for the workflow. No 3.9 string
install_extras Any extras to install from the local repository through 'pip'. Must be encapsulated in square parentheses ([]) and be separated by commas (,) without any spaces.

Example: '[dev,release]'.
No Empty string string
pr_body_file Relative path to PR body file from the root of the repository.

Example: '.github/utils/pr_body_deps_check.txt'.
No Empty string string
fail_fast Whether the task to update dependencies should fail if any error occurs. No false boolean
pr_labels A comma separated list of strings of GitHub labels to use for the created PR. No Empty string string
ignore Create ignore conditions for certain dependencies. A multi-line string of ignore rules, where each line is an ellipsis-separated (...) string of key/value-pairs. One line per dependency. This option is similar to the ignore option of Dependabot. No Empty string string

Secrets

Name Description Required
PAT A personal access token (PAT) with rights to update the permanent_dependencies_branch. This will fallback on GITHUB_TOKEN. No

Usage example

The following is an example of how a workflow may look that calls CI - Check pyproject.toml dependencies. It is meant to be complete as is.

name: CI - Check dependencies

on:
  schedule:
    - cron: "30 5 * * 1"
  workflow_dispatch:

jobs:
  check-dependencies:
    name: Call external workflow
    uses: SINTEF/ci-cd/.github/workflows/ci_check_pyproject_dependencies.yml@v2.3.0
    if: github.repository_owner == 'SINTEF'
    with:
      git_username: "Casper Welzel Andersen"
      git_email: "CasperWA@github.com"
      permanent_dependencies_branch: "ci/dependency-updates"
      python_version: "3.9"
      install_extras: "[dev]"
      pr_labels: "CI/CD"
    secrets:
      PAT: ${{ secrets.PAT }}