Як я можу автоматично розгорнути свою програму після натискання git (GitHub та node.js)?


92

У мене є програма (node.js), розгорнута на VPS (linux). Я використовую git hub як сховище. Як я можу розгорнути додаток автоматично, на git push?


4
ви перевіряли git хуки progit.org/book/ch7-3.html , а також перевіряли github help.github.com/test-webhooks
Павел Дюбіел

1
Оновлення для посилання progit вище: git-scm.com/book/en/Customizing-Git-Git-Hooks
коду

Git 2,10 додасть цікаву особливість: варіанти натискні stackoverflow.com/a/38770670/6309
VonC

Відповіді:


63

Приклад в PHP:

Перейдіть до github у ваш репозиторій github, натисніть "Admin"

натисніть вкладку 'Сервісні хуки' => 'URL-адреси WebHook'

і додати

http://your-domain-name/git_test.php

потім створіть git_test.php

<?php 
try
{
  $payload = json_decode($_REQUEST['payload']);
}
catch(Exception $e)
{
  exit(0);
}

//log the request
file_put_contents('logs/github.txt', print_r($payload, TRUE), FILE_APPEND);


if ($payload->ref === 'refs/heads/master')
{
  // path to your site deployment script
  exec('./build.sh');
}

У build.sh вам потрібно буде встановити звичайні команди для отримання вашого сайту з github


6
Привіт, велике спасибі. Що заважає Бобу виконувати мій сценарій розгортання?
Розширений

16
@Advanced 1, можливо, дозволи сценарію, прапор виконання ... 2 додавання закриваючого тегу в PHP - погана практика.
Павел Дюбіел,

3
@Advanced Одним із методів, щоб переконатись, що Боб не виконує ваш сценарій, є переконання, що запит POST надходить із серверів Github. Перевірте заголовки HTTP, які вони надсилають, роблячи запит. Також ви можете створити "секретну" URL-адресу, яка неможливо вгадати.
джап


1
@ Arius2038 Ви коли-небудь чули про те, "щодня ви дізнаєтеся щось нове"? ну це моє "щось нове" сьогодні. Дякую, що поділились!
Пурефан

23

Було кілька згадувань про гачки Git як відповіді / коментарі, що працювало у мене в минулому .. тож ось мій рецепт, якщо хтось інший вимагатиме більше конкретики.

Я використовую комбінацію git пост-отримання гачка та супервайзера вузлів, щоб здійснити просте автоматичне розгортання (припускаючи, що ви використовуєте віддалене сховище git на цій машині).


Налаштуйте гачок після отримання

У вашому сховищі: sudo vi hooks/post-receive

І це повинно виглядати приблизно так:

#!/bin/sh
GIT_WORK_TREE=/home/path/to/your/www
export GIT_WORK_TREE
git checkout -f

Встановити дозволи для файлів: chmod +x hooks/post-receive

Git оновить файли у каталозі вашої програми після натискання на репо.


Запустіть Node з Node-Supervisor

Вам потрібно буде встановити Node-Supervisor на вашому комп'ютері як глобальний модуль вузла: sudo npm install supervisor -g

Тепер просто запустіть свою програму вузла за допомогою node-supervisor, і вона буде стежити за змінами у файлах у вашому робочому каталозі:

supervisor /home/path/to/your/www/server.js(примітка supervisorзамість node).


Це чудово, однак слід пам’ятати про те, що якщо ви додасте новий npm до локальної програми, вам також потрібно буде встановити npm для цього модуля на сервері. Якщо ви цього не зробите, у вас, ймовірно, буде збійна програма.
k00k

2
Ні .. Будь-які модульні вузли, від яких залежить моя локальна програма, встановлюються у підкаталог node_modules мого проекту, який є моїм локальним репозитарієм GIT, отже, коли я додаю, фіксую, а потім надсилаю на віддалений сервер, який вони також копіюють.
Уес Джонсон,

8
Правильно, але це означає, що якщо будь-який із цих модулів мав код, який був скомпільований (наприклад, mhash, наприклад), він може не працювати на іншому сервері, який відрізняється від ОС та / або архітектури. Використання package.json для відстеження ваших залежностей, а потім стратегія розгортання, яка робить це npm install -lна віддаленому сервері, є розумною. Звичайно, це можна поєднати з вашим методом за допомогою гачків після отримання.
k00k

1
і ви можете просто додати робоче дерево Git безпосередньо до команди git checkout: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (а не створювати змінної та експортує її у ваш сценарій.
JasonB

Однак питання в Github.
Ной

18

Ймовірно, дуже пізно тут робити репондаж. Але я знайшов цей проект на github і, схоже, роблю те, що ти хочеш, але набагато чистішим чином.

https://github.com/logsol/Github-Auto-Deploy

Перевір. Було б також цікаво дізнатись, що думають про це інші з точки зору коментарів та схвальних голосів.

На ура,
С


15
"Напевно, дуже пізно тут робити перевидання". Ніколи не запізно. :) Ви насправді робите внесок у все співтовариство (більшість із нас, гуглерів; вау, просто дивлячись на ці 20 тисяч переглядів!), А не один хлопець задав питання "деякий час тому". Час сам по собі не має значення: доки відповідна технологія є відповідною, ваша відповідь буде також. (Дякую за підказку, до речі, перевіряю ...)
Sz.

