Как развернуть сайт Jekyll с помощью Git Hooks в Ubuntu 16.04

_ Автор выбрал Diversity in Tech Fund, чтобы получить пожертвование в рамках Write for DOnations program._

Вступление

Jekyll - генератор статических сайтов, который предоставляет некоторые преимущества системы управления контентом (CMS), избегая при этом проблем производительности и безопасности, возникающих на таких сайтах, управляемых базами данных. Он «осведомлен о блогах» и включает в себя специальные функции для обработки контента, организованного по дате, хотя его полезность не ограничивается блог-сайтами. Jekyll хорошо подходит для людей, которым необходимо работать в автономном режиме, предпочитать легкие редакторы веб-формам для обслуживания контента и желать использовать контроль версий для отслеживания изменений на своем веб-сайте.

В этом руководстве мы настроим производственную среду для использования Nginx для размещения сайта Jekyll, а также Git для отслеживания изменений и регенерации сайта при отправке изменений в репозиторий сайта. Мы также установим и настроим + git-shell + для дополнительной защиты вашего производственного сервера от несанкционированного доступа. Наконец, мы настроим вашу локальную машину для разработки и внесем изменения в удаленный репозиторий.

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

Шаг 1 - Настройка учетной записи пользователя Git

В целях безопасности мы начнем с создания учетной записи пользователя, в которой будет размещаться Git-репозиторий для сайта Jekyll. Этот пользователь выполнит скрипт Git-хуков, который мы создадим для регенерации сайта при получении изменений. Следующая команда создаст пользователя с именем * git *:

sudo adduser git

Вам будет предложено ввести и повторить пароль, а затем ввести необязательную основную информацию о пользователе. В конце вас попросят подтвердить информацию, набрав * Y *:

