Конвертация и миграция: от Freestyle к Jenkinsfile

Рейтинг: 71.7% · 16 голосов
Подробный курс по Jenkins и CI/CD: установка и настройка, плагины и Configuration as Code, конвейеры (pipeline) и Jenkinsfile, declarative и scripted, агенты, Docker и Kubernetes, общие библиотеки на Groovy, безопасность и credentials, интеграции (SonarQube, артефакты), траблшутинг. Актуально на 2026.
Ответить
Аватара пользователя
Andrey_CICD
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Конвертация и миграция: от Freestyle к Jenkinsfile

Сообщение Andrey_CICD »

Оглавление курса (47)
  1. Что такое Jenkins и зачем нужен CI/CD
  2. Jenkins в 2026: версии, экосистема и сравнение с GitLab CI и GitHub Actions
  3. Архитектура Jenkins: контроллер, агенты, узлы и исполнители
  4. Установка Jenkins: пакеты, Docker и Kubernetes
  5. Первичная настройка Jenkins: мастер, плагины, пользователи
  6. Плагины Jenkins: установка, обновление и ключевой набор
  7. Configuration as Code (JCasC): настройка Jenkins декларативно
  8. Конвейеры Jenkins и Jenkinsfile: pipeline as code
  9. Scripted против Declarative: два синтаксиса конвейера
  10. Структура конвейера: node, stage, steps и первый pipeline
  11. Генератор сниппетов, запуск конвейера и Replay
  12. Типы заданий Jenkins: Freestyle, Pipeline, Multibranch и Organization
  13. Декларативный конвейер: структура pipeline, agent, stages
  14. agent, environment и переменные в конвейере
  15. tools, options, parameters и triggers в декларативном конвейере
  16. stages, parallel и matrix: организация этапов
  17. Условное выполнение when и блок post
  18. Триггеры сборки: webhook от GitHub, SCM polling и расписание
  19. Параметры сборки и пользовательский ввод
  20. Управление потоком: timeout, retry, sleep и waitUntil
  21. Параллелизм и блокировки: parallel, lock, milestone
  22. Постобработка и уведомления о результате сборки
  23. Groovy для Jenkins: основы скриптового конвейера
  24. Скриптовый конвейер: логика, циклы и функции
  25. Общие библиотеки Jenkins: Shared Libraries
  26. Подключение и загрузка общих библиотек
  27. Шаги оболочки: sh, bat, powershell и коды возврата
  28. Переменные среды, withEnv и рабочие пространства
  29. Работа с файлами, артефактами и отпечатками
  30. Сборка проектов в конвейере: Maven, Gradle, npm
  31. Качество кода: SonarQube и покрытие тестами
  32. Управление артефактами: публикация в Nexus и Artifactory
  33. Docker в Jenkins: образы как агенты сборки
  34. Сборка и публикация Docker-образов из конвейера
  35. Jenkins в Kubernetes: динамические pod-агенты
  36. Развёртывание в Kubernetes из конвейера
  37. Безопасность Jenkins: аутентификация и матрица прав
  38. Учётные данные Jenkins: credentials в конвейере
  39. Безопасность сценариев: Groovy sandbox и Vault
  40. Уведомления и отчёты: email, Slack, Telegram, HTML
  41. Blue Ocean и интерфейс Jenkins в 2026
  42. Автоматизация Jenkins: CLI, REST API и script console
  43. Поиск и устранение неисправностей: читаем логи конвейера
  44. Типичные ошибки конвейера: сериализация и неутверждённый код
  45. Эксплуатация Jenkins: бэкап, обновление, масштабирование
  46. Конвертация и миграция: от Freestyle к Jenkinsfile (вы здесь)
  47. Итог: сквозной CI/CD конвейер и Jenkins против альтернатив в 2026
У тебя в Jenkins живёт пара сотен Freestyle-джоб. Каждая - это набор галочек и текстовых полей в веб-форме. Кто-то однажды настроил сборку, ткнул в "Execute shell", вписал туда тридцать строк баша, добавил пять плагинов post-build. Прошло три года. Этот человек уволился. И теперь никто не знает, что именно делает джоба "deploy-prod-final-v2", потому что её логика существует ровно в одном месте - в базе Jenkins, без истории, без ревью, без бэкапа кроме как через config.xml, который никто не читает.

