Как создать скрипт bash внутри файла YAML - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь создать задание GitLab CI / CD, которое берет сценарий bash из файла YAML и проверяет, правильный ли синтаксис.

У меня есть файл YAML .gitlab-ci.template.yml со следующим содержимым:

image: node:10.15.3-alpine

stages:
  - deploy

deploy:
  stage: deploy
  script:
    - apk_install
    - yarn_install
    - build
    - deploy

.bash: &bash |
  function apk_install() {
    apk add jq git curl grep
  }

  function yarn_install() {
     yarn
  }
  function build() {
    echo "Build"

    if [ -f ".gitlab-ci.template.yml" ]; then
       echo "Just a dumb test for more lines"
    fi 
  }

  function deploy() {
    echo "Deploy"
  }

before_script:
  - *bash

Я бы хотел принять участие в тестировании bash. Я установил shyaml, чтобы получить значения из файла YAML, например:

FILE=`cat .gitlab-ci.template.yml | shyaml get-value before_script`

Содержимое $FILE будет:

- "function apk_install() {\n apk add jq git curl grep\n}\n\nfunction yarn_install()\ \ {\n yarn\n}\nfunction build() {\n echo \"Build\"\n \n if [ -f \".gitlab-ci.template.yml\"\ \ ]; then\n echo \"Just a dumb test for more lines\"\n fi\n}\n\nfunction deploy()\ \ {\n echo \"Deploy\"\n}\n"

Затем с помощью следующей команды я снова пытаюсь получить действительный файл:

echo $FILE | xargs -0 printf '%b\n' | sed 's/\\[[:space:]]\\[[:space:]]/ /g' | sed 's/\\"/"/g' | sed 's/\\[[:space:]]//g'

Теперь я могу удалить некоторые символы с начала и до конца. Но мне было интересно, есть ли лучший / более простой способ?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Рассматривали ли вы использовать yq?

Вот выражение для извлечения сценария оболочки из вашего файла:

yq -r '.[".bash"]' .gitlab-ci.template.yml 

Результатом является фактический скрипт. Теперь вам просто нужно отправить его на линтер. Я просмотрел этот сайт для вас, но не смог найти синтаксический анализатор bash, который часто размещается в сообщениях bash (YMMV). Я нашел ShellChecker через Google, но я не провел тщательную оценку (поэтому используйте по своему усмотрению).

В конечном итоге ваш код может выглядеть следующим образом:

yq -r '.[".bash"]' .gitlab-ci.template.yml | ShellChecker # or use your favorite bash linter
0 голосов
/ 15 марта 2019

Только что заметил, что я должен получить первый случай от before_script с shyaml.Поэтому я изменил:

FILE=`cat .gitlab-ci.template.yml | shyaml get-value before_script`

на:

FILE=`cat .gitlab-ci.template.yml | shyaml get-value before_script.0`

, который получит скрипт как есть.

...