包裝腳本以在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使用腳本塊可能包含字符串或一系列字符串。