Yaml Ci-Config 파일에서 Shellcheck을 실행하는 래퍼 스크립트. 현재 지원되는 형식은 Bitbucket Pipelines, Gitlab CI, Github Actions, Drone CI, Circleci 및 (매우 제한된) Ansible입니다.
Library Ruamel.yaml 및 Shellcheck과 함께 Python 3이 필요합니다.
$ ./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 데이터 내부의 요소에 쉘 스크립트가 포함 된 요소를 인코딩하는 것입니다. 지금까지 세 가지 형식이 지원됩니다.
비트 버킷 파일을 처리하는 것은 매우 간단합니다. pipelines 객체가있는 파일은 비트 버킷 파이프 라인 파일로 읽히고 내부의 모든 script 속성은 쉘 스크립트로 간주됩니다.
GitHub에는 작업 (재사용 가능한 구성 요소) 및 워크 플로 (스크립트 및/또는 작업을 실행할 수있는 실제 CI 구성)가 있습니다. 이 도구는 동일한 기능에서 두 파일 유형을 모두 처리하려고합니다.
Github 워크 플로는 Bitbucket과 유사합니다. A on Attribute 및 jobs 객체가있는 파일은 GitHub 파일로 읽히고 내부의 모든 run 속성은 쉘 스크립트로 간주됩니다.
또는 inputs 및 runs 객체가있는 파일은 GitHub 조치 파일로 읽습니다.
내가 Forgejo Actions (https://codeberg.org/에 의해 사용 된대로)는 Github 동작/워크 플로와 동일한 구조를 의도적으로 사용하므로 여기에서도 다루어집니다.
shell 속성은 지원되지 않습니다sh 및 bash 스크립트 만 확인하기에 충분히 간단해야합니다.드론 CI는 매우 간단한 파일 구조를 가지고 있습니다. 내가 말할 수있는 한, 그것은 조건 만 있지만 깊은 둥지 나 포함되지 않습니다. 모든 명령 목록은 쉘 스크립트로 연결되어 확인됩니다.
Circleci에는 많은 옵션이 있지만 다행히도 jobs.*.steps.run 스크립트 요소는 간단합니다. 모든 명령 목록은 쉘 스크립트로 연결되어 확인됩니다.
shell 속성이 지원됩니다Gitlab CI 파일에는 더 많은 구조가 있으며 더 많은 것을 지원하려고합니다.
script , before_script , after_script : gitlab에는 3 개의 독립적 인 스크립트로 읽은 세 가지 다른 쉘 스크립트 속성이 있습니다. Gitlab에서 before_script 와 script 단일 쉘 프로세스에서 연결 및 실행되는 반면 after_script 항상 새로운 쉘 프로세스를 시작합니다. 이는 가변 가시성 등에 몇 가지 영향을 미치며이 도구에서는 무시됩니다.include 되지 않으며 모든 YAML 파일은 자체적으로 구문 분석됩니다. 포함 된 많은 파이프 라인의 경우 다른 도구를 사용하여 모든 포함 도구를 해결하고 병합 된 YAML 파일에서 YAML_SHELLCHECK를 실행할 수 있습니다.!reference 반 지원되며, Yaml 구문 분석을 깨지 않기 위해 태그 만 읽고 자리 표시자를 삽입합니다 (Todo, 개선이 간단해야 함).variables 확인을 지원 하지 않기로 결정했습니다. shellcheck 사용하기 전에 할당에 대한 소문자 변수를 확인하지만 모든 상위 상부 변수 이름이 외부 제공이라고 가정합니다. -Imho gitlab Ci 작업은 해당 협약을 따르고 CI/CD 변수에 상류 변수 이름을 사용해야합니다.Ansible 지원은 제한적입니다. 이 도구는 Yaml 목록이있는 Ansible Playbook 또는 작업 파일을 읽습니다.
지금까지 세 가지 목록 요소를 인식합니다.
shell (또는 ansible.builtin.shell ) 모듈을 사용하는 작업.tasks 속성을 포함하는 플레이 북 요소.block ).{{ ... }} )은 무시되어 자리 표시 자 쉘 변수로 대체됩니다.Yaml 파서로 파일을 읽으므로 모든 Yaml 앵커가 해결됩니다. 데이터 유형이나 구조에 대한 추가 점검은 없습니다.
Bitbucket/Gitlab 사용에 따라 스크립트 블록에는 문자열 또는 문자열 배열이 포함될 수 있습니다.