البرنامج النصي المرفق لتشغيل shellcheck على ملفات yaml ci-config. التنسيقات المدعومة حاليًا هي خطوط أنابيب Bitbucket و Gitlab CI و Github Actions و Drone CI و Circleci و (محدودة للغاية) Ansible
يحتاج 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 ، من صفحة Man:
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 التي تحتوي على نصوص قذيفة. حتى الآن يتم دعم ثلاثة تنسيقات.
معالجة ملفات bitbucket بسيطة للغاية. تتم قراءة ملف يحتوي على كائن pipelines كملف خط أنابيب Bitbucket ، ويعتبر كل سمة script داخل برنامج SHELL.
لدى Github إجراءات (مكونات قابلة لإعادة الاستخدام) وسير العمل (تكوين CI الحقيقي الذي قد يقوم بتشغيل البرامج النصية و/أو الإجراءات). تحاول هذه الأداة التعامل مع كلا النوعين من الملفات في نفس الوظيفة.
مهام سير العمل Github تشبه Bitbucket. يتم قراءة ملف يحتوي على سمة on وكائن jobs كملف github ، ويعتبر كل سمة run في الداخل برنامجًا نصيًا shell.
بدلاً من ذلك ، يتم قراءة ملف يحتوي inputs ويتم تشغيل كائن runs كملف إجراءات GitHub.
بقدر ما أستطيع أن أخبر إجراءات Forgejo (كما هو مستخدم على سبيل المثال بواسطة https://codeberg.org/) ، استخدم عن قصد نفس بنية الإجراءات/سير العمل ، لذلك يتم تغطية هذه أيضًا هنا.
shell غير مدعومةbash sh فقطيحتوي الطائرات بدون طيار CI على بنية ملف بسيطة للغاية. بقدر ما أستطيع أن أقول أنه يحتوي على شروط فقط ، ولكن لا يوجد تعشيش عميق أو يشمل. يتم تسلس جميع قوائم الأوامر والتحقق منها كنصي Shell.
لدى Circleci العديد من الخيارات ، ولكن لحسن الحظ تعشش jobs.*.steps.run يتم تسلس جميع قوائم الأوامر والتحقق منها كنصي Shell.
shellتحتوي ملفات Gitlab CI على المزيد من بنية ، ونحاول دعم المزيد منها.
script ، before_script ، after_script : ليس لدى gitlab واحدًا ، ولكن ثلاث سمات نصية مختلفة يتم قراءة ثلاث نصوص مستقلة. في gitlab before_script و script الحصول على متسلسل وتنفيذ في عملية shell واحدة ، في حين أن after_script تبدأ دائما عملية shell جديدة. هذا له بعض الآثار المترتبة على الرؤية المتغيرة وما إلى ذلك ويتم تجاهله في هذه الأداة.include دعمه ، يتم تحليل كل ملف yaml من تلقاء نفسه. بالنسبة لخطوط الأنابيب الكبيرة التي تحتوي على العديد ، قد ترغب في استخدام أدوات أخرى لحل جميعها ، ثم تشغيل Yaml_ShellCheck على ملف YAML المدمج.!reference هو شبه مدعوم ، نقرأ فقط العلامة وإدراج عنصر نائب حتى لا يكسر التحليل YAML (TODO ، يجب أن يكون الأمر بسيطًا).variables . يتحقق shellcheck من متغيرات الحالة المنخفضة للواجبات قبل الاستخدام ، لكنه يفترض أن جميع أسماء المتغيرات العلوية يتم توفيرها خارجيًا. -يجب أن تتبع وظائف IMHO Gitlab CI هذه الاتفاقية واستخدام أسماء متغير الحالات العليا لمتغيرات CI/CD.الدعم Ansible محدود. تقرأ هذه الأداة ملفات playbook أو مهمة ANSIBLE مع قوائم YAML.
حتى الآن يتعرف على ثلاثة أنواع من عناصر القائمة:
shell (أو ansible.builtin.shell ).tasks .block ) لقوائم المهام المتداخلة.{{ ... }} ) واستبدالها بمتغيرات قذيفة العنصر النائب.تتم قراءة الملفات باستخدام محلل Yaml ، لذلك يتم حل جميع مراسي YAML. لا يوجد فحص إضافي لأنواع البيانات أو الهيكل.
بعد استخدام Bitbucket/Gitlab ، قد تحتوي كتلة البرنامج النصي على سلسلة أو مجموعة من الأوتار.