diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..86cf5fac57eb7e67855f1a782d1563fdd422968f
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+# See https://pre-commit.com for more information
+# See https://pre-commit.com/hooks.html for more hooks
+default_stages: [commit]
+repos:
+ - repo: https://github.com/dafyddj/commitlint-pre-commit-hook
+ rev: v2.3.0
+ hooks:
+ - id: commitlint
+ name: Check commit message using commitlint
+ description: Lint commit message against @commitlint/config-conventional rules
+ stages: [commit-msg]
+ additional_dependencies: ['@commitlint/config-conventional@8.3.4']
+ - id: commitlint-travis
+ stages: [manual]
+ additional_dependencies: ['@commitlint/config-conventional@8.3.4']
+ always_run: true
+ - repo: https://github.com/adithyabsk/mirrors-rubocop
+ rev: v0.91.0
+ hooks:
+ - id: rubocop
+ name: Check Ruby files with rubocop
+ args: [--debug]
+ always_run: true
+ pass_filenames: false
+ - repo: https://github.com/jumanjihouse/pre-commit-hooks
+ rev: 2.1.3
+ hooks:
+ - id: shellcheck
+ name: Check shell scripts with shellcheck
+ files: ^.*\.(sh|bash|ksh)$
+ types: []
+ args: []
+ - repo: https://github.com/adrienverge/yamllint.git
+ rev: v1.23.0
+ hooks:
+ - id: yamllint
+ name: Check YAML syntax with yamllint
+ args: [--strict, '.']
+ always_run: true
+ pass_filenames: false
+ - repo: https://github.com/warpnet/salt-lint
+ rev: v0.3.0
+ hooks:
+ - id: salt-lint
+ name: Check Salt files using salt-lint
+ files: ^.*\.(sls|jinja|j2|tmpl|tst)$
+# - repo: https://github.com/myint/rstcheck
+# rev: 3f929574
+# hooks:
+# - id: rstcheck
+# name: Check reST files using rstcheck
+# args: [--report=warning]
diff --git a/.rstcheck.cfg b/.rstcheck.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..05856dc70598f016b0fe9a52287cadf15bdc14f7
--- /dev/null
+++ b/.rstcheck.cfg
@@ -0,0 +1,3 @@
+[rstcheck]
+report=error
+ignore_language=rst
diff --git a/.travis.yml b/.travis.yml
index 3f848e33611ced6bd9aaa153e74dcc3961986966..64cb3727547fb470dedc6a19ce1fdbb3157533b3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -55,6 +55,20 @@ jobs:
@commitlint/travis-cli
- commitlint-travis
+ # Run `pre-commit` linters in a single job
+ - language: 'python'
+ env: 'Lint_pre-commit'
+ name: 'Lint: pre-commit'
+ before_install: 'skip'
+ cache:
+ directories:
+ - $HOME/.cache/pre-commit
+ script:
+ # Install and run `pre-commit`
+ - pip install pre-commit==2.7.1
+ - pre-commit run --all-files --color always --verbose
+ - pre-commit run --color always --hook-stage manual --verbose commitlint-travis
+
## Define the rest of the matrix based on Kitchen testing
# Make sure the instances listed below match up with
# the `platforms` defined in `kitchen.yml`
diff --git a/bin/install-hooks b/bin/install-hooks
new file mode 100755
index 0000000000000000000000000000000000000000..840bb6c5c5244206a03e37e4c57b2e872aa2dfec
--- /dev/null
+++ b/bin/install-hooks
@@ -0,0 +1,16 @@
+#!/usr/bin/env sh
+set -o nounset # Treat unset variables as an error and immediately exit
+set -o errexit # If a command fails exit the whole script
+
+if [ "${DEBUG:-false}" = "true" ]; then
+ set -x # Run the entire script in debug mode
+fi
+
+if ! command -v pre-commit >/dev/null 2>&1; then
+ echo "pre-commit not found: please install or check your PATH" >&2
+ echo "See https://pre-commit.com/#installation" >&2
+ exit 1
+fi
+
+pre-commit install --install-hooks
+pre-commit install --hook-type commit-msg --install-hooks