Авторизация
Новости компании
Отзывы
CI/CD интеграция сайта из GitHub по FTP
Для создания процесса CI/CD интеграции и организации автоматической сборки приложения или сайта на своем сервере, прежде всего, следует спланировать структуру файлов в директории сайта.
Структура проекта сайта
Если сайт это просто страницы и фронт части не нужен бэкенд, то задача немного упрощается и файлы сайта будут заливаться в корень директории, где apache по умолчанию будет искать index.html и загружать его с подключенным бандлом сайта.
Однако же если сайту необходима связь со своим nodejs сервером (в проекте есть файл server.js и подобные), то файлы лучше распределить по разным директориям и не сваливать все в кучу, чтобы не получить путаницу с новыми папками при дальнейшем развитии проекта. Лучше всего создать папки
client/
server/
где в client будут находиться файлы фронтенд части, а в server соответственно бэкенд. При этом, создавать их нужно от имени того FTP пользователя, который при интеграции сайта будет служить для загрузки файлов из Jenkins.
Но apache сервер ищет index.html в корне директории сайта, а не в client/. Чтобы это исправить в файле apache2.conf ( или httpd.conf в зависимости от ОС и системы управления сервера, для Vestacp это [user]/conf/web/[site.apache2.conf] ) нужно найти секцию настроек виртуального хоста вашего сайта и в DocumentRoot дописать
/client/build
"build" - это папка, в которую собирается бандл сайта, она может быть и другой (напр. dist). Затем перезапуск, чтобы применить изменения:
/etc/init.d/apache2 restart
Установка Jenkins
Затем нужно установить Jenkins, как это сделать описано здесь.
Настройка Jenkins
Сначала нужно установить плагин Publish Over FTP, в панели Jenkins переходим в Настроить Jenkins -> Управление плагинами, на вкладке Доступные вводим over ftp в поиск и устанавливаем плагин без перезагрузки Jenkins.
Затем переходим в Настроить Jenkins ->Конфигурация системы, долго скроллим до раздела Publish over FTP и добавляем данные FTP подключения для директории своего сайта, при этом нужно запомнить введённое название подключения, оно будет использовано далее (здесь отмечу его как <ftp_connection_name>
).
После этого переходим на главную страницу Jenkins и жмем Создать Item, вводим Имя и выбираем Pipeline в списке конфигураций нового проекта.
Откроются настройки нового проекта интеграции, где указываем:
- Ставим галочку GitHub project
- В Project url указываем путь к проекту на GitHub без .git в конце (ex. https://github.com/[user]/[project]/)
- В разделе Build Triggers ставим галочку GitHub hook trigger for GITScm polling
- В Pipeline выбираем Pipeline script from SCM, SCM выбираем Git, в Repository URL указываем путь к проекту на GitHub с .git в конце, в Branches to build указываем нужную ветку из которой будет происходить сборка и в Script Path названия файла-конфигурации Jenkins (можно оставить Jenkinsfile)
- Жмем Сохранить
Создание Jenkinsfile
Далее создадим файл Jenkinsfile в корне проекта с минимальными настройками:
pipeline { agent { docker { image 'node:lts-buster-slim'
args '-p 3000:3000' } } stages { stage('
install
') {
steps {
dir('client') { sh 'npm install'
}
dir('server') { sh 'npm install'
}
} }
stage('Build') {
}
steps {
sh 'npm run build'
} } }
с такими настройками уже можно протестировать сборку проекта, но пока билд не будет загружаться по FTP на сервер.
(! Выполнение команд настройте в зависимости от раздела "scripts" в файле package.json и структуры папок.)
stage('Upload') {
steps {
ftpPublisher alwaysPublishFromMaster: false,
continueOnError: false,
failOnError: false,
masterNodeName: '',
paramPublish: null,
publishers: [[configName: '[<ftp_connection_name>]',
transfers: [[
asciiMode: false,
cleanRemote: false,
excludes: '',
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '**/*'
]],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false
]]
}
}
где <ftp_connection_name>
- это название созданного ранее FTP подключения в настройках Jenkins
Настройка GitHub
В заключении идем на сайт Github, открываем свой репозиторий и переходим в настройки -> Settings -> Webhooks и добавляем URL
http://[jenkins_ip]:[jenkins_port]/github-webhook/
Content type ставим application/json и жмем Add webhook
Проверка
В завершении проверим как всё работает, для этого, либо в панели Jenkins жмем кнопку Собрать сейчас в задаче, либо пушим что-то в репозиторий проекта. Далее в панели Jenkins переходим в появившееся задание сборки и заходим в Console Output, чтобы просмотреть результат, он должен быть "SUCCESS"