Контейнеры и CI/CD
Генератор Jenkinsfile
Собирает декларативный Jenkinsfile: агент, стадии под стек, параллельные проверки, сборку и публикацию Docker-образа, выкладку по SSH только из main, триггеры, параметры, секреты через credentials() и уведомления. Команды пишутся в sh '…' — секрет не утечёт в лог.
Стек и агент
Меняет команды стадий
Стадии
checkout scm — забирает код из того же репозитория, где лежит Jenkinsfile.
Опции и триггер
Параметры сборки
Переменные окружения
После сборки
Jenkinsfile
pipeline {
agent {
docker {
image 'node:22-alpine'
}
}
options {
timeout(time: 30, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '20'))
disableConcurrentBuilds()
timestamps()
skipDefaultCheckout()
}
environment {
HOME = "${env.WORKSPACE}"
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install') {
steps {
sh 'npm ci'
}
}
stage('Lint') {
steps {
sh 'npm run lint'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
stage('Build') {
steps {
sh 'npm run build'
}
}
}
post {
always {
junit allowEmptyResults: true, testResults: 'reports/junit/*.xml'
archiveArtifacts artifacts: 'dist/**', allowEmptyArchive: true, fingerprint: true
}
cleanup {
cleanWs()
}
}
}
Что делает каждый блок
agent
agent { docker } — все стадии идут в контейнере из образа, окружение одинаковое на любом агенте. Нужен плагин Docker Pipeline и docker на агенте.
HOME в рабочей папке
Jenkins запускает контейнер от uid своего пользователя, которого в образе нет, и HOME оказывается «/». npm, pip и go пишут кеш в /.npm и /.cache и падают с EACCES — поэтому HOME перенесён в WORKSPACE.
Кавычки в sh
Команды записаны в одинарных кавычках: sh '…'. В двойных Groovy сам подставит секрет в строку ещё до запуска shell — он попадёт в аргументы процесса и в лог, а Jenkins напишет «insecure interpolation». В одинарных $SECRET разворачивает shell, и маскировка работает.
cleanup
cleanup выполняется последним, после always/failure/fixed — чистка рабочей папки не мешает junit и archiveArtifacts. cleanWs() — из плагина Workspace Cleanup.