diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1eff7f5..b214d3f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,6 @@ stages: - generate - trigger -# Генерация динамического пайплайна на основе структуры live/ generate-pipeline: stage: generate image: alpine:latest @@ -18,10 +17,7 @@ generate-pipeline: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "main"' - if: '$CI_COMMIT_BRANCH =~ /^feature\/.*/' - tags: - - yc -# Запуск downstream пайплайна с сгенерированной конфигурацией trigger-downstream: stage: trigger trigger: @@ -33,5 +29,3 @@ trigger-downstream: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "main"' - if: '$CI_COMMIT_BRANCH =~ /^feature\/.*/' - tags: - - yc diff --git a/scripts/generate-pipeline.sh b/scripts/generate-pipeline.sh index 2602db0..d5eea65 100755 --- a/scripts/generate-pipeline.sh +++ b/scripts/generate-pipeline.sh @@ -1,20 +1,21 @@ #!/bin/bash set -e -# Скрипт для динамической генерации GitLab CI пайплайна -# Сканирует структуру live/ и создает джобы для каждого компонента - OUTPUT_FILE=".gitlab-ci.generated.yml" -# Функция для экранирования YAML yaml_escape() { echo "$1" | sed 's/"/\\"/g' } -# Начало файла cat > "$OUTPUT_FILE" << 'EOF' -# Автоматически сгенерированный файл GitLab CI -# НЕ РЕДАКТИРУЙТЕ ВРУЧНУЮ! Этот файл генерируется скриптом scripts/generate-pipeline.sh + +workflow: + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + - if: '$CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "main"' + - if: '$CI_COMMIT_BRANCH =~ /^feature\/.*/' + - if: '$CI_PIPELINE_SOURCE == "pipeline"' + - when: always stages: - validate @@ -23,26 +24,20 @@ stages: EOF -# Поиск всех terragrunt.hcl файлов в live/ find live -name "terragrunt.hcl" -not -path "*/.terragrunt-cache/*" | sort | while read -r config_file; do - # Извлечение пути компонента component_dir=$(dirname "$config_file") relative_path=$(echo "$component_dir" | sed 's|^live/||') - # Парсинг окружения и компонента из пути - # Формат: live/{env}/{component}/terragrunt.hcl + # live/{env}/{component}/terragrunt.hcl env=$(echo "$relative_path" | cut -d'/' -f1) component=$(echo "$relative_path" | cut -d'/' -f2) - # Пропускаем если это не компонент (например, env.hcl) if [ -z "$component" ] || [ "$component" = "$env" ]; then continue fi - # Формирование имени джобы job_prefix="${env}-${component}" - # Определение переменных окружения для Yandex Cloud case "$env" in stage) folder_var="YC_STAGE_FOLDER_ID" @@ -58,7 +53,6 @@ find live -name "terragrunt.hcl" -not -path "*/.terragrunt-cache/*" | sort | whi ;; esac - # Джоба validate cat >> "$OUTPUT_FILE" << EOF validate-${job_prefix}: stage: validate @@ -87,13 +81,13 @@ validate-${job_prefix}: rules: - if: '\$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '\$CI_COMMIT_BRANCH == "master" || \$CI_COMMIT_BRANCH == "main"' + - if: '\$CI_PIPELINE_SOURCE == "pipeline"' tags: - yc interruptible: true EOF - # Джоба plan cat >> "$OUTPUT_FILE" << EOF plan-${job_prefix}: stage: plan @@ -121,6 +115,7 @@ plan-${job_prefix}: rules: - if: '\$CI_COMMIT_BRANCH == "master" || \$CI_COMMIT_BRANCH == "main"' - if: '\$CI_PIPELINE_SOURCE == "merge_request_event"' + - if: '\$CI_PIPELINE_SOURCE == "pipeline"' tags: - yc interruptible: true @@ -133,7 +128,6 @@ plan-${job_prefix}: EOF - # Джоба apply (manual для prod, автоматическая для остальных) if [ "$env" = "prod" ]; then when_clause="manual" else @@ -167,6 +161,8 @@ apply-${job_prefix}: rules: - if: '\$CI_COMMIT_BRANCH == "master" || \$CI_COMMIT_BRANCH == "main"' when: ${when_clause} + - if: '\$CI_PIPELINE_SOURCE == "pipeline"' + when: ${when_clause} tags: - yc interruptible: true