Ubuntu 16.04でGitフックを使用してJekyllサイトを展開する方法

_作者はhttps://www.brightfunds.org/funds/diversity-in-tech [技術基金の多様性]を選択して、https://do.co/w4do-cta [Donationsの書き込み]の一部として寄付を受け取りました]プログラム。

前書き

Jekyllは、コンテンツ管理システム(CMS)の利点の一部を提供する静的サイトジェネレーターであり、そのようなデータベース駆動型サイトによって導入されるパフォーマンスとセキュリティの問題を回避します。 「ブログ対応」であり、日付編成のコンテンツを処理するための特別な機能が含まれていますが、その有用性はブログサイトに限定されません。 Jekyllは、オフラインで作業する必要があり、コンテンツメンテナンスのためにWebフォームよりも軽量なエディターを好み、Webサイトへの変更を追跡するためにバージョン管理を使用したい人に適しています。

このチュートリアルでは、Nginxを使用してJekyllサイトをホストするように実稼働環境を構成し、変更を追跡してサイトリポジトリに変更をプッシュするときにサイトを再生成するためにGitを使用します。 また、 `+ git-shell +`をインストールして設定し、本番サーバーを不正アクセスからさらに保護します。 最後に、ローカル開発マシンを構成して、変更をリモートリポジトリで処理し、リモートリポジトリにプッシュします。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • Ubuntu 16.04での初期サーバーセットアップチュートリアルに従って構成された、実稼働用のUbuntu 16.04サーバー1台:

  • Nginx、https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04 [Ubuntu 16.04にNginxをインストールする方法のチュートリアル]の最初の2つの手順に従ってインストールします。 。

  • Jekyll、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-jekyll-development-site-on-ubuntu-16-04 [Jekyll開発のセットアップ方法Ubuntu 16.04のサイト]。

  • Git installedとhttps://www.digitalocean.com/に従って作成されたJekyllサイトを備えた開発マシンcommunity / tutorials / how-to-set-up-a-jekyll-development-site-on-ubuntu-16-04 [Ubuntu 16.04でJekyll開発サイトをセットアップする方法]チュートリアル。

  • オプションで、Jekyllについてさらに詳しく知りたい場合は、次の2つのチュートリアルをご覧ください。

  • Jekyllのデフォルトコンテンツの探索

  • JekyllのURLおよびリンクの制御

ステップ1-Gitユーザーアカウントのセットアップ

セキュリティを確保するために、まず、JekyllサイトのGitリポジトリをホストするユーザーアカウントを作成します。 このユーザーは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]

また、生成されたサイトを保持するためにWebルートを準備します。 最初に、デフォルトのWebページを `+ / var / www / html`ディレクトリから削除します:

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

次に、ディレクトリの所有権を* git *ユーザーに設定します。これにより、このユーザーは変更を受信したときにサイトのコンテンツを更新し、グループの所有権を「+ www-data 」グループに設定できます。 このグループにより、Webサーバーが ` / 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チュートリアルでのサーバーの初期セットアップのステップ4]。 最も簡単な方法は、 `+ ssh-copy-id +`コマンドを使用することですが、手動でキーをコピーすることもできます。

次に、Jekyllサイト用のGitリポジトリを作成し、Gitフックを設定して、更新時に再構築します。

ステップ2-Gitリポジトリのセットアップ

Gitリポジトリには、変更とコミットの履歴など、Gitサイトに関するデータが含まれます。 この手順では、サイトを再生成するpost-receiveフックを使用して、運用サーバーにGitリポジトリを設定します。

リポジトリは* git *ユーザーのホームディレクトリにあるため、前の手順の後でこのユーザーアカウントからログアウトした場合は、 `+ su +`コマンドを使用してロールを切り替えます。

su -

ホームディレクトリで、Gitリポジトリを含むフォルダーを作成します。 ディレクトリがホームディレクトリにあり、 `+ .git `形式を使用して名前が付けられている必要があります。そのため、 ` git +`コマンドで検出できます。 通常、「」はサイトの名前である必要があるため、「+ git +」はサイトとリポジトリを簡単に認識できます。 サイトを「」と呼びます。

mkdir ~/.git

ディレクトリに切り替え、 `+ git init `コマンドを使用してGitリポジトリを初期化します。 `-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 *フックを使用してサイトを再生成します。

