задний план
От первоначального контроля версий кода SVN, ручной загрузки zip-архивов кода проекта по FTP до сегодняшнего контроля версий кода git, упаковки и развертывания в один клик jenkins — компания изначально совершила большой скачок от ручного к автоматическому. самостоятельно Проект все еще находится на исходной стадии изменения кода в локальном хранилище -> отправка удаленного хранилища github -> ручное извлечение кода последней ветки на вашем собственном сервере.невыносимо
Хорошо, давайте начнем нашу эволюциюбыть ленивымПутешествие, давайте проследим за моим ментальным путешествием и будем развиваться вместе.
Цель
Когда наше локальное хранилище изменено, а удаленное хранилище отправлено, сервер может автоматически получить последний код ветки и автоматически завершить развертывание проекта.
Предварительные условия(ерунда)
- Существует локальный склад, который может подключаться к удаленному складу и может отправлять код
- Серверные репозитории могут извлекать код из удаленных репозиториев.
- У удаленного склада есть функция вебхуков
действие
Если вы хотите делать хорошие вещи, вы должны сначала заточить свои инструменты.Прежде чем начать, необходимо понять принцип автоматического развертывания волны вебхуков;
Принцип автоматического развертывания вебхуков
本地仓库 -> (push提交代码) -> 远程仓库(webhooks钩子) -> (发送带有key的post请求) -> 测试/生产服务器(执行部署脚本)
Зная принцип, давайте посмотрим, что нам нужно подготовить:
- Удаленные репозитории с вебхуками (gitlab, github, gitee и т. д.)
- Сервисный и тестовый/производственный сервер, способный принимать почтовые запросы.
- Сценарий развертывания (.sh)
Настройки вебхуков удаленного склада
Настройки WebHooks для удаленных складов Вам нужно только найти определенные местоположения:
-
URL: Установите адрес почтового запроса (т.е. адрес службы сервера)
-
ключ: этот ключ может быть установлен или не установлен, рекомендуется установить его, чтобы предотвратить случайный запрос другим интерфейсом сервера, а затем автоматически сводить развертывание кода с ума, что эквивалентно проверке подписи.
Скрипт развертывания auto_build.sh
Сценарий развертывания (.sh) можно использовать бесплатно, и вы можете написать его вручную, как обычно, и создать файл.auto_build.sh
.Создайте каталог под Linux, используяmkdir 目录名
, создайте файл, используяtouch 文件名
.
PROJECTNAME_PATH = '/usr/local/src/项目目录';
echo "Starting deployment"
cd $PROJECTNAME_PATH
git checkout .
git pull
npm i
gulp release
pm2 start ecosystem.config.js
echo "Finished"
При выполнении скриптов обращайте внимание на права пользователей и глобальную установку основных команд.
Напишите службу deploy.js
Следующей большой задачей является создание службы, которая может принимать почтовые запросы с удаленных складов, что также очень просто.Вы можете использовать плагины.github-webhook-handlerС помощью , быстро настроить такой сервис, создать файлdeploy.js
.
ps: секрет здесь - ключ в настройке веб-хуков выше
var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/webhook', secret: 'myhashsecret' })
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(7777)
handler.on('error', function (err) {
console.error('Error:', err.message)
})
handler.on('push', function (event) {
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref)
})
handler.on('issues', function (event) {
console.log('Received an issue event for %s action=%s: #%d %s',
event.payload.repository.name,
event.payload.action,
event.payload.issue.number,
event.payload.issue.title)
})
PS: Вы также можете настроить отправку электронного письма, чтобы напомнить себе, когда кто-то поднимает вопросы на ваш склад 23333333
Если служба не запускается, возникает ошибка, аналогичнаяError: Cannot find module 'github-webhook-handler'
, но пакет зависимостей был установлен глобально. Метод подтверждения:
npm root -g // 查看npm全局安装路径
=> /root/.nvm/versions/node/v9.10.1/lib/node_modules
cd /root/.nvm/versions/node/v9.10.1/lib/node_modules
ll // 查看目录文件确认依赖是否安装
После подтверждения установки ее можно решить, выполнив следующие действия:
- Войти
deploy.js
каталог - Выполните следующую команду
npm link github-webhook-handler
Теперь все, что вам нужно сделать, это поставитьauto_build.sh
а такжеdeploy.js
Комбинированный.
Прочитайте приведенный выше код, вы найдетеhandler
слушалpush
Событие вызывает соответствующую функцию, поэтому все, что вам нужно сделать, это выполнить в функцииauto_build.sh
команда, вам нужноdeploy.js
Добавьте и измените следующий код
// 新增runCmd函数
funciton runCmd(cmd, args, callback) {
var spawn = require('child_process').spawn; // node子进程
var child = spawn(cmd, args);
var response = '';
child.stdout.on('data', buffer => response += buffer.toStirng());
child.stdout.on('end', () => callback(response));
}
// 修改push监听事件 我这里auto_build.sh和deploy.js位于同一目录文件中
handler.on('push', function(event) {
runCmd('sh', ['./auto_build.sh'], function(text) { console.log(text) });
});
пс: можно пройтиconsole.log()
Вывод соответствующих подсказок на соответствующих шагах для облегчения проверки ошибок
Запустите службу deploy.js
Мы надеемся, что служба развертывания всегда может работать на сервере, а сценарий развертывания может выполняться в обычном режиме, когда удаленный склад отправляет почтовый запрос, чтобы сообщить нам, что у нас есть новый код. В настоящее время нам нужно запустить его как процесс демонаdeploy.js
Служба, когда служба неожиданно выходит из строя, она может перезапустить службу, полностью освобождая наши руки.
Вот два метода на выбор, оба можно сделать черезnpm
Установить:
-
forever
Это делается для того, чтобы при завершении процесса приложение автоматически перезапускалось.
forever start deploy.js // 启动服务进程
forever list // 列出所有进程
forever logs id // 查看进程输出日志
forever stop id // 停止服务进程
forever restart id // 重启服务进程
forever -m 5 deploy.js // 最多重启次数为5
-
pm2
Мощный, кроме перезапуска процесса, еще умеет собирать логи и мониторить в реальном времени.
pm2 start deploy.js // 启动服务进程
pm2 list // 列出所有进程
pm2 logs id // 查看进程输出日志
pm2 stop id // 停止服务进程
pm2 restart id // 重启服务进程
pm2 delete id // 删除服务进程
Обратный прокси Nginx
Поскольку мой сервер находится в облаке Tencent, порт 7777 не был освобожден, поэтому я передаю обратный прокси-сервер Nginx группе безопасности сервера, чтобы открыть порт.
Обязательно подтвердите, прежде чем отправлять запрос на пост-тест из удаленного репозитория.
Ваш собственный порт группы безопасности сервера был освобожден!!!
Ваш собственный порт группы безопасности сервера был освобожден!!!
Ваш собственный порт группы безопасности сервера был освобожден!!!
Важно сказать три раза!Ниже мой конфиг nginx
server {
listen 8080;
server_name localhost;
location /webhook {
proxy_pass http://127.0.0.1:7777;
}
}
PS: перезапустите nginx под Linux и введите каталог sbin nginx, чтобы запустить команду./nginx -s reload
Bug
Запуск Nginx!Запуск службы развертывания.Настроен веб-хук удаленного хранилища!Нажмите кнопку тестирования!
Потом......
сообщите об ошибке!!!(Вынужденная улыбка и улыбка исчезают.jpg
{
"error": "No X-Hub-Signature found on request"
}
После долгого просмотра... Я вспомнил, что удаленным репозиторием кода моего проекта является облако кода gitee.com, потому что частный частный репозиторий github должен быть оплачен до февраля 2019 года, поэтому я выбираю код проекта с участием частного кода облако используется как удаленный склад, но мой плагинgithub-webhook-handler
!!!!Есть призраки если ты понимаешь ТАТ
Все в порядке, маленькая проблема, все кончено, как может человек сказать нет!
Сначала зайдите на github, чтобы найти, есть ли подключаемый модуль веб-хука, соответствующий gitee, если нет, разветвите его.github-webhook-handler
Спуститесь и измените его, чтобы он адаптировался к облаку кода gitee. Конечно же, я нашел егоgitee-webhook-middleware
,Потомdeploy.js
Измени это
var createHandler = require('gitee-webhook-middleware');
var handler = createHandler({ path: '/webhook', token: '你的key' });
Перезапустите службу и нажмите Test!
{
"ok": true
}
Идеально !
На сервере я увидел, что код проекта все еще старый, и есть еще ямки... Позже я обнаружил, что событие post request giteePush Hook
// handler.on('push', function() {});
handler.on('Push Hook', function() {});
На этом этапе повторите проверку, код проекта успешно обновлен!
результат
Лень успешна!Лень действительно первая производительность инженеров
Теперь всякий раз, когда я отправляю код из локального репозитория в удаленный репозиторий, сервер извлекает последнюю версию кода и автоматически развертывает ее.
Это всего лишь моя простая попытка Мы можем полностью расширить автоматизированное тестирование, автоматизировать развертывание и завершить CI/CD для совместной разработки несколькими людьми, значительно сократив трудозатраты, уменьшив количество человеческих ошибок и повысив эффективность работы каждого.