1
спасибі за ваш керівник! ;) На той час у мене це чудово працювало. Зараз я віддаю перевагу використовувати travis (travis-ci.org) ( де б я не міг ) для автоматизованого розгортання. @lunakid
Saurabh Kumar

8

У проекті, який я зараз розробляю, я дотримуюсь рекомендацій, викладених у блискучій книзі Джеза Хамбла "Безперервна доставка" (що варто прочитати).

Це означає створити конвеєр розгортання з використанням якоїсь форми сервера безперервної інтеграції (я використовую безкоштовну версію спільноти Thoughtworks Go ), яка відповідає за першу перевірку коду на якість, складність та запуск модульних тестів. Потім він може слідувати за конвеєром розгортання, що призведе до переходу на ваші виробничі сервери.

Це звучить дуже складно, але не повинно бути, і робить весь процес написання коду і робить його шлях до виробництва безпечним і безтурботним (без страшних днів випуску!).

Я використовую повний конвеєр розгортання для живих систем і скорочену версію для модулів npm, які я пишу, і обидва мають однакову техніку розгортання в 1 клік.


& ще +1 за рекомендацію книги! Я виявляю, що до ІР не слід підходити випадково.
Меррік,

ну, люди задають просте запитання, ви даєте повне рішення :). Я повинен сказати, що це надмірне. Але якщо ви вже використовуєте безперервну доставку, можливо, це такий шлях.
windmaomao

8

Я щойно опублікував рішення вашої проблеми на основі вузла : node-cd

Він складається з простої програми-вузла, що працює на вашому VPS, яка отримає Github після отримання хуків і виконає скрипт, який вам подобається (наприклад, скрипт оболонки, який вб’є вашу програму, git тягне і перезапустить її).


+1, оскільки це чистий node.js, тому плакату не потрібно нічого додавати до свого стеку або використовувати мову, яка їм не сподобалась. Крім того, дуже красиво викладений код
code_monk

3

Ось ще одна проста реалізація nodeJS.

Це дуже простий сервер вузлів, який працює на імені хосту та порту, які ви налаштовуєте, і може бути налаштований на обробку веб-хуків отримання GitHub. А фактичні дії pul / test / deploy можуть бути налаштовані так, щоб робити все, що завгодно. У поточній реалізації це команда оболонки, яка вказується вбудовано у сценарій сервера nodeJS. Також існує дуже проста схема безпеки на основі секретних ключів.

https://github.com/shyam-habarakada/rscds

На моєму проміжному сервері вже був встановлений і запущений вузол, тому писати це було швидко і просто.


" yourdomain.com:8088/… " - Справді ?! "секретний" ключ, переданий в поле очищення в URL !!!! Ніхто не повинен цим користуватися.
Джуліан Найт

1
Прийміть аспірин і поселіться Джуліан. Параметри отримання шифруються при використанні https.
Гевін,

3

Я виявив, що проект для простого розгортання використовує git.

git-play

Я думаю, що це правильний спосіб для вас.

Перевір.


2

Якщо ви хочете рішення на основі пітона / торнадо, я написав сценарій для обробки запитів POST від служб Webhook Github . Ви можете знайти його на https://github.com/Akobi/ops/tree/master/autodeploy

В основному він використовує файл конфігурації JSON, щоб перерахувати, з яких репозиторіїв ви очікуєте натискань, які команди ви хочете запустити при розгортанні та в якому каталозі повинні виконуватися команди. Все, що вам потрібно буде зробити, це змінити файл конфігурації на свій смак і запустити сценарій!

Крім того, я використовую Nginx як зворотний проксі-сервер для пересилання цих POST до мого сценарію. Ви можете знайти конфігурацію Nginx у тому ж репозиторії Github у папці 'nginx'.

Щасливого натискання!


1

відповідь PHP, на мій погляд, є цілком правомірною, але якщо ви віддаєте перевагу Ruby, я написав рішення в блозі. це те саме, що відповідь PHP, просто іншою мовою. Ви використовуєте веб-хук, і у вас є простий скрипт для прослуховування відповідних запитів HTTP.

http://gilesbowkett.blogspot.com/2012/06/heroku-style-deployment-on-ec2.html


1

Я створив свій власний засіб розгортання, який автоматично витягуватиме нові оновлення з репо - https://github.com/jesalg/SlimJim - В основному він прослуховує github після прийому і використовує проксі для запуску сценарій оновлення.


1

Я засновник https://commando.io, і нещодавно ми оголосили про інтеграцію з GitHub через сервіс. Інтеграція дозволяє запускати виконання на серверах при переході до репозиторію GitHub. Це чудова можливість для автоматичного запуску сценаріїв розгортання під час натискання коду.

Виконання - це сценарій, який ви пишете всередині Commando.io, і який можна записати на bash, perl, python, ruby, go або node.js. Щоб прочитати більше та побачити приклад виконання сценарію запуску git pull, див. Наше повідомлення в блозі: http://blog.commando.io/run-executions-via-github-push/


1

Deepl.io здається новим і перспективним суперником у цьому просторі.

Особливості (взяті з веб-сайту):

  • Ловіть веб-хуки від GitLab та GitHub
  • Налаштуйте кілька сховищ
  • Налаштування декількох гілок на сховище
  • Використовуйте власні сценарії розгортання, або PHP, оболонку, або обидва
  • Надсилає електронні листи з підтвердженням

1

Також зверніть увагу, що там є безкоштовні / недорогі послуги, такі як REPOMAN.IO, які автоматизують майже все це для вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.