mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 08:14:42 +04:00
Add new docker_image language type.
`docker_image` is intended to be a lightweight hook type similar to system / script which allows one to use an existing docker image which provides a hook.
This commit is contained in:
parent
491b90548f
commit
9c3bbecab8
10 changed files with 63 additions and 28 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from pre_commit.languages import docker
|
from pre_commit.languages import docker
|
||||||
|
from pre_commit.languages import docker_image
|
||||||
from pre_commit.languages import golang
|
from pre_commit.languages import golang
|
||||||
from pre_commit.languages import node
|
from pre_commit.languages import node
|
||||||
from pre_commit.languages import pcre
|
from pre_commit.languages import pcre
|
||||||
|
|
@ -49,6 +50,7 @@ from pre_commit.languages import system
|
||||||
|
|
||||||
languages = {
|
languages = {
|
||||||
'docker': docker,
|
'docker': docker,
|
||||||
|
'docker_image': docker_image,
|
||||||
'golang': golang,
|
'golang': golang,
|
||||||
'node': node,
|
'node': node,
|
||||||
'pcre': pcre,
|
'pcre': pcre,
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,16 @@ def install_environment(
|
||||||
os.mkdir(directory)
|
os.mkdir(directory)
|
||||||
|
|
||||||
|
|
||||||
|
def docker_cmd():
|
||||||
|
return (
|
||||||
|
'docker', 'run',
|
||||||
|
'--rm',
|
||||||
|
'-u', '{}:{}'.format(os.getuid(), os.getgid()),
|
||||||
|
'-v', '{}:/src:rw'.format(os.getcwd()),
|
||||||
|
'--workdir', '/src',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
|
def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
|
||||||
assert_docker_available()
|
assert_docker_available()
|
||||||
# Rebuild the docker image in case it has gone missing, as many people do
|
# Rebuild the docker image in case it has gone missing, as many people do
|
||||||
|
|
@ -84,16 +94,8 @@ def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
|
||||||
build_docker_image(repo_cmd_runner, pull=False)
|
build_docker_image(repo_cmd_runner, pull=False)
|
||||||
|
|
||||||
hook_cmd = helpers.to_cmd(hook)
|
hook_cmd = helpers.to_cmd(hook)
|
||||||
entry_executable, cmd_rest = hook_cmd[0], hook_cmd[1:]
|
entry_exe, cmd_rest = hook_cmd[0], hook_cmd[1:]
|
||||||
|
|
||||||
cmd = (
|
|
||||||
'docker', 'run',
|
|
||||||
'--rm',
|
|
||||||
'-u', '{}:{}'.format(os.getuid(), os.getgid()),
|
|
||||||
'-v', '{}:/src:rw'.format(os.getcwd()),
|
|
||||||
'--workdir', '/src',
|
|
||||||
'--entrypoint', entry_executable,
|
|
||||||
docker_tag(repo_cmd_runner),
|
|
||||||
) + cmd_rest
|
|
||||||
|
|
||||||
|
entry_tag = ('--entrypoint', entry_exe, docker_tag(repo_cmd_runner))
|
||||||
|
cmd = docker_cmd() + entry_tag + cmd_rest
|
||||||
return xargs(cmd, file_args)
|
return xargs(cmd, file_args)
|
||||||
|
|
|
||||||
19
pre_commit/languages/docker_image.py
Normal file
19
pre_commit/languages/docker_image.py
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from pre_commit.languages import helpers
|
||||||
|
from pre_commit.languages.docker import assert_docker_available
|
||||||
|
from pre_commit.languages.docker import docker_cmd
|
||||||
|
from pre_commit.xargs import xargs
|
||||||
|
|
||||||
|
|
||||||
|
ENVIRONMENT_DIR = None
|
||||||
|
get_default_version = helpers.basic_get_default_version
|
||||||
|
healthy = helpers.basic_healthy
|
||||||
|
install_environment = helpers.no_install
|
||||||
|
|
||||||
|
|
||||||
|
def run_hook(repo_cmd_runner, hook, file_args): # pragma: windows no cover
|
||||||
|
assert_docker_available()
|
||||||
|
cmd = docker_cmd() + helpers.to_cmd(hook)
|
||||||
|
return xargs(cmd, file_args)
|
||||||
|
|
@ -41,3 +41,7 @@ def basic_get_default_version():
|
||||||
|
|
||||||
def basic_healthy(repo_cmd_runner, language_version):
|
def basic_healthy(repo_cmd_runner, language_version):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def no_install(repo_cmd_runner, version, additional_dependencies):
|
||||||
|
raise AssertionError('This type is not installable')
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,7 @@ ENVIRONMENT_DIR = None
|
||||||
GREP = 'ggrep' if sys.platform == 'darwin' else 'grep'
|
GREP = 'ggrep' if sys.platform == 'darwin' else 'grep'
|
||||||
get_default_version = helpers.basic_get_default_version
|
get_default_version = helpers.basic_get_default_version
|
||||||
healthy = helpers.basic_healthy
|
healthy = helpers.basic_healthy
|
||||||
|
install_environment = helpers.no_install
|
||||||
|
|
||||||
def install_environment(repo_cmd_runner, version, additional_dependencies):
|
|
||||||
"""Installation for pcre type is a noop."""
|
|
||||||
raise AssertionError('Cannot install pcre repo.')
|
|
||||||
|
|
||||||
|
|
||||||
def run_hook(repo_cmd_runner, hook, file_args):
|
def run_hook(repo_cmd_runner, hook, file_args):
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,7 @@ from pre_commit.xargs import xargs
|
||||||
ENVIRONMENT_DIR = None
|
ENVIRONMENT_DIR = None
|
||||||
get_default_version = helpers.basic_get_default_version
|
get_default_version = helpers.basic_get_default_version
|
||||||
healthy = helpers.basic_healthy
|
healthy = helpers.basic_healthy
|
||||||
|
install_environment = helpers.no_install
|
||||||
|
|
||||||
def install_environment(repo_cmd_runner, version, additional_dependencies):
|
|
||||||
"""Installation for script type is a noop."""
|
|
||||||
raise AssertionError('Cannot install script repo.')
|
|
||||||
|
|
||||||
|
|
||||||
def run_hook(repo_cmd_runner, hook, file_args):
|
def run_hook(repo_cmd_runner, hook, file_args):
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,7 @@ from pre_commit.xargs import xargs
|
||||||
ENVIRONMENT_DIR = None
|
ENVIRONMENT_DIR = None
|
||||||
get_default_version = helpers.basic_get_default_version
|
get_default_version = helpers.basic_get_default_version
|
||||||
healthy = helpers.basic_healthy
|
healthy = helpers.basic_healthy
|
||||||
|
install_environment = helpers.no_install
|
||||||
|
|
||||||
def install_environment(repo_cmd_runner, version, additional_dependencies):
|
|
||||||
"""Installation for system type is a noop."""
|
|
||||||
raise AssertionError('Cannot install system repo.')
|
|
||||||
|
|
||||||
|
|
||||||
def run_hook(repo_cmd_runner, hook, file_args):
|
def run_hook(repo_cmd_runner, hook, file_args):
|
||||||
|
|
|
||||||
|
|
@ -202,8 +202,8 @@ class LocalRepository(Repository):
|
||||||
def _cmd_runner_from_deps(self, language_name, deps):
|
def _cmd_runner_from_deps(self, language_name, deps):
|
||||||
"""local repositories have a cmd runner per hook"""
|
"""local repositories have a cmd runner per hook"""
|
||||||
language = languages[language_name]
|
language = languages[language_name]
|
||||||
# pcre / script / system do not have environments so they work out
|
# pcre / script / system / docker_image do not have environments so
|
||||||
# of the current directory
|
# they work out of the current directory
|
||||||
if language.ENVIRONMENT_DIR is None:
|
if language.ENVIRONMENT_DIR is None:
|
||||||
return PrefixedCommandRunner(git.get_root())
|
return PrefixedCommandRunner(git.get_root())
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
- id: echo-entrypoint
|
||||||
|
name: echo (via --entrypoint)
|
||||||
|
language: docker_image
|
||||||
|
entry: --entrypoint echo cogniteev/echo
|
||||||
|
- id: echo-cmd
|
||||||
|
name: echo (via cmd)
|
||||||
|
language: docker_image
|
||||||
|
entry: cogniteev/echo echo
|
||||||
|
|
@ -164,6 +164,18 @@ def test_run_a_failing_docker_hook(tempdir_factory, store):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@skipif_slowtests_false
|
||||||
|
@skipif_cant_run_docker
|
||||||
|
@pytest.mark.integration
|
||||||
|
@pytest.mark.parametrize('hook_id', ('echo-entrypoint', 'echo-cmd'))
|
||||||
|
def test_run_a_docker_image_hook(tempdir_factory, store, hook_id):
|
||||||
|
_test_hook_repo(
|
||||||
|
tempdir_factory, store, 'docker_image_hooks_repo',
|
||||||
|
hook_id,
|
||||||
|
['Hello World from docker'], b'Hello World from docker\n',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@skipif_slowtests_false
|
@skipif_slowtests_false
|
||||||
@xfailif_windows_no_node
|
@xfailif_windows_no_node
|
||||||
@pytest.mark.integration
|
@pytest.mark.integration
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue