2013-07-23 14 views
7

Próbuję wykonać instrukcje http://jekyllrb.com/docs/deployment-methods/ dotyczące konfigurowania haka post-receive git dla wdrożenia Jekyll, jednak jestem dla nich trochę gęsty. W tym linku, istnieje paragraf, który mówikonfigurowanie git haka po otrzymaniu

mieć zdalny serwer obsłużyć oddelegować na ciebie za każdym razem naciskać zmiany przy użyciu Git, można utworzyć konto użytkownika, który ma wszystkie klucze publiczne na które są dopuszczone do wdrożenia w jego pliku authorized_keys. Mając to na miejscu, powołanie po otrzymywać hak jest wykonywana jako następująco:

Pytanie 1: To nie jest dla mnie jasne, gdzie powinien być tworzony „Konto użytkownika” (na Github na zdalnym serwerze?) i (pytanie 2), gdzie znajduje się plik authorized_keys. Mam plik known_hosts w moim katalogu domowym na moim komputerze lokalnym z kluczami dla github itp. Czy to jest plik authorized_keys?

Instrukcje iść na Powiem ci założyć hak post-otrzymane jak to

laptop$ ssh [email protected] 
server$ mkdir myrepo.git 
server$ cd myrepo.git 
server$ git --bare init 
server$ cp hooks/post-receive.sample hooks/post-receive 
server$ mkdir /var/www/myrepo 

dyspozycja mkdir myrepo.git jest trochę dla mnie jasne. Na przykład, umieściłem moją stronę Jekyll w kontroli wersji git na mojej lokalnej maszynie, i to dało mi tę ścieżkę /Users/me/Sites/nginxjekyll/_site/.git/

Pytanie 3) Czy to znaczy, że po instrukcji mkdir myrepo.git powinienem stworzyć katalog mkdir /Users/me/Sites/nginxjekyll/_site/.git/ na moim serwerze zdalnym? Idąc dalej, to mówi,

cp hooks/post-receive.sample hooks/post-receive 

Jednak nie mam plik hooks/post-receive.sample skopiować? W repozytorium git na moim komputerze lokalnym mam post-update.sample, ale nie post-receive.sample. Ponadto, gdy utworzyłem katalog mkdir /Users/me/Sites/nginxjekyll/_site/.git/ na moim serwerze zdalnym, nie utworzyłem w nim pliku post-update.sample.

Czy możesz wyjaśnić te instrukcje dla mnie, jeśli masz chwilę. Z góry dziękuję.

Odpowiedz

6

Pytanie 1: Odnoszą się do użytkownika na serwerze zdalnym.

Pytanie 2: To zależy od dwóch scenariuszy: 1. Będziesz musiał dodać klucz publiczny swojego lokalnego użytkownika, aby przekazać go do zdalnego serwera. 2. Musisz dodać klucz publiczny do lokalnego użytkownika, który uruchamia przechwytywanie po otrzymaniu, jeśli ssh jest wymagane do wdrożenia na innym serwerze. Najprawdopodobniej tylko 1 jest twoją obawą, a 2 nie, ponieważ zdalny serwer będzie zawierał zdalne repozytorium git i serwer www.

Oznacza to, że dodajesz klucz publiczny do pliku authorized_keys w środowisku Linux/Unix. Ten plik jest zwykle umieszczony w /home/$USER/.ssh/authorized_keys Plik authorized_keys znajduje się w tym samym katalogu, co plik known_hosts dla użytkownika.

Pytanie 3: Wyjaśniają, jak skonfigurować zdalne repozytorium git. Nie musi to być ta sama ścieżka, co w lokalnym repozytorium.

OK - teraz, aby wyjaśnić, co się tutaj dzieje. Samouczek uczy, jak skonfigurować zdalne repozytorium, które będzie instalować instalacje jekyll za każdym razem, gdy zostanie ona przekazana.

Oznacza to, że jeśli posiadasz repozytorium github, nie możesz tam ustawić haka po stronie serwera. Zamiast tego instalowałbyś nowego pilota na swoim zdalnym serwerze. Więc powiedzieć, że zalogować się na serwerze (z ssh typowo), uruchom pwd nauczyć się pełnej ścieżki lub ustawić go w zmiennej środowiskowej:

$DIR=`pwd` 

Teraz można utworzyć gołego repo na tym serwerze:

git init --bare $DIR/<SOMEDIRNAME>.git 

Teraz masz zdalne, puste repozytorium git na swoim serwerze. Następnie musisz dodać hak, który pozwala mu wdrożyć witrynę Jekyll po otrzymaniu push. Strona, którą masz na liście, ma dość prostą implementację, ale w zasadzie wszystko, co robi, polega na tym, że katalogi witryny są obsługiwane na stronach html, możesz to zrobić na kilka sposobów, sugeruję, żebyś zrobił to bez zakłócania swoich użytkowników tak bardzo, jak to tylko możliwe, tutaj to przykładowy skrypt, który może zrobić coś takiego:

#!/bin/bash 
# Assuming a directory structure for www: 
# $www_root/releases 
# $www_root/shared 
# $www_root/current 
# all releases go in releases dir as timestamps dirs 
# any logs or other shared items go in shared dir - shared/logs 
# current is a symlink to latest release 
unset GIT_DIR 
WWW_ROOT=/PATH/TO/WWW 
REPO_PATH=/PATH/TO/REPO 
REPO_BRANCH=master 
SITE_DIR=/PATH/TO/_SITE/DIR/IN/REPO 
DATE=$(date +"%Y%m%d%H%M") 

# get code 
if [ ! -d $WWW_ROOT/shared/git_maint ]; then 
    mkdir -p $WWW_ROOT/shared/git_maint 
    cd $WWW_ROOT/shared/git_maint 
    git clone $REPO_PATH $WWW_ROOT/shared/git_maint 
    git checkout master 
else 
    cd $WWW_ROOT/shared/git_maint 
    git pull 
    git checkout master 
fi 

# do deploy 
if [ ! -d $WWW_ROOT/releases/$DATE ]; then mkdir $WWW_ROOT/releases/$DATE; fi 
cp -ar $WWW_ROOT/shared/git_maint/$SITE_DIR $WWW_ROOT/releases/$DATE 
ln -s $WWW_ROOT/new_current $WWW_ROOT/releases/$DATE && mv $WWW_ROOT/new_current $WWW_ROOT/current 

exit 0 

Coś takiego byłoby dobrym rozwiązaniem. Jeśli zapiszesz ten skrypt na zdalnym serwerze w nagim pliku repozytorium/po otrzymaniu, to będzie on uruchamiany za każdym razem, gdy zostanie wysłane do repozytorium. Wystarczy pamiętać, aby uczynić go wykonywalnym: chmod 755 hooks/post-receive więc jeśli dodać nowego pilota do git repo z:

git remote add DEPLOY_PROD [email protected]:/path/to/bare/repo 

Następnie git push DEPLOY_PROD - będzie naciskać na pilocie, a następnie pilot repo będzie ogień jego post-otrzymywać hakuj, a następnie skopiuj go do katalogu serwisowego, który można zdmuchnąć niemal w każdym punkcie. Katalog ten jest następnie używany do przeniesienia katalogu serwisu do katalogu wydań, a następnie jest połączony z katalogiem głównym.

Oczywiście wszystko to jest najprawdopodobniej przesadą i można po prostu utworzyć skrypt wdrażania, który uruchamia się z lokalnego hosta, aby zrobić to wszystko przez ssh.

Problem polega na tym, że nie można uruchomić haków po stronie serwera bezpośrednio z github dla tej metodologii, więc trzeba obejść to. Proponuję sprawdzić capistrano jako strategię wdrażania - bieżące/releases/shared dirs i git_maint dir są wzięte z ich schematu, działa dobrze.

Daj mi znać, jeśli potrzebujesz pomocy, mam duże doświadczenie w opracowywaniu strategii wdrażania i zautomatyzowanego wdrażania, więc w zależności od sytuacji sytuacja będzie się różnić.

+0

Dzięki, spróbuję i dam ci znać, jak to działa. Doceniam Twoją pomoc. – Leahcim

+0

nie ma pliku po otrzymaniu w katalogu hooks w repozytorium git. Istnieje tylko 'applypatch-msg.sample post-update.sample pre-commit.sample pre-rebase.sample commit-msg.sample pre-applypatch.sample prepare-commit-msg.sample update.sample' – Leahcim

+0

możesz utworzyć ten plik - to tylko skrypt, który będzie działał po tym, jak git odbierze pakiet. Po prostu nazwij go post-receive - git zrobi resztę. – Michael

Powiązane problemy