Это и есть главная боль, которую решает jenkins миграция на пайплайны. Freestyle - это конфигурация, спрятанная в UI. Pipeline - это конфигурация как код, которая лежит рядом с самим проектом в Git. В этом уроке разберём, зачем и как делать перевод на pipeline без простоя, как разложить старую джобу на стейджи, перенести секреты и параметры, и как не уронить прод во время переезда. Будет чек-лист, который можно сразу пускать в работу.

Зачем вообще нужна jenkins конвертация Freestyle в Pipeline

Давай честно: Freestyle работает. Если джоба собирает один проект и больше ничего, переписывать её ради моды смысла нет. Но как только логика растёт, Freestyle начинает мешать. Вот реальные причины, по которым стоит делать перевод.
  • Версионирование. Jenkinsfile лежит в репозитории. Любое изменение сборки проходит через коммит, а значит через историю, blame и теги. Откатить сломанный деплой - это git revert, а не археология в UI.
  • Ревью. Изменения в Freestyle-джобе никто не видит. Изменения в Jenkinsfile уезжают в pull request, и коллега может сказать "ты тут забыл таймаут". Это нормальный процесс инженерии вместо ковбойства.
  • Воспроизводимость. Pipeline as Code легко скопировать в другой проект, шаблонизировать через shared library, прогнать локально глазами. Freestyle копируется только мышкой и только криво.
  • Восстановление. Упал сервер Jenkins - ты разворачиваешь чистый контроллер (в идеале через JCasC, об этом был отдельный урок) и подтягиваешь Jenkinsfile из Git. Парк Freestyle-джоб без бэкапа config.xml восстанавливать нечем.
Когда говорят про jenkins freestyle pipeline, в 2026 году подразумевают именно declarative pipeline - это стандарт по умолчанию. Scripted-синтаксис (голый Groovy) держим в голове для случаев, где нужна настоящая динамика: генерация стейджей в цикле, сложные условия, работа с коллекциями. Для 90 процентов джоб declarative читается лучше и прощает ошибки.

Изображение

Как разобрать Freestyle на стейджи

Ключ к миграции - перестать думать о джобе как о свалке шагов и начать думать о ней как о конвейере с фазами. Любая Freestyle-джоба раскладывается на четыре-пять логических кусков, и каждый кусок становится стейджем.
  • SCM (раздел "Source Code Management") -> блок checkout или просто опция в declarative.
  • Build (шаги "Execute shell" / "Invoke Maven") -> stage('Build').
  • Test (отдельные шаги тестов) -> stage('Test').
  • Post-build actions (архив артефактов, публикация отчётов, уведомления) -> секция post.
Возьмём типичную Freestyle-джобу для Maven-проекта: чекаут из Git, mvn clean package, прогон тестов, архивирование jar, отправка в Slack при падении. Вот её прямой эквивалент в виде jenkins jenkinsfile:

Код: Выделить всё

pipeline {
    agent any

    options {
        timeout(time: 30, unit: 'MINUTES')
        buildDiscarder(logRotator(numToKeepStr: '20'))
        disableConcurrentBuilds()
    }

    tools {
        maven 'maven-3.9'
        jdk 'jdk-21'
    }

    stages {
        stage('Build') {
            steps {
                sh 'mvn -B clean package -DskipTests'
            }
        }

        stage('Test') {
            steps {
                sh 'mvn -B test'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                }
            }
        }
    }

    post {
        success {
            archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
        }
        failure {
            slackSend channel: '#ci', message: "Сборка ${env.JOB_NAME} #${env.BUILD_NUMBER} упала"
        }
    }
}
Обрати внимание: чекаут тут не написан явно. Когда Jenkinsfile лежит в самом репозитории (Pipeline from SCM или Multibranch), Jenkins делает checkout автоматически перед стейджами. То, что в Freestyle было отдельной секцией SCM с галочками, в pipeline превращается в одну строку конфигурации джобы или вовсе исчезает. Архивирование артефактов и Slack-уведомление, которые в Freestyle жили в post-build actions, переехали в секцию post - и теперь видно, что артефакт сохраняется только при успехе, а уведомление летит только при падении. В UI это было размазано по форме, тут - на ладони.

Конвертация scripted в declarative и помощник миграции

Часть джоб у тебя может быть уже на pipeline, но написана в scripted-стиле - сплошной node { ... } с Groovy-логикой. Это законно, но читать такое тяжело, особенно новичкам. Перевод scripted -> declarative обычно стоит того.

Сравни. Было (scripted):

