На главную

Контейнеры и 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.