Initialize sf-jobs repository
diff --git a/roles/linters/tasks/lint_ansible-lint.yaml b/roles/linters/tasks/lint_ansible-lint.yaml
new file mode 100644
index 0000000..005b02f
--- /dev/null
+++ b/roles/linters/tasks/lint_ansible-lint.yaml
@@ -0,0 +1,17 @@
+---
+- name: Run ansible-lint
+  shell: "ansible-lint -p --nocolor {{ ansible_lint_roles_dir }}/*"
+  register: _ansible_lint
+  ignore_errors: yes
+  args:
+    chdir: "{{ zuul.project.src_dir }}"
+  environment:
+    PATH: "{{ ansible_env.PATH }}:{{ ansible_env.HOME }}/.local/bin"
+  when: ansible_lint_roles_dir
+
+- name: Set linter failure to true
+  set_fact:
+    linter_failure: true
+  when:
+    - ansible_lint_roles_dir
+    - _ansible_lint.rc
diff --git a/roles/linters/tasks/lint_bashate.yaml b/roles/linters/tasks/lint_bashate.yaml
new file mode 100644
index 0000000..ad63a40
--- /dev/null
+++ b/roles/linters/tasks/lint_bashate.yaml
@@ -0,0 +1,14 @@
+---
+- name: "Run bashate"
+  shell: find * -name "*.sh" | xargs --no-run-if-empty bashate
+  register: _bashate
+  ignore_errors: yes
+  environment:
+    PATH: "{{ ansible_env.PATH }}:{{ ansible_env.HOME }}/.local/bin"
+  args:
+    chdir: "{{ zuul.project.src_dir }}"
+
+- name: Set linter failure to true
+  set_fact:
+    linter_failure: true
+  when: _bashate.rc
diff --git a/roles/linters/tasks/lint_doc8.yaml b/roles/linters/tasks/lint_doc8.yaml
new file mode 100644
index 0000000..a3edc17
--- /dev/null
+++ b/roles/linters/tasks/lint_doc8.yaml
@@ -0,0 +1,15 @@
+---
+- name: Run doc8
+  shell: >
+    find * -name "*.rst" | xargs --no-run-if-empty doc8
+  register: _doc8
+  ignore_errors: yes
+  environment:
+    PATH: "{{ ansible_env.PATH }}:{{ ansible_env.HOME }}/.local/bin"
+  args:
+    chdir: "{{ zuul.project.src_dir }}"
+
+- name: Set linter failure to true
+  set_fact:
+    linter_failure: true
+  when: _doc8.rc
diff --git a/roles/linters/tasks/lint_flake8.yaml b/roles/linters/tasks/lint_flake8.yaml
new file mode 100644
index 0000000..e5a8ab1
--- /dev/null
+++ b/roles/linters/tasks/lint_flake8.yaml
@@ -0,0 +1,14 @@
+---
+- name: "Run flake8"
+  shell: find * -name "*.py" | xargs --no-run-if-empty flake8
+  register: _flake8
+  ignore_errors: yes
+  environment:
+    PATH: "{{ ansible_env.PATH }}:{{ ansible_env.HOME }}/.local/bin"
+  args:
+    chdir: "{{ zuul.project.src_dir }}"
+
+- name: Set linter failure to true
+  set_fact:
+    linter_failure: true
+  when: _flake8.rc
diff --git a/roles/linters/tasks/lint_golint.yaml b/roles/linters/tasks/lint_golint.yaml
new file mode 100644
index 0000000..e0c9495
--- /dev/null
+++ b/roles/linters/tasks/lint_golint.yaml
@@ -0,0 +1,15 @@
+---
+- name: Run golint
+  shell: >
+    find * -name "*.go" | xargs --no-run-if-empty golint -set_exit_status
+  register: _golint
+  ignore_errors: yes
+  environment:
+    PATH: "{{ ansible_env.PATH }}:{{ ansible_env.HOME }}/.local/bin"
+  args:
+    chdir: "{{ zuul.project.src_dir }}"
+
+- name: Set linter failure to true
+  set_fact:
+    linter_failure: true
+  when: _golint.rc
diff --git a/roles/linters/tasks/lint_yamllint.yaml b/roles/linters/tasks/lint_yamllint.yaml
new file mode 100644
index 0000000..0f7ae40
--- /dev/null
+++ b/roles/linters/tasks/lint_yamllint.yaml
@@ -0,0 +1,16 @@
+---
+- name: Run yamllint
+  shell: >
+    find * -name "*.yml" -or -name "*.yaml" |
+        xargs --no-run-if-empty yamllint -d relaxed
+  register: _yamllint
+  ignore_errors: yes
+  environment:
+    PATH: "{{ ansible_env.PATH }}:{{ ansible_env.HOME }}/.local/bin"
+  args:
+    chdir: "{{ zuul.project.src_dir }}"
+
+- name: Set linter failure to true
+  set_fact:
+    linter_failure: true
+  when: _yamllint.rc
diff --git a/roles/linters/tasks/main.yaml b/roles/linters/tasks/main.yaml
new file mode 100644
index 0000000..8791365
--- /dev/null
+++ b/roles/linters/tasks/main.yaml
@@ -0,0 +1,12 @@
+---
+- name: Set linter failure to false
+  set_fact:
+    linter_failure: false
+
+- include: "lint_{{ item }}.yaml"
+  loop: "{{ linters }}"
+
+- name: Fail if one linter failed
+  fail:
+    msg: "One or more file(s) failed lint checks"
+  when: linter_failure