Как переиспользовать функционал CI/CD из одного проекта в другом?

«Как переиспользовать функционал CI/CD из одного проекта в другом?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практике переиспользование CI/CD-логики критически важно для поддержания согласованности, скорости разработки и снижения ошибок. Вот основные подходы:

1. Шаблоны пайплайнов (Pipeline Templates)

GitLab CI: Используйте директиву include для подключения YAML-шаблона из другого репозитория.

# .gitlab-ci.yml в проекте
include:
  - project: 'devops/ci-templates'
    ref: main
    file: '/templates/docker-build.yml'

variables:
  DOCKER_IMAGE_NAME: "my-service"

# Можно расширить или переопределить джобы из шаблона
stages:
  - build
  - test
  - deploy

GitHub Actions: Создайте составные действия (Composite Actions) или шаблоны рабочих процессов (Reusable Workflows).

# .github/workflows/call-reusable.yml
jobs:
  call-reusable-workflow:
    uses: my-org/.github/.github/workflows/docker-publish.yml@main
    with:
      image-name: 'my-app'

2. Общие библиотеки (Shared Libraries)

Jenkins: Вынесите сложную логику в Shared Library, написанную на Groovy.

// Jenkinsfile
@Library('company-pipeline-lib@v2.0') _

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                buildDockerImage(
                    registry: 'my.registry.com',
                    dockerfilePath: 'Dockerfile.prod'
                )
            }
        }
    }
}

3. Вынос скриптов в отдельные артефакты

Создайте репозиторий с общими shell/Python-скриптами и используйте их в пайплайнах через загрузку.

# В шаге пайплайна
curl -sSL https://internal-tools.com/scripts/deploy-to-k8s.sh | bash -s -- --env staging

Или упакуйте скрипты в Docker-образ и используйте его как image для джоб.

4. Инфраструктура как код (IaC) для агентов

Используйте Terraform или CloudFormation для создания идентичных сред выполнения (runners/agents) для всех проектов, что гарантирует одинаковое окружение.

Преимущества такого подхода:

  • Стандартизация: Все команды используют одни и те же проверенные практики.
  • Безопасность: Централизованное управление секретами и проверками безопасности.
  • Скорость: Новые проекты запускают CI/CD за минуты, а не дни.
  • Обслуживаемость: Исправление бага или обновление версии инструмента происходит в одном месте.