Был ли у вас опыт написания Bash-скриптов в Jenkins?

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

Ответ

Да, постоянно использую Bash-скрипты в Jenkins для автоматизации этапов сборки, тестирования и деплоя. Работаю как с Declarative, так и с Scripted Pipeline.

Основные практики и примеры:

  • Встраивание в sh steps: Для коротких операций скрипт пишется прямо в пайплайне.
  • Вынос в отдельные файлы: Для сложной логики создаю отдельные .sh файлы в репозитории и вызываю их. Это улучшает читаемость и позволяет переиспользовать код.

Пример Declarative Pipeline с встроенным Bash:

pipeline {
    agent any
    environment {
        ARTIFACT_NAME = "app-${env.BUILD_ID}.tar.gz"
    }
    stages {
        stage('Build & Test') {
            steps {
                sh '''
                    #!/bin/bash
                    set -xeo pipefail  # Включаем строгий режим: трассировка, выход при ошибке, ошибки в пайпах
                    echo "Building artifact: $ARTIFACT_NAME"
                    ./build.sh --output "$ARTIFACT_NAME"

                    # Проверка существования артефакта
                    if [[ ! -f "$ARTIFACT_NAME" ]]; then
                        echo "ERROR: Artifact not created!"
                        exit 1
                    fi

                    # Пример обработки JSON (например, из конфига)
                    VERSION=$(jq -r '.version' package.json)
                    echo "Project version is: $VERSION"
                '''
            }
        }
        stage('Deploy to Staging') {
            steps {
                sh './deploy.sh staging'  # Вызов внешнего скрипта
            }
        }
    }
}

Ключевые моменты: Всегда проверяю коды возврата команд, использую set -e для немедленного выхода при ошибке, активно применяю jq и yq для работы с конфигурационными файлами, а переменные Jenkins передаю в скрипт через окружение.