Почему?
Зачем внедрять автоматическое развертывание?
В последние 2 месяца я был занят организацией блогов.Каждый программист мечтает о блоге (конечно не исключено, что некоторые нет).Я последовательно использовал различные системы блогов:
Все эти причины я не использовал, а сам написал систему блога:vue-blog-generater[Пожалуйста, позвольте мне попросить еще одну волну звезд]кликните сюдаПосмотреть документацию
Зачем? Потому что мне нужна система, с которой я хорошо знаком, если есть какие-либо проблемы, я знаю, в чем проблема, потому что эти предыдущие системы, конечно, очень хороши, но будь то редактирование темы, или развертывание и настройка кода, Ни один из них не соответствует моим требованиям.
Сказав это, после того, как я реализовал основные функции и страницы, я некоторое время был счастлив, а затем перенес несколько значимых сообщений в блог, которые включали публикацию и развертывание.
мы все знаем одногоvue-cli
Сгенерированные проекты, обычно упакованные каталогиdist
, то код, который мне действительно нужно смонтировать на сервере, таков:dist
код в .
Тогда по здравому смыслу процесс обновления всей статьи должен быть таким:
- новый файл, напишите
markdown
Сообщение блога -
npm run build
скомпилировать вdist
- Буду
dist
Файлы загружаются в соответствующий репозиторий кодаdist
- Синхронно загружать файлы текущего генератора в соответствующий репозиторий кода
main
- войти на сервер,
git clone dist仓库
в указанное место
Видите, просто обновить статью, но это требует так много шагов, вам не кажется, что это очень хлопотно? Проблема правильная, здесь мы должны решить эту проблему.
Как сделать?
Я понимаю, почему автоматическое развертывание необходимо, но где я начинаю?
Прежде чем что-то делать, нам нужно прояснить свое мышление. Это на самом деле очень просто:
- новый файл, напишите
markdown
Боуэн [Этот шаг невозможно избежать] -
npm run build
скомпилировать вdist
,воплощать в жизньbuild.js
среднее суждениеconfig.js
Это настроен вdist
Адрес удаленного склада.
Если настроено, текущий проектdist
каталог, продолжитьgit
Инициализировать при загрузке общего кода вMain仓库
Здесь он не настроен по умолчанию.Main
Склад эквивалентен удаленному складу, связанному с локальным складом. - к местному
dist
Каталог связывается с удаленным складом и отправляет код на указанныйdist
на соответствующем удаленном складе. - Сервер настроен, когда он получает
POST
При запросе сделать соответствующий ответ: вытащить пультdist
складmaster
ветвление и принудительная перезапись локальногоmaster
ветвь
Реализация?
Давайте сначала посмотрим, как реализовать контент, упомянутый во втором и третьем.
- Подготовка: Установите необходимые библиотеки
shell
помогите нам выполнить команды в nodejschalk
Богатая информация о печати
//安装shell
yarn add shell --save
yarn add chalk --save
- мы в
build.js
разработать функцию вautoUpdate
, чтобы помочь нам отправитьmain
склад и нашdist
Обновление склада, сначала внедряем обновлениеmain
склад:Обратите внимание: здесь нужно использовать await для обеспечения порядка выполнения кода
const config = require('../config')
const shell = require('shelljs')
async function autoUpdate() {
console.log(chalk.cyan(
`Start to upload whole project to coding.net`
))
if (!shell.which('git')) {
//向命令行打印git命令不可用的提示信息
shell.echo('Sorry, this script requires git');
//退出当前进程
shell.exit(1);
}
// 推送当前目录[main 目录]的代码
await shell.exec('git add .')
await shell.exec(`git commit -m '${config.commitMessage}'`).code
await shell.exec('git push origin master -f');
console.log(chalk.green(
`main dir-> succeed`
))
}
- существует
@/config/index.js
Средняя конфигурацияудаленный репозиторийстоимость связанного свойства
module.exports = {
...
distOriginSSh: 'git@github.com:xxx/xxx-blog-xxx.git',
...
}
- существует
autoUpdate
добавить фиксациюdist
Обновленный код репозитория:Обратите внимание: здесь нужно использовать await для обеспечения порядка выполнения кода
//进入到dist目录下
await shell.cd('dist');
//执行 git init
await shell.exec(config.initLocal)
//删除本地的dist已经对应的远程仓库
await shell.exec(config.deleteRemote)
//添加目标远程仓库到dist
await shell.exec(`git remote add origin '${config.distOriginSSh}'`)
//提交
await shell.exec('git add .')
let code = await shell.exec(`git commit -m '${config.commitMessage}'`).code
if (code !== 0) {
await shell.echo('Error: Git commit failed');
await shell.exit(code);
} else {
await shell.exec('git push origin master -f');
//chalk 这个库是为了丰富打印信息的
console.log(chalk.green(
`dist-> succeed`
))
}
После того, как локальная загрузка на удаленный склад реализована, нам нужно сделать несколько вещей, чтобы выполнить шаг 4:
По умолчанию вы завершили развертывание дистрибутивного кода на сервере.
- Запустите службу на своем собственном сервере и слушайте
POST
запрос, если определено, что этот запрос должен уведомить нас о том, что нам необходимо обновить соответствующийdist
Если исходный код соответствует каталогу, выполните соответствующийgit
команда для обновления. - Настроить удаленный репозиторий
hooks
, слушая нашуpush
При запросе автоматическиPOST
Запрос к нашему настроенномуhooks
по соответствующему адресу. Этот адрес также является адресом службы, которую мы запустили на сервере.
Хорошо, теперь, когда мы знаем, что делать, давайте начнем. Сначала запуститеnode server
, мы создаем новыйserver.js
, и войдите в режим редактирования
touch server.js
//如果你安装了vim
vim server.js
//如果没有安装vim,可以用vi
vi server.js
//进入文件后,我们可以按a健进入 insert状态
Вы можете обратиться к моемуserver.js
настроитьОбратите внимание, что вам нужно настроить порт и путь самостоятельно, я удалил свою собственную конфигурацию
var http = require('http')
, exec = require('exec')
// 配制你的端口号
const PORT = XXX
, PATH = './xxx'
//PATH:你的dist目录的路径,相对于server.js所在的目录而言。
var deployServer = http.createServer(function(request, response) {
if (request.url.search(/deploy\/?$/i) > 0) {
var commands = [
'cd ' + PATH,
'git fetch --all',
'git reset --hard origin/master',
'git pull'
].join(' && ')
exec(commands, function(err, out, code) {
if (err instanceof Error) {
response.writeHead(500)
response.end('Server Internal Error.')
throw err
}
process.stderr.write(err)
process.stdout.write(out)
response.writeHead(200)
response.end('Deploy Done.')
})
} else {
response.writeHead(404)
После редактирования сначала нажимаемesc
затем введите:wq!
сохранить документ. потомnode server.js
Запустите службу. Но ты найдешь снова,node server.js
Служба, запущенная таким образом, автоматически остановится через некоторое время, поэтому нам нужно использовать инструмент демона для защиты нашей службы.Рекомендуется использовать его.forever
#安装
npm install forever -g
#启动
forever server.js
Не закончилось, нам еще нужноnginx
Установите прокси в файле конфигурации, чтобы проксировать соответствующий субдомен на порт, который мы только что настроили. Причина этого в том, что у меня есть только одно доменное имя...
Вы можете спросить, что такое субдомен, например, у меня есть домен первого уровня.dendoink.com
Затем я могу добавить новую запись при разбореxxx.dendoink.com
, это имя поддомена, и он также может получить доступ к серверу, соответствующему нашему доменному имени.
Если вы также используете nginx для управления службами, вы можете обратиться к моей конфигурации ниже.
server {
listen 80;
# 配置你的子域名
server_name xxx.你的域名.com;
#charset koi8-r;
access_log /var/log/nginx/githook.dendoink.com.access.log main;
# 这里是重点
location / {
proxy_pass http://127.0.0.1:1024;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
После этой конфигурации мы можем получить доступ к нашим определенным службам извне. Вам нужно только добавить этот адрес в конфигурацию соответствующего githook [обратитесь к руководству по вашей хостинговой платформе для конкретной конфигурации хука].
Это очень просто? Если у вас есть какие-либо вопросы, пожалуйста, свяжитесь со мной, или по электронной почтеdendise7en@gmail.com
Также попросите волну внимания и звезду ->Смотри сюда, самая красивая система блогов~
Очередная волна внимания и звезд ->Смотри сюда, самая красивая система блогов~
Очередная волна внимания и звезд ->Смотри сюда, самая красивая система блогов~
Специальное заявление: источник титульной картыunsplash