versioncheck helps with checking if version numbers in files spread out across multiple repositories are out-of-date. This is primarily useful for gitops workflows where versions of docker images, helm charts, etc are committed to a repository.
versioncheck requires a configuration file that defines where to fetch versions from and what files contain the version numbers to check against. A github token must then be provided to fetch the files from github. Alternatively, a path mapping file can map github URLs to a local checkout of the repository.
The basic thing to do is check versions which can be done via:
versioncheck check
By default, upstream versions are cached. To force versions to be re-fetched, run
versioncheck check --update
--outdated can also be passed to only show outdated versions.
It's also possible to list available upstream versions via
versioncheck versions <name> [version-spec]
A configuration file is a YAML file that looks like
ingress-nginx:
upstream:
type: helm
repo: https://kubernetes.github.io/ingress-nginx
chart: ingress-nginx
versionSpec: 1.3.x
usages:
production:
type: file
source: https://github.com/org/repo/blob/HEAD/argocd/ingress-ops.yaml
parser:
type: yaml
query: "spec.source.targetRevision"
The configuration file contains a mapping of names to the version specification
which is upstream and usages.
upstream indicates how to fetch versions from upstream. type indicates what
fetcher to use. Each fetcher has its own specific configuration.
versionSpec specifies the version pattern to use for determining if a version
is outdated. For example, if upstream has maintained 2.x and 1.x lines, but
we're not ready to update to 2.x, we can restrict it to 1.x so that we can check
against that instead of being perpetually out-of-date against 2.x.
prerelease indicates whether or not to include prereleases in the list of
versions.
traefik:
upstream:
type: github_release
owner: traefik
repo: traefik
versionSpec: "2.6.x"
Fetching versions from github can be configured with either type: github_release or type: github_tag depending on the project. Both of them
take the same options.
owner and repo indicate which github repository to fetch from. regexp
allows extracting part of the release / tag name in case there's additional
text.
secret-project:
upstream:
type: github_commit
owner: org
repo: secret-project
private: true
type: github_commit allows fetching the commit hash for the specified ref.
Unlike other fetchers, this only returns one version. This is mostly useful for
dependencies that are pinned by hash and don't have actual versions.
owner and repo indicate which github repository to fetch from. ref takes a
ref like HEAD or a branch / tag name. private is optional and indicates that
the repository is private. When fetching a private repository and no github
tokens are provided, the fetcher falls back to git ls-remote via SSH.
ingress-nginx:
upstream:
type: helm
repo: https://kubernetes.github.io/ingress-nginx
chart: ingress-nginx
type: helm allows fetching from helm repositories. In addition to the "main"
version, this also fetches the "app" version for display but all checking is
done against the "main" chart version.
repo is the url you would use with helm repo add and chart is the chart
name.
jenkins:
upstream:
type: html
url: https://www.jenkins.io/changelog-stable/rss.xml
selector: channel item title
regexp: "Jenkins (.*)"
type: html allows fetching a single HTML / XML page and parsing out a list of
versions from it.
url indicates the URL of the HTML page. selector takes a CSS selector for
elements to consider. Finally regexp allows parsing the textContent of the
retrieved elements and getting the versions out.
usages is a map of names to usage specifications. Currently, only type: file
is supported.
source is a path to a local file when used within a single repository. When
working with multiple repositories, it should be the URL to the file on GitHub
(not the raw URL). If tokens are provided, these are fetched HTTP. Otherwise,
the files are retrieved locally according to the provided path mapping.
parser indicates how to get the used version out of the file. type: regexp
extracts the version via the provided regexp.
type: yaml parses the file as YAML (or JSON). query is a JMESPath expression
to get from the parsed data. Optionally, regexp can be provided to get the
actual version out.
The path mapping is used to map github urls to local paths. The file is a YAML
file with alias and github. Like so:
alias:
~org: /data/repos/org
~sister-org: /data/repos/sister-org
github:
org/repo: ~org/repo
org/secret-project: ~org/secret-repos/project
sister-org/config: ~sister-org/config
alias allows mapping a ~name to a local path that will be used in the rest
of the configuration. In the above example, any instance of ~org will be
replaced by /data/repos/org.
github maps github repository names to the path of a local checkout. In the
above example, the org/repo repository is found at ~org/repo which will be
expanded to /data/repos/org/repo. org/secret-project would be ultimately
resolved to /data/repos/secret-repos/project and sister-org/config resolves
to /data/repos/sister-org/config.