OutputAdding user `git' ...
Adding new group `git' (1001) ...
Adding new user `git' (1001) with group `git' ...
Creating home directory `/home/git' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for git
Enter the new value, or press ENTER for the default
       Full Name []:
       Room Number []:
       Work Phone []:
       Home Phone []:
       Other []:
Is the information correct? [Y/n]

Мы также подготовим веб-корень для хранения созданного сайта. Сначала удалите веб-страницу по умолчанию из каталога + / var / www / html:

sudo rm /var/www/html/index.nginx-debian.html

Теперь установите право собственности на каталог для пользователя * git *, чтобы этот пользователь мог обновлять содержимое сайта при получении изменений, а также группировать владение группой + www-data +. Эта группа гарантирует, что веб-серверы могут получать доступ и управлять файлами, расположенными в + / var / www / html +:

sudo chown :www-data /var/www/html

Перед тем, как продолжить обучение, скопируйте ваш SSH-ключ только что созданному пользователю * git *, чтобы вы могли безопасно обращаться к производственному серверу с помощью Git. Вы можете сделать это, следуя https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04#step-four-%E2%80%94-add-public-key -authentication- (рекомендуется) [шаг четвертый из Начальной установки сервера с Ubuntu 16.04 учебник]. Самый простой способ - использовать команду + ssh-copy-id +, но вы также можете скопировать ключ вручную.

Теперь давайте создадим Git-репозиторий для вашего сайта Jekyll, а затем сконфигурируем Git-хуки, чтобы перестраивать его при обновлении.

Шаг 2 - Настройка Git-репозитория

Ваш Git-репозиторий будет содержать данные о вашем Git-сайте, включая историю изменений и фиксаций. На этом шаге мы настроим репозиторий Git на производственном сервере с хуком пост-получения, который восстановит ваш сайт.

Репозиторий будет находиться в домашнем каталоге пользователя * git *, поэтому, если вы вышли из этой учетной записи пользователя после предыдущего шага, используйте команду + su + для переключения ролей:

su -

В домашнем каталоге создайте папку, в которой будет находиться ваш репозиторий Git. Каталог должен находиться в домашнем каталоге и именоваться в формате + .git +, чтобы команды + git + могли его обнаружить. Обычно ` должно быть именем вашего сайта, поэтому `+ git +` может легко распознавать сайты и репозитории. Мы будем называть наш сайт `:

mkdir ~/.git

Перейдите в каталог и инициализируйте репозиторий Git с помощью команды + git init +. Флаг + - bare + устанавливает репозиторий для размещения на сервере и обеспечивает совместную работу нескольких пользователей:

cd ~/.git
git init --bare

Вывод содержит информацию об успешно инициализированном хранилище:

OutputInitialized empty Git repository in

Если вы не видите такой информации, следуйте инструкциям на экране, чтобы решить проблему, прежде чем продолжить обучение.

Созданная нами папка содержит каталоги и файлы, необходимые для размещения вашего хранилища. Вы можете проверить его содержимое, набрав следующее:

ls
Outputbranches  config  description  HEAD  hooks  info  objects  refs

Если вы не видите вывод такого типа, убедитесь, что вы переключились в соответствующий каталог и успешно выполнили + git init +.

Каталог * hooks * содержит сценарии, используемые для ловушек Git. По умолчанию он содержит файл примера для каждого типа хука Git, так что вы можете легко приступить к работе. В целях данного руководства мы будем использовать хук * post-receive * для регенерации сайта после обновления хранилища последними изменениями.

Создайте файл с именем + post-receive + в каталоге + hooks + и откройте его в любом текстовом редакторе:

nano ~//hooks/post-receive

Мы настроим хук для клонирования последних изменений во временный каталог, а затем для его регенерации и сохранения сгенерированного сайта в + / var / www / html +, чтобы вы могли легко получить к нему доступ.

Скопируйте следующее содержимое в файл:

~ / Сэмми-blog.git / Крючки / после приема

#!/usr/bin/env bash

GIT_REPO=$HOME/.git
TMP_GIT_CLONE=/tmp/
PUBLIC_WWW=

git clone $GIT_REPO $TMP_GIT_CLONE
pushd $TMP_GIT_CLONE
bundle exec jekyll build -d $PUBLIC_WWW
popd
rm -rf $TMP_GIT_CLONE

exit

Когда вы закончите, сохраните файл и закройте текстовый редактор.

Убедитесь, что скрипт исполняемый, чтобы пользователь * git * мог выполнить его при получении изменений:

chmod +x ~//hooks/post-receive

На данный момент у нас есть полностью сконфигурированный Git-репозиторий и Git post-receive, чтобы обновлять ваш сайт при получении изменений. Прежде чем отправить сайт в хранилище, мы дополнительно защитим наш рабочий сервер, настроив интерактивную оболочку + git-shell +, которая может предоставлять пользователям различные команды Git при подключении через SSH.

Шаг 3 - Настройка Git Shell для отключения интерактивных входов

Пользователи могут реализовать + git-shell + следующими способами: в качестве интерактивной оболочки, предоставляя им различные команды при подключении через SSH, которые позволяют им создавать новые репозитории или добавлять новые ключи SSH, или в качестве неинтерактивной оболочки, отключить доступ к консоли сервера через SSH, но позволить им использовать команды + git + для управления существующими репозиториями.

Если вы поделитесь ключом SSH для пользователя * git * с кем-либо, он получит доступ к интерактивному сеансу Bash через SSH. Это представляет угрозу безопасности, так как пользователи могут получить доступ к другим, не связанным с сайтом данным. Мы настроим + git-shell + как неинтерактивную оболочку, поэтому вы не можете запустить интерактивный сеанс Bash, используя пользователя * git *.

Убедитесь, что вы вошли в систему как пользователь * git *. Если вы вышли из сеанса после предыдущего шага, вы можете использовать ту же команду, что и раньше, чтобы снова войти в систему:

su - git

Начните с создания каталога + git-shell-commands, необходимого для работы` + git-shell`:

mkdir ~/git-shell-commands

Файл + no-interactive-shell используется для определения поведения, если вы не хотите разрешать доступ к интерактивной оболочке, поэтому откройте его в любом текстовом редакторе:

nano ~/git-shell-commands/no-interactive-login

Скопируйте следующее содержимое в файл. Это обеспечит отображение приветственного сообщения, если вы попытаетесь войти через SSH:

~ / ГИТ-оболочка-команда / не-интерактивный-Войти

#!/usr/bin/env bash

printf '%s\n' "You've successfully authenticated to the server as $USER user, but interactive sessions are disabled."

exit 128

Когда вы закончите, сохраните файл и закройте текстовый редактор.

Мы должны убедиться, что файл является исполняемым, поэтому + git-shell + может выполнить его:

chmod +x ~/git-shell-commands/no-interactive-login

Вернитесь назад к своему не-root пользователю sudo, чтобы вы могли изменить свойства нашего * git * пользователя. Если вы использовали предыдущую команду + su +, вы можете закрыть сеанс, используя:

exit

Наконец, нам нужно изменить оболочку для пользователя * git * на + git-shell:

sudo usermod -s $(which git-shell)

Убедитесь, что вы не можете получить доступ к интерактивной оболочке, запустив SSH с компьютера разработчика:

ssh git@

Вы должны увидеть сообщение, подобное приведенному ниже. Если вы этого не сделаете, убедитесь, что у вас есть соответствующие ключи SSH, и повторите предыдущие шаги, чтобы решить проблему, прежде чем продолжить обучение.

OutputWelcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-109-generic x86_64)
...
You've successfully authenticated to the server as git user, but interactive sessions are disabled.
Connection to  closed.

Затем вы настроите свой локальный компьютер для разработки на использование этого Git-репозитория, а затем мы отправим ваш сайт в репозиторий. Наконец, мы позаботимся о том, чтобы ваш сайт был создан и вы могли получить к нему доступ через веб-браузер.

Шаг 4 - Внесение изменений в репозиторий

Теперь мы инициализировали и настроили Git-репозиторий на рабочем сервере. На компьютере разработчика нам нужно инициализировать локальный репозиторий, который содержит данные об удаленном репозитории и изменениях, внесенных в локальный репозиторий.

На компьютере разработчика перейдите в каталог, содержащий сайт:

cd ~/www

Нам нужно инициализировать Git-репозиторий в корневом каталоге сайта, чтобы мы могли отправить содержимое в удаленный репозиторий:

git init

Вывод содержит сообщение об успешной инициализации репозитория:

OutputInitialized empty Git repository in

Если вы не видите такой информации, следуйте инструкциям на экране, чтобы решить проблему, прежде чем продолжить.

Теперь создайте удаленный объект, который представляет объект Git, используемый для отслеживания удаленных репозиториев и веток, над которыми вы работаете. Обычно пульт по умолчанию называется * origin *, поэтому мы будем использовать его для целей данного руководства.

Следующая команда создаст удаленный * origin *, который будет отслеживать хранилище * sammy-blog * на рабочем сервере с помощью пользователя * git *:

git remote add origin git@:.git

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

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

Коммиты используются для отслеживания изменений, которые вы делаете. Они содержат сообщение о коммите, которое используется для описания изменений, внесенных в этот коммит. Рекомендуется, чтобы сообщения были короткими, но краткими, включая сведения о наиболее важных изменениях, внесенных в коммит.

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

git add .

Отсутствие вывода указывает на успешное выполнение команды. Если вы видите какие-либо ошибки, обязательно исправьте их, прежде чем продолжить.

Затем зафиксируйте все изменения, используя флаг + -m +, который будет включать в себя сообщение фиксации. Поскольку это наш первый коммит, мы назовем его * «Initial commit» *:

git commit -m "Initial commit."

Вывод содержит список каталогов и файлов, измененных в этом коммите:

Commit output 10 files changed, 212 insertions(+)
create mode 100644 .gitignore
create mode 100644 404.html
create mode 100644 Gemfile
create mode 100644 Gemfile.lock
create mode 100644 _config.yml
create mode 100644 _posts/2017-09-04-link-test.md
create mode 100644 about.md
create mode 100644 assets/postcard.jpg
create mode 100644 contact.md
create mode 100644 index.md

Если вы видите какие-либо ошибки, обязательно исправьте их, прежде чем продолжить обучение.

Наконец, используйте следующую команду, чтобы отправить зафиксированные изменения в удаленный репозиторий:

git push origin master

Вывод будет содержать информацию о ходе нажатия. Когда это будет сделано, вы увидите следующую информацию:

Push outputCounting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
remote: Cloning into '/tmp/sammy-blog'...
remote: done.
remote: /tmp/sammy-blog ~/sammy-blog.git
remote: Configuration file: /tmp/sammy-blog/_config.yml
remote:             Source: /tmp/sammy-blog
remote:        Destination: /var/www/html
remote:  Incremental build: disabled. Enable with --incremental
remote:       Generating...
remote:                     done in 0.403 seconds.
remote:  Auto-regeneration: disabled. Use --watch to enable.
remote: ~/sammy-blog.git
To [email protected]:sammy-blog.git
* [new branch]      master -> master

Если вы этого не сделаете, следуйте инструкциям на экране, чтобы решить проблему, прежде чем продолжить обучение.

На этом этапе ваш сайт загружается на сервер, и через короткий промежуток времени он будет восстановлен. Перейдите в веб-браузере к + http: // +. Вы должны увидеть ваш сайт в рабочем состоянии. Если вы этого не сделаете, повторите предыдущие шаги, чтобы убедиться, что вы сделали все, как задумано.

Чтобы восстановить ваш сайт, когда вы что-то измените, вам нужно добавить файлы в коммит, зафиксировать их, а затем отправить изменения, как вы это сделали с первоначальным коммитом.

После того, как вы внесли изменения в свои файлы, используйте следующие команды, чтобы добавить все измененные файлы в коммит. Если вы создали новые файлы, вам также необходимо добавить их с помощью + git add +, как мы это делали с начальным коммитом. Когда вы будете готовы зафиксировать ваши файлы, вы захотите добавить еще одно сообщение о фиксации, описывающее ваши изменения. Мы назовем наше сообщение * «обновленные файлы» *:

git commit -am "updated files"

Наконец, внесите изменения в удаленный репозиторий.

git push origin master

Вывод будет похож на то, что вы видели при первоначальном нажатии:

Push outputCounting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
remote: Cloning into '/tmp/sammy-blog'...
remote: done.
remote: /tmp/sammy-blog ~/sammy-blog.git
remote: Configuration file: /tmp/sammy-blog/_config.yml
remote:             Source: /tmp/sammy-blog
remote:        Destination: /var/www/html
remote:  Incremental build: disabled. Enable with --incremental
remote:       Generating...
remote:                     done in 0.403 seconds.
remote:  Auto-regeneration: disabled. Use --watch to enable.
remote: ~/sammy-blog.git
To [email protected]:sammy-blog.git
* [new branch]      master -> master

На данный момент ваш сайт только что сгенерирован, и последние изменения на месте.

Заключение

Из этого руководства вы узнали, как развернуть свой веб-сайт после внесения изменений в репозиторий Git. Если вы хотите узнать больше о Git, ознакомьтесь с нашей учебной серией Git.

И если вы хотите узнать больше о других хитов Git, вы можете проверить https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment -tasks [Как использовать Git Hooks для автоматизации задач разработки и развертывания].

Related