Рука об руку, помогите реализовать автоматическое развертывание кода

Git
Рука об руку, помогите реализовать автоматическое развертывание кода

Почему?

Зачем внедрять автоматическое развертывание?

В последние 2 месяца я был занят организацией блогов.Каждый программист мечтает о блоге (конечно не исключено, что некоторые нет).Я последовательно использовал различные системы блогов:

Все эти причины я не использовал, а сам написал систему блога:vue-blog-generater[Пожалуйста, позвольте мне попросить еще одну волну звезд]кликните сюдаПосмотреть документацию

Зачем? Потому что мне нужна система, с которой я хорошо знаком, если есть какие-либо проблемы, я знаю, в чем проблема, потому что эти предыдущие системы, конечно, очень хороши, но будь то редактирование темы, или развертывание и настройка кода, Ни один из них не соответствует моим требованиям.

Сказав это, после того, как я реализовал основные функции и страницы, я некоторое время был счастлив, а затем перенес несколько значимых сообщений в блог, которые включали публикацию и развертывание.

мы все знаем одногоvue-cliСгенерированные проекты, обычно упакованные каталогиdist, то код, который мне действительно нужно смонтировать на сервере, таков:distкод в .

Тогда по здравому смыслу процесс обновления всей статьи должен быть таким:

  1. новый файл, напишитеmarkdownСообщение блога
  2. npm run buildскомпилировать вdist
  3. БудуdistФайлы загружаются в соответствующий репозиторий кодаdist
  4. Синхронно загружать файлы текущего генератора в соответствующий репозиторий кодаmain
  5. войти на сервер,git clone dist仓库в указанное место

Видите, просто обновить статью, но это требует так много шагов, вам не кажется, что это очень хлопотно? Проблема правильная, здесь мы должны решить эту проблему.

Как сделать?

Я понимаю, почему автоматическое развертывание необходимо, но где я начинаю?

Прежде чем что-то делать, нам нужно прояснить свое мышление. Это на самом деле очень просто:

  1. новый файл, напишитеmarkdownБоуэн [Этот шаг невозможно избежать]
  2. npm run buildскомпилировать вdist,воплощать в жизньbuild.jsсреднее суждениеconfig.jsЭто настроен вdistАдрес удаленного склада.
    Если настроено, текущий проектdistкаталог, продолжитьgitИнициализировать при загрузке общего кода вMain仓库Здесь он не настроен по умолчанию.MainСклад эквивалентен удаленному складу, связанному с локальным складом.
  3. к местномуdistКаталог связывается с удаленным складом и отправляет код на указанныйdistна соответствующем удаленном складе.
  4. Сервер настроен, когда он получаетPOSTПри запросе сделать соответствующий ответ: вытащить пультdistскладmasterветвление и принудительная перезапись локальногоmasterветвь

Реализация?

Давайте сначала посмотрим, как реализовать контент, упомянутый во втором и третьем.

  • Подготовка: Установите необходимые библиотеки
    shell помогите нам выполнить команды в nodejs
    chalk Богатая информация о печати
//安装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:
По умолчанию вы завершили развертывание дистрибутивного кода на сервере.

  1. Запустите службу на своем собственном сервере и слушайтеPOSTзапрос, если определено, что этот запрос должен уведомить нас о том, что нам необходимо обновить соответствующийdistЕсли исходный код соответствует каталогу, выполните соответствующийgitкоманда для обновления.
  2. Настроить удаленный репозиторий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