包装脚本以在yaml ci-config文件上运行ShellCheck。目前支持的格式是Bitbucket管道,Gitlab CI,GitHub Action,无人机CI,Circleci和(非常有限的)
需要Python 3与库Ruamel.yaml和ShellCheck。
$ ./yaml_shellcheck.py -h
usage: yaml_shellcheck.py [-h] [-o OUTDIR] [-k] [-d] [-s SHELL] [-c COMMAND] files [files ...]
run shellcheck on script blocks from .gitlab-ci.yml or bitbucket-pipelines.yml
positional arguments:
files YAML files to read
optional arguments:
-h, --help show this help message and exit
-o OUTDIR, --outdir OUTDIR
output directory (default: create temporary directory)
-k, --keep keep (do not delete) output directory
-d, --debug debug output
-s SHELL, --shell SHELL
default shebang line to add to shell script snippets (default: '#!/bin/sh -e')
-c COMMAND, --command COMMAND
shellcheck command to run (default: shellcheck)
该工具使用shellcheck的退出代码退出,从他们的人页面上:
ShellCheck uses the follow exit codes:
• 0: All files successfully scanned with no issues.
• 1: All files successfully scanned with some issues.
• 2: Some files could not be processed (e.g. file not found).
• 3: ShellCheck was invoked with bad syntax (e.g. unknown flag).
• 4: ShellCheck was invoked with bad options (e.g. unknown formatter).
# build image
$ docker build . -t yaml_shellcheck:latest
# run image
$ docker run -v ` pwd ` :/app yaml_shellcheck app/ * .yaml lint_yaml_shellcheck :
image :
name : quay.io/mschuette/yaml-shellcheck:latest
entrypoint : [""]
script :
- find . -name *.yaml -or -name *.yml | xargs python3 yaml_shellcheck.py 该工具的主要功能是编码YAML数据中的哪些元素包含Shell脚本。到目前为止,支持三种格式。
处理BitBucket文件非常简单。带有pipelines对象的文件被读取为BitBucket管道文件,并且内部的每个script属性都被视为shell脚本。
GitHub具有操作(可重复使用的组件)和工作流(可能运行脚本和/或操作的真实CI配置)。该工具试图在同一功能中处理两种文件类型。
GitHub工作流类似于Bitbucket。具有on属性和jobs对象的文件被读取为github文件,并且内部的每个run属性都被视为shell脚本。
或者,具有inputs和runs对象的文件被读为github操作文件。
据我所知,Forgejo动作(例如https://codeberg.org/使用)有意使用与github Action/Workflows相同的结构,因此在此也介绍了这些结构。
shell属性sh bash待遇无人机CI具有非常简单的文件结构。据我所知,它只有条件,但没有深层嵌套或包括。所有命令列表均已连接并检查为shell脚本。
Circleci有很多选择,但幸运的是其jobs.*.steps.run所有命令列表均已连接并检查为shell脚本。
shell属性GitLab CI文件具有更多的结构,我们试图支持更多的结构。
script , before_script , after_script :gitlab没有一个,而是三个不同的shell脚本属性,这些属性被读为三个独立脚本。在gitlab中, before_script和script在单个外壳过程中被串联和执行,而after_script始终启动新的shell进程。这对可变可见性等有一些影响,并且在此工具中被忽略。include ,每个YAML文件都是单独解析的。对于包含许多包含的大型管道,您可能需要使用其他工具来解决所有内容,然后在合并的YAML文件上运行yaml_shellcheck。!referencevariables检查。 shellcheck在使用之前检查了较低案例变量的分配,但假设所有上案例变量名称均提供外部。 -IMHO GITLAB CI作业应遵循该约定,并使用CI/CD变量的上案例变量名称。Ansible支持是有限的。此工具读取具有YAML列表的Ansible Playbook或任务文件。
到目前为止,它识别出三种列表元素:
shell (或ansible.builtin.shell )模块的任务。tasks属性。block )。{{ ... }} )被忽略并用占位符壳变量代替。用YAML解析器读取文件,因此所有YAML锚都可以解决。没有其他检查数据类型或结构的检查。
遵循bitbucket/gitlab使用脚本块可能包含字符串或一系列字符串。