Запуск другого задания как части задания в конвейере Gitlab CI

#gitlab #devops #gitlab-ci

#gitlab #devops #gitlab-ci

Вопрос:

Я настраиваю конвейер gitlab CI для своего проекта. На данный момент он состоит из 3 этапов — build, build-async и build-all и deployment_mode «dev». На этапе сборки, создания папок, будут выполняться архивы развертывания. В асинхронной сборке будут выполняться все асинхронные действия, такие как копирование наборов в корзину aws s3, и все сборки должны по существу состоять из сборки плюс этап асинхронной сборки. Предположим, что переменные среды stage и deployment_mode были настроены в переменных среды gitlab. Вот пример фрагмента —

 stages:   
  -build    
  -build-async  
  -build-all
  
dev-build:  
  image: python:3.7.4-alpine3.9  
  script:   
    - echo "Hello from dev-build. "  
  stage: build  
  tags:   
    - docker  
    - linux  
  only:  
    variables:  
        - $stage =~ /^build$/ amp;amp;  $deployment_mode =~ /^dev$/  

dev-build-async:  
  image: python:3.7.4-alpine3.9  
  script:   
    - echo "Hello from dev-build-async. "  
  stage: build-async  
  tags:   
    - docker  
    - linux  
  only:  
    variables:  
        - $stage =~ /^build-async$/ amp;amp;  $deployment_mode =~ /^dev$/  

dev-build-all:  
  image: python:3.7.4-alpine3.9  
  script:   
    - echo "Hello from dev-build-all. "  
  stage: build-all  
  tags:   
    - docker  
    - linux  
  needs: ["dev-build", "dev-build-async"]  
  only:  
    variables:  
        - $stage =~ /^build-all$/ amp;amp;  $deployment_mode =~ /^dev$/  
  

Я не могу запускать задания dev-build и dev-build-async как часть dev-build-all. У кого-нибудь есть идеи, как запустить их оба?

В этом случае результат, ожидаемый, когда я предоставляю stage как build-all и deployment-mode как dev, равен

 Hello from dev-build. 
Hello from dev-build-async. 
Hello from dev-build-all. 
  

Ответ №1:

dev-build-all находится на третьем этапе, означает, что оно выполняется таким образом:

dev-build -> dev-build-async -> dev-build-all

needs: это задание означает, что оно выполняется только после успешного выполнения обоих заданий. В данном случае это по умолчанию и needs: не требуется, если только вам не нужны артефакты.

Чтобы запустить dev-build и dev-build-async из dev-build-all , вы должны поместить оба задания на этапы после третьего. Необязательно использовать needs: в обоих из них. Невозможно вызвать предыдущий этап.

Пример:

 stages:   
  - build-all
  - build    
  - build-async  

dev-build-all:  
  image: python:3.7.4-alpine3.9  
  script:   
    - echo "Hello from dev-build-all. "  
  stage: build-all  
  tags:   
    - docker  
    - linux  
  only:  
    variables:  
        - $stage =~ /^build-all$/ amp;amp;  $deployment_mode =~ /^dev$/  

dev-build:  
  image: python:3.7.4-alpine3.9  
  script:   
    - echo "Hello from dev-build. "  
  stage: build  
  tags:   
    - docker  
    - linux
  needs:
    - job: dev-build-all
      artifacts: false
  only:  
    variables:  
      - $stage =~ /^build$/ amp;amp;  $deployment_mode =~ /^dev$/  

dev-build-async:  
  image: python:3.7.4-alpine3.9  
  script:   
    - echo "Hello from dev-build-async. "  
  stage: build-async  
  tags:   
    - docker  
    - linux  
  needs:
    - job: dev-build
      artifacts: true
  only:  
    variables:  
        - $stage =~ /^build-async$/ amp;amp;  $deployment_mode =~ /^dev$/  
  

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

1. Спасибо за предложения. Ваш CI изменяет неудачный конвейер с ошибкой «dev-build: требуется ‘dev-build-all’ » . Кроме того, здесь изменения предполагают, что для сборки dev-build требуется сначала выполнить dev-build-all, что не так. Я хочу, чтобы dev-build и dev-build-async обязательно запускались при выполнении dev-build-all. Итак, в этом случае результат, ожидаемый, когда я предоставляю stage как build-all и deployment-mode как dev, — это привет от dev-build. Привет от dev-build-async. Привет от dev-build-all.