Не валидный yaml-файл в CI/CD

Рейтинг: 0Ответов: 1Опубликовано: 21.07.2023

Перестал корректно работать yml-файл в GitLab. Файл содержит следующий код:

image: keith1983/debian_with_python_3

stages:
    - test
    - report
    
run_ui_tests:
    rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
    tags:
        - est
    stage: test
    before_script:
        - echo "Prepairing enviroment..."
        - python --version
        - pip install -r requirements.txt
    script:
        - echo "Executing ui tests with Pytest..."
        - pytest -v cio_tests
    timeout: 5h
    allow_failure: true
    artifacts:
        when: always
        paths:
          - allure-results/
        expire_in: 30 mins 30 sec
    
reporting:
    tags:
        - est
    stage: report
    needs: 
        - run_ui_tests
    script:
        - echo "Generating report ..."
        - dir
        - allure generate -c allure-results/ -o allure-report/
    artifacts:
        when: always
        paths:
            - allure-report/
        expire_in: 5 days
    after_script:
        - dir

При запуске пайплайн валится с ошибкой:

введите сюда описание изображения

Но ведь yml содержит джобу run_ui_tests. В чем причина такого поведения?

Ответы

▲ 0

Поскольку в вашем вопросе нет подробной информации, есть несколько вериантов:

  1. ваш schedule мог не прозойти:
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"

job'а run_ui_tests в стейдже test вообще была запущена?

  1. так же могло недождаться executor'а в условиях:
  tags:
    - est

и по истечении 5 часов job'а могла быть отменена.

Вам здесь не нужен needs, потому как:

Use needs to execute jobs out-of-order. You can ignore stage ordering and run some jobs without waiting for others to complete. Jobs in multiple stages can run concurrently.

а у вас тут четкая и логичная последовательность из stage'ей, которые по умолчанию выполняются последовательно: test и далее report.

Если вам, все так и нужно запускать report только при налчии артефактов, то воспользуйтесь rules:exists:

  rules:
    - exists:
      - allure-results/  # здесь желательно указать какой-то более конкретный
                         # файл, или маску, потому как папка может 
                         # существовать, а файл отсутствовать

Есть масса примеров, как правильно задавать маску с wildcards и без:

и т. д.

Так же можно запускать job'у но, к примеру, bash'ом проверять наличие и в зависимости от наличия файла отчета:

variables:
  REPORT_FILE_PATH: allure-results/report.txt

reporting:
  stage: report
  tags:
    - est
  script:
   - if test -f "$REPORT_FILE_PATH"; 
     then printf "Report:\n%s\n" "$(cat "$REPORT_FILE_PATH")";
     else echo "No report available."; exit 1; fi

Подробней о проверке существующего файла, или директории здесь.

Ну и наконец, для лучшей наглядности используйте yamllint, поскульку некоторые отступы оставляют желать лучшего. Его так же можно поставить pip install yamllint, что делает возможным его использование в CI. Есть так же eslint, который умеет автоматически форматировать yaml-файлы.