From c9ab1514dfdcadcdc0443d4cd9262f191f4b1dc1 Mon Sep 17 00:00:00 2001 From: Timothée Ravier Date: Nov 15 2022 18:38:10 +0000 Subject: Backport Zuul CI & validate script --- diff --git a/.zuul.yaml b/.zuul.yaml new file mode 100644 index 0000000..6bf4c36 --- /dev/null +++ b/.zuul.yaml @@ -0,0 +1,9 @@ + - project: + check: + jobs: + - validate + + - job: + name: validate + description: Validate manifests and scripts syntax + run: ci/validate.yaml diff --git a/ci/validate b/ci/validate new file mode 100755 index 0000000..1e9b6c9 --- /dev/null +++ b/ci/validate @@ -0,0 +1,50 @@ +#!/usr/bin/python3 +# Validate basic syntax of shell script and yaml. + +import os +import stat +import subprocess +import yaml + +validated=0 + +def openat(dirfd, name, mode='r'): + def opener(path, flags): + return os.open(path, flags, dir_fd=dirfd) + return open(name, mode, opener=opener) + + +def validate_shell(rootfd, name): + subprocess.check_call(['bash', '-n', name], preexec_fn=lambda: os.fchdir(rootfd)) + global validated + validated +=1 + + +for root, dirs, files, rootfd in os.fwalk('.'): + # Skip .git, repo, cache, tmp, logs, fedora-comps + for d in ['.git', 'repo', 'cache', 'tmp', 'logs', 'fedora-comps']: + if d in dirs: + dirs.remove(d) + for name in files: + if name.endswith(('.yaml', '.yml')): + print("Validating:", name) + with open(os.open(name, dir_fd=rootfd, flags=os.O_RDONLY)) as f: + yaml.safe_load(f) + validated +=1 + continue + elif name.endswith('.sh'): + print("Validating:", name) + validate_shell(rootfd, name) + continue + stbuf = os.lstat(name, dir_fd=rootfd) + if not stat.S_ISREG(stbuf.st_mode): + continue + if not stbuf.st_mode & stat.S_IXUSR: + continue + mimetype = subprocess.check_output(['file', '-b', '--mime-type', name], encoding='UTF-8', + preexec_fn=lambda: os.fchdir(rootfd)).strip() + if mimetype == 'text/x-shellscript': + print("Validating:", name) + validate_shell(rootfd, name) + +print(f"Validated {validated} files") diff --git a/ci/validate.yaml b/ci/validate.yaml new file mode 100644 index 0000000..70d6489 --- /dev/null +++ b/ci/validate.yaml @@ -0,0 +1,6 @@ + - hosts: all + tasks: + - name: Validate manifests and scripts syntax + ansible.builtin.command: + chdir: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}" + cmd: ci/validate