Код: Выделить всё

node {
    stage('Build') {
        checkout scm
        sh 'make build'
    }
    stage('Test') {
        sh 'make test'
    }
}
Стало (declarative):

Код: Выделить всё

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'make build'
            }
        }
        stage('Test') {
            steps {
                sh 'make test'
            }
        }
    }
}
Декларативный вариант навязывает структуру: чёткие секции, валидация синтаксиса до запуска, человекочитаемый post. Если внутри стейджа всё же нужна капля императивной логики - declarative разрешает блок script { ... }, куда можно засунуть кусок Groovy, не ломая остальную структуру. Это спасательный люк, а не образ жизни: если script разрастается на пол-Jenkinsfile, значит этому стейджу место в shared library.

Для большого парка джоб есть официальный помощник - плагин Declarative Pipeline Migration Assistant. Он берёт Freestyle-джобу и генерирует из неё черновой Jenkinsfile. Полезно понимать его границы: он работает best-effort. Что умеет распарсить - конвертирует, что не умеет (экзотические плагины post-build) - оставляет в виде заглушки-стейджа с комментарием "допили руками". Не жди, что он выплюнет готовый продакшен-конвейер. Это стартовая болванка процентов на семьдесят, остаток ты дописываешь сам. Но как способ за минуту получить скелет вместо чистого листа - вещь рабочая.

Перенос секретов и параметров

Тут чаще всего обжигаются. В Freestyle секреты подключались галочкой "Use secret text(s) or file(s)" в build environment, а параметры - через "This project is parameterized". В Jenkinsfile это явный код.

Параметры объявляются в секции parameters:

Код: Выделить всё

pipeline {
    agent any

    parameters {
        string(name: 'TARGET_ENV', defaultValue: 'staging', description: 'Куда катим')
        choice(name: 'REGION', choices: ['eu', 'us', 'asia'], description: 'Регион деплоя')
        booleanParam(name: 'RUN_SMOKE', defaultValue: true, description: 'Гонять ли smoke-тесты')
    }

    stages {
        stage('Deploy') {
            steps {
                sh "./deploy.sh --env ${params.TARGET_ENV} --region ${params.REGION}"
            }
        }
    }
}
Маленькая, но важная деталь: после добавления блока parameters первый запуск джобы подхватит их со значениями по умолчанию, а форму выбора параметров ты увидишь только со второго прогона. Это сбивает с толку при миграции - не пугайся.

Секреты в declarative подключаются двумя способами. Если секрет нужен во всём пайплайне - через environment с хелпером credentials():

Код: Выделить всё

pipeline {
    agent any

    environment {
        REGISTRY = credentials('docker-registry-creds')
    }

    stages {
        stage('Push') {
            steps {
                // REGISTRY_USR и REGISTRY_PSW появляются автоматически
                sh 'echo "$REGISTRY_PSW" | docker login -u "$REGISTRY_USR" --password-stdin registry.local'
            }
        }
    }
}
Для credentials типа username/password Jenkins сам создаёт три переменные: REGISTRY (в формате user:pass), REGISTRY_USR и REGISTRY_PSW. Если же секрет нужен точечно в одном стейдже - бери withCredentials, это чище с точки зрения области видимости:

Код: Выделить всё

stage('Deploy') {
    steps {
        withCredentials([usernamePassword(
            credentialsId: 'prod-ssh',
            usernameVariable: 'SSH_USER',
            passwordVariable: 'SSH_PASS')]) {
            sh './remote-deploy.sh'
        }
    }
}
Главное правило переноса секретов: ID credentials в новом Jenkinsfile должен совпадать с тем, что уже лежит в Jenkins Credentials Store. Сами секреты в Git не уезжают никогда - в коде только ссылка по ID. Если переезжаешь на новый контроллер, заранее заведи credentials с теми же ID, иначе пайплайн упадёт на первом же шаге.

Типичные грабли
  • Многострочный shell теряет поведение. В Freestyle каждый шаг "Execute shell" по умолчанию падает на первой ошибке. В sh внутри Jenkins тоже, но если ты склеил несколько команд через точку с запятой в одну строку - падение проглотится. Ставь set -e в начало скрипта или используй set -euo pipefail.
  • Забытый agent. В declarative блок agent обязателен на уровне pipeline или в каждом стейдже. Забудешь - валидация не пропустит.
  • Переменные окружения из Freestyle. Глобальные env, которые ты настроил в "Manage Jenkins", в Multibranch-пайплайне могут вести себя иначе. Лучше объявлять нужное явно в секции environment.
  • Слэш в имени ветки. При переезде на Multibranch ветка feature/foo превращается в имя джобы feature%2Ffoo. Если на эту джобу кто-то ссылается как на downstream - ссылка сломается.
  • Параллельный запуск. Freestyle-джоба деплоя часто молча запрещала параллельные сборки настройкой. В pipeline добавь disableConcurrentBuilds() в options, иначе два деплоя в прод поедут одновременно.