`+ hooks `ディレクトリに ` post-receive +`という名前のファイルを作成し、選択したテキストエディターで開きます。

nano ~//hooks/post-receive

フックを設定して、最新の変更を一時ディレクトリに複製し、それを再生成し、生成されたサイトを「+ / var / www / html +」に保存して、簡単にアクセスできるようにします。

次のコンテンツをファイルにコピーします。

〜/ sammy-blog.git / hooks / post-receive

#!/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の受信後フックがあります。 サイトをリポジトリにプッシュする前に、ユーザーがSSH経由で接続するときにさまざまなGitコマンドを提供できる対話型シェルである `+ git-shell +`を構成することにより、運用サーバーをさらに保護します。

手順3-インタラクティブログインを無効にするためのGitシェルの構成

ユーザーは次の方法で `+ git-shell `を実装できます:対話型シェルとして、SSH経由で接続するときにさまざまなコマンドを提供して、新しいリポジトリを作成したり、新しいSSHキーを追加したり、非対話型シェルとして、 SSHを介したサーバーのコンソールへのアクセスを無効にしますが、既存のリポジトリを管理するために ` git +`コマンドの使用を許可します。

  • git ユーザーのSSHキーを誰かと共有すると、SSHを介してインタラクティブなBashセッションにアクセスできるようになります。 ユーザーはサイトに関連しない他のデータにアクセスできるため、これはセキュリティ上の脅威を表します。 `+ git-shell +`を非対話型シェルとして設定するため、 git *ユーザーを使用して対話型のBashセッションを開始できません。

  • git *ユーザーとしてログインしていることを確認してください。 前の手順の後にセッションを終了した場合、以前と同じコマンドを使用して再度ログインできます。

su - git

+ git-shell`が機能するために必要な + git-shell-commands`ディレクトリを作成することから始めます。

mkdir ~/git-shell-commands

`+ no-interactive-shell`ファイルは、対話型シェルアクセスを許可したくない場合の動作を定義するために使用されるため、任意のテキストエディターで開きます。

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

次のコンテンツをファイルにコピーします。 SSH経由でログインしようとすると、ウェルカムメッセージが表示されるようになります。

〜/ git-shell-commands / no-interactive-login

#!/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

非ルート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 リモートを作成し、 git ユーザーを使用して、運用サーバー上の sammy-blog *リポジトリを追跡します。

git remote add origin git@:.git

操作が成功したことを示す出力はありません。 エラーメッセージが表示された場合は、次の手順に進む前に必ず解決してください。

変更をリモートリポジトリにプッシュするたびに、それらをコミットしてから、コミットをリモートリポジトリにプッシュする必要があります。 リモートリポジトリがコミットを受信すると、最新の変更が適用された状態でサイトが再生成されます。

コミットは、行った変更を追跡するために使用されます。 それらには、そのコミットで行われた変更を説明するために使用されるコミットメッセージが含まれています。 コミットで行われた最も重要な変更の詳細を含めて、メッセージは短く簡潔にすることをお勧めします。

変更をコミットする前に、コミットするファイルを選択する必要があります。 次のコマンドは、すべてのファイルをコミット対象としてマークします。

git add .

コマンドが正常に実行されたことを示す出力はありません。 エラーが表示された場合は、続行する前にエラーを解決してください。

次に、コミットメッセージを含む `+ -m +`フラグを使用して、すべての変更をコミットします。 これが最初のコミットであるため、これを*「初期コミット」*と呼びます。

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

そうでない場合は、画面上のログに従って問題を解決してからチュートリアルを続けてください。

この時点で、サイトがサーバーにアップロードされ、しばらくしてから再生成されます。 Webブラウザーを「+ 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リポジトリに変更をプッシュした後にWebサイトをデプロイする方法を学びました。 Gitの詳細については、https://www.digitalocean.com/community/tutorial_series/introduction-to-git-installation-usage-and-branches [Git tutorial series]をご覧ください。

他のGitフックについて詳しく知りたい場合は、https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deploymentをご覧ください。 -tasks [Gitフックを使用して開発および展開タスクを自動化する方法]。

Related