Как объединить или добавить новый этап в gitlab-ci.yml, который включает в себя общий шаблон yml со списком этапов по умолчанию и определениями заданий

#gitlab #gitlab-ci

#gitlab #gitlab-ci

Вопрос:

В настоящее время в нашем проекте gitlab-ci.yml включает в себя общий шаблон yml со стадиями по умолчанию и определениями заданий. Я хочу включить этап и соответствующую работу, специфичную для этого проекта, который должен выполняться между этапами, определенными в шаблоне yml. Ниже приведены примеры файлов yml, которые представляют сценарий, над которым я работаю.

  1. .mvn-template.yml
 stages:
  - build
  - static-analysis
  - unit-test
  - package
  - integration-test

compile:
  stage: build
  tags:
    - docker
  artifacts:
    paths:
      - target/
    expire_in: 14 days
  script:
    - mvn $MAVEN_CLI_OPTS compile
  interruptible: true
  
//and job definitions for - static-analysis
//  - unit-test
//  - package
//  - integration-test
  
  1. gitlab-ci.yml
 include:
  - project: 'xxx/common-pipeline'
    ref: x.x.x
    file: '/.mvn-template.yml'
...
  

Теперь я хочу включить новый этап, специфичный для этого проекта, скажем, тестирование контракта, между ними

  • пакет
  • интеграция-тест

Таким образом, контрактное тестирование должно выполняться после пакета и перед интеграционным тестированием.

Поскольку это специфично для этого проекта, я не могу включить в общий шаблон. Таким образом, должен быть включен в gitlab-ci.yml.

Не удалось выяснить, как это сделать. Я ранее работал с GitHub и совсем недавно начал работать над проектом с GitLab.

Могу ли я включить этап в общий шаблон, но не определять там соответствующую работу. И включить определение задания в gitlab-ci.yml? Не уверен, что это правильный путь. Вероятно, могли бы быть лучшие варианты для обработки такого сценария.

Пожалуйста, помогите.

Комментарии:

1. Я думаю, вы можете эмулировать это, используя needs: функцию, как описано в gitlab.com/gitlab-org/gitlab/-/issues/30632 и docs.gitlab.com/ee/ci/yaml/index.html#needs . То есть вы не можете ввести новый этап, но вы можете добавлять новые узлы в базу данных заданий практически произвольно.

Ответ №1:

На мой взгляд, вы можете сделать это 2-мя различными способами :

  1. Добавьте этап contract-testing в свой файл шаблона и определите конкретную работу в .gitlab-ci.yml вашем проекте. Конфигурация будет действительной: gitlab объединит и расширит includes / anchors, чтобы в конце создать один gitlab-ci. Примечание: вы можете определить этап, даже если нет задания, использующего этот этап (своего рода пустой этап), это не приведет к возникновению ошибки.

  2. Если вы не хотите, чтобы эта «пустая стадия» включалась во все ваши проекты, ссылающиеся на include , вы можете переместить stages шаблон за пределы себя и поместить их в .gitlab-ci.yml свой проект. Как и в случае с решением 1), вам нужно определить задание в .gitlab-ci.yml вашем проекте (не в шаблоне).

Комментарии:

1. Мне приходится следовать варианту 2, поскольку у меня есть несколько шаблонов, которые мы вводим, и может быть только один stages раздел.