И главное про "не сломать прод": не выпиливай старую Freestyle-джобу в день миграции. Подход безопасного переезда - создай pipeline-джобу рядом, под другим именем, погоняй её на не-прод окружении, сравни артефакты и логи с эталоном от Freestyle. Только когда новая джоба дала идентичный результат несколько раз - переключай вебхуки и отключай (не удаляй сразу, а именно disable) старую. Откат тогда занимает один клик.

Мини-лаба

Возьми любую свою простую Freestyle-джобу (или создай тестовую с чекаутом и одним sh-шагом) и проделай руками:
  • Выпиши на бумаге, из каких логических фаз состоит джоба: SCM, сборка, тесты, post-build.
  • Установи плагин Declarative Pipeline Migration Assistant и прогони через него джобу. Посмотри, что он сгенерил и где оставил заглушки.
  • Допиши черновой Jenkinsfile до рабочего: добавь options с timeout и buildDiscarder, перенеси post-build в секцию post.
  • Заведи в Credentials Store тестовый secret text и подключи его через withCredentials.
  • Создай Pipeline-джобу "from SCM", указывающую на Jenkinsfile в репозитории, запусти и сверь результат со старой Freestyle.
Контрольные вопросы
  • Почему Jenkinsfile в Git выигрывает у Freestyle-джобы с точки зрения ревью и восстановления после сбоя?
  • Чем отличается подключение секрета через environment + credentials() от withCredentials, и когда выбирать каждый способ?
  • Что реально делает плагин Declarative Pipeline Migration Assistant и почему его вывод нельзя сразу катить в прод?
  • Как организовать переезд большой Freestyle-джобы деплоя, чтобы в случае проблемы откатиться одним движением?
Итог

Миграция с Freestyle на Jenkinsfile - это не про синтаксис, а про то, чтобы вытащить логику сборки из тёмного угла веб-формы на свет Git, под ревью и под версионирование. Раскладывай джобу на стейджи, переноси SCM, сборку, тесты и post-build в declarative-структуру, аккуратно переноси параметры в parameters и секреты по ID, не трогая сами значения. Используй помощник миграции как генератор болванки, а не как готовое решение. И никогда не убивай рабочую Freestyle-джобу в тот же день, когда запустил её замену - дай новой доказать себя на параллельных прогонах. Тогда переезд пройдёт без приключений на проде.
👍5 ❤️4 🔥1 😄 🤔
Аватара пользователя
randakk
Сообщения: 1
Зарегистрирован: 12 май 2026, 23:41

Re: Конвертация и миграция: от Freestyle к Jenkinsfile

Сообщение randakk »

Долго не мог понять, почему форма параметров не появляется при первом запуске после переезда. Думал баг, а это оказывается штатное поведение. Спасибо, что предупредили, сэкономили мне час дебага.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
grpc_main
Сообщения: 1
Зарегистрирован: 29 май 2026, 15:49

Re: Конвертация и миграция: от Freestyle к Jenkinsfile

Сообщение grpc_main »

Помощник миграции реально сэкономил время на десятке однотипных джоб, но половину post-build шагов пришлось дописывать руками, как тут и сказано. Главное было не забыть про disableConcurrentBuilds на деплое.
👍 ❤️1 🔥 😄 🤔1
Ответить
← Предыдущая глава
Эксплуатация Jenkins: бэкап, обновление, масштабирование
Следующая глава →
Итог: сквозной CI/CD конвейер и Jenkins против альтернатив в 2026

Все главы курса «Jenkins: конвейеры CI/CD от основ до продакшена»

Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое jenkins простыми словамипервичная настройка jenkins после установкикакие плагины jenkins нужны новичкуcicd для начинающих с чего начать на jenkinsjenkinsfile declarative или scripted что выбратьjenkins shared library как создать и подключить

Вернуться в «Jenkins: конвейеры CI/CD от основ до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя