#はじめに
自由にテスト出来るLinuxのサーバーがほしくて、さくらVPSで構築してみました。
順次手順をアップしていく予定です。
前回インストールしたRuby On Railsを共同開発できるようにGitで管理したいと思います。
#目次
- 申し込み
- CentOS7インストール
- SSH接続
- Apache・PHPインストール
- MariaDBインストール
- FTP接続
- sftp接続
- phpMyAdminインストール
- 環境のバックアップ
- Ruby On Railsインストール
- RailsプロジェクトをGitで共同開発
#11.RailsプロジェクトをGitで共同開発
前回、Ruby On Railsインストール時に作成したテスト用プロジェクトHelloWorkdを共同開発できるようにGitで管理したいと思います。
共同開発用のマシンは、ローカルのWindows10のマシンにします。
構成は、こんな感じです。
共有リポジトリ(リモートリポジトリ)は、サーバーに配置して複数人で共有するためのリポジトリです。
共有リポジトリは、GitHub等を使う方法もありますが、今回はプロジェクトの有るさくらVPSサーバー内に作成します。
Gitでは、開発マシンのソースを直接本番ソースにアップするのではなく、一度共有リポジトリにアップ(プッシュ)したものを本番ソースから取りに行く(プルする)形になります。
サーバーにある本番ソースもローカルマシンの開発ソースと同様ローカルポジトリですので、開発側がアップした変更は手動で本番ソースに取り込む必要があります。
これだと不便ですので、共有リポジトリが変更を受け取った時自動的に本番ソースが取りに行くように設定します。
##さくらVPSにGitインストール
###インストール
$ sudo yum install git-all
###インストール後の設定
ユーザ名とメールアドレスを設定します
$ git config --global user.name "sakura"
$ git config --global user.email sakura@kogueisya.com
gitの出力をカラーリング
$ git config --global color.ui auto
ディフォルトエディタの設定
$ git config --global core.editor vim
エイリアス設定(「checkout」を「co」に設定)
$ git config --global alias.co checkout
確認
$ git config user.name
sakura
$ git config -l
user.name=sakura
user.email=sakura@kougeisya.com
color.ui=auto
core.editor=vim
alias.co=checkout
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
$ cd
$ cat .gitconfig
[user]
name = sakura
email = sakura@kougeisya.com
[color]
ui = auto
[core]
editor = vim
[alias]
co = checkout
##共有リポジトリ(リモートリポジトリ)作成
まず、複数人で共有するためのリポジトリを作成します。
共有リポジトリは、作業用のディレクトリ・ファイルを持たず管理用のファイルのみの『ベアリポジトリ』にします。
さくらVPSサーバーの/optに共有リポジトリを作成します。
###共有リポジトリ用ディレクトリ作成
/optの中に「プロジェクト名.git」というフォルダを作成します。
$ sudo mkdir -p /opt/helloworld.git/
-pは/optフォルダがなければ作成します。
###所有者変更
フォルダの所有者を 「4.Apache・PHPインストール」で作成したWebコンテンツ操作用のグループ(webadmin)にします。
$sudo chown root:webadmin /opt/helloworld.git/
$sudo chmod 2775 /opt/helloworld.git/ -R
###共有リポジトリをベアリポジトリで作成
$ cd /opt/helloworld.git
$ git init --bare --share
Initialized empty shared Git repository in /opt/helloworld.git/
---bareは、ベアリポジトリを作成するオプション
--shareは、ベアリポジトリを複数のユーザによって共有可能にするオプション
##本番ソース
さくらVPSサーバーの中に前回「10.Ruby On Railsインストール」で作成したHelloWorldプロジェクトを本番ソースとします。
この本番ソースにローカルリポジトリを作成し、共有リポジトリ(リモートリポジトリ)にプッシュします。
###リポジトリのセットアップ
本番ソースのディレクトリに移動し、ローカルリポジトリを作成します。
$ cd /var/www/app/HelloWorld
$ git init
Reinitialized existing Git repository in /var/www/app/HelloWorld/.git/
###除外ファイル指定
共有の必要がないファイルは、除外ファイルに指定します。
railsコマンド実行時に作成される.gitignoreファイルにリポジトリから除外するファイルを指定するためのルールが記載されています。
このファイルに以下を追加します。
$ vi .gitignore
# Ignore other unneeded files.
doc/
*.swp
*~
.project
.DS_Store
.idea
.secret
###ファイルをインデックスに追加(addコマンド)
本番ソースのファイルをコミット待ちの変更が格納される「ステージングエリア」という一種の待機場所に追加します。
$ git add .
確認
ステージングエリアにあるファイルのリスト表示
$ git status
###コミット
本番ソースのローカルリポジトリへの変更反映します。
$ git commit -m "Initalize repository"
コミットメッセージの履歴参照
$ git log
commit d3f7327c74c7175b75ca7d78f4a1cd576f5b6d9a
Author: sakura <sakura@kougeisya.com>
Date: Mon Dec 2 15:49:37 2019 +0900
Initialize repository
###共有リポジトリ(リモートリポジトリ)にプッシュ
本番ソースのローカルリポジトリを共有リポジトリにプッシュします。
まずリモートリポジトリのアドレスに「origin」という名前を付けて記録しておきます。
(「origin」にしたのは、pushやpullコマンドは実行時にリモートリポジトリ名を省略するとoriginという名前を使用する為)
この作業は、本番ソースのディレクトリで行います。
$ git remote add origin /opt/helloworld.git
本番ソースのローカルリポジトリを共有リポジトリにプッシュします。
この作業も、本番ソースのディレクトリ内です。
$ git push -u origin master
Counting objects: 6674, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6272/6272), done.
Writing objects: 100% (6674/6674), 29.86 MiB | 8.65 MiB/s, done.
Total 6674 (delta 909), reused 0 (delta 0)
To /opt/helloworld.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
-uオプションは、「git push -u origin master」とすると次回から「git push」だけでpushしてくれます。
以上で、本番ソースが反映された共有リポジトリが出来ました。
##本番ソース反映の自動化
開発用ローカルマシン(Windows10等)で変更した内容は、共有リポジトリにプッシュします。
この時点で、共有リポジトリは最新データになります。
しかし、本番ソースのリポジトリは、開発ローカルマシンのリポジトリと同様ローカルポジトリですので、本番ソース側から取り込む作業(プル)しない限り、本番ソースのリポジトリは古いままです。
開発側がアップした変更は手動で本番ソースに取り込む必要があります。
これだと不便ですので、共有リポジトリが変更を受け取った時、自動的に本番ソースが取りに行くように自動化します。
自動化にはフックを使います。
フックは、Gitでコマンドを実行する直前もしくは実行後に特定のスクリプトを実行する為の仕組みです。
フックの種類(サーバーサイド)
フック | 概要 |
---|---|
pre-receive | クライアントからpushを受け取った直後に起動。 更新内容の確認が可能。 |
post-receive | push内容の適用終了後起動。 通知を行う場合に便利。 |
update | pushによる更新対称ブランチごとに起動。 |
共有リポジトリの中にある「hooks」の中に、フック名のスクリプトファイルを作成することで実現できます。
今回は、開発のローカルリポジトリからプッシュされ、その内容が適用された後に本番のローカルリポジトリからプルするスクリプトを実行したいので、「/opt/helloworld.git/hokks/post-receive」というスクリプトファイルを作成します。
スクリプトの内容は、本番ソースのドキュメントルートに移動し、publlを実行します。
$ vi /opt/helloworld.git/hooks/post-receive
#!/bin/sh
cd /var/www/app/HelloWorld/
git --git-dir=.git pull
スクリプトファイルを他のユーザから実行できるようにパーミッションを設定します。
$ chmod 755 /opt/helloworld.git/hooks/post-receive
以上でサーバー側の設定は完了です。
##開発用ローカルマシン(Windows10)の設定
###各ツールのインストール
Ruby、Rails、Git等をインストールしていきます。
####Rubyインストール
下記サイトからダウンロードします。
最新版の「Ruby+Devkit 2.6.5-1 (x64)」をダウンロードしました。
https://rubyinstaller.org/downloads/
ダウンロードしたファイルを実行すると下記の画面が表示されます。
「◎I accept the License」を選択し[Next>]をクリックします。
下記画面が表示されたら、チェックボックス3つともチェックをいれ、[Install]をクリックします。
下記画面が表示されたらそのまま[Next>]をクリックします。
下記画面のようにインストールが開始されますので、終わるまでしばらく待ちます。
インストールが終了すると、下記画面が表示されます。
そのまま[Finish]をクリックすると画面が閉じ、インストールが完了します。
引き続き下記の画面が開きます。
1,2,3と入力して[Enter]キーを押すとインストールが開始されます。
インストールが完了すると下記画面のように「Which components shall be installed? If unsure press ENTER []」と表示されますので、[ENTER]キーを押すと画面が閉じます。
####Railsに必要なgemをインストール
#####SQLite3インストール
コマンドプロンプトを開き、以下を実行します。
> ridk exec pacman -S mingw-w64-x86_64-sqlite3
下記画面のように「インストールを行いますか? [Y/n]」と聞いてきますので「Y」を入力します。
プロンプトに戻ったらインストール終了です。
引き続き以下のコマンドを実行します。
> gem install sqlite3 --platform ruby
#####nokogiriインストール
コマンドプロンプトで以下を実行します。
> ridk exec pacman -S mingw-w64-x86_64-libxslt
下記画面のように「インストールを行いますか? [Y/n]」と聞いてきますので「Y」を入力します。
プロンプトに戻ったらインストール終了です。
引き続き以下のコマンドを実行します。
> gem install nokogiri --platform ruby -- --use-system-libraries
#####Node.jsインストール
下記サイトからダウンロードします。
https://nodejs.org/ja/download/
「LTS推奨版」「Windows Installer (.msi)」の「64-bit」をダウンロードしました。
ダウンロードしたファイルを実行すると下記の画面が表示されますので[Next]をクリックします。
下記画面が表示されたら「□I accept the terms in the License Agreement」にチェックを入れ[Next]をクリックします。
下記画面が表示されますので、そのまま[Next]をクリック。
下記画面が表示されたら「Automatically install the ・・・」にチェックをいれて[Next]をクリック。
下記画面の[Install]クリックで、インストールが開始されます。
インストールが終わると下記画面が開きますので[Finish]をクリックすると画面が閉じます。
引き続き下記の画面が開きます。
「継続するには何かキーを押してください ...」と2回表示されますので都度[Enter]キーを押してください。
下記のように「Tyoe ENTER to ext:」と表示されたら完了です。
[Enter]キーを押すと画面が閉じます。
#####Bundlerインストール
コマンプロンプトを開き下記のコマンドを実行します。
> gem install bundler
####Gitインストール
GUIでGitが使えるTortoiseGitを使います。
画面のキャプチャは取っていませんでしたm(__)m
#####Git For Windows
下記サイトの[Download]ボタンよりダウンロード
ダウンロードしたファイルを実行し、画面に従いインストール
https://gitforwindows.org/
#####TortoiseGit
下記サイトのfro 64-bit Windowsの「Download TortoiseGit 2.9.0-64.bit(~19.5Mib)」をクリックしてダウンロード
ダウンロードしたファイルを実行し、画面に従いインストール
https://tortoisegit.org/download/
#####メニュー等を日本語に設定
下記サイトからLanguage PacksのJapanese 64Bitの[Setup]をクリックしてダウンロード
ダウンロードしたファイルを実行し、画面に従いインストール
https://tortoisegit.org/download/
インストール後、デスクトップの適当な場所で右クリックし表示されるメニューから[TortoisGit]-[設定]を選択
開いた画面の[全般][TotoiseGit][言語(Language)]より「日本語(日本)」を選択、[OK]ボタンをクリック
以上でWIndows10の設定は完了です。
##クローンを作成
共有リポジトリからクローンを作成します。
作成場所は、C:\Prj\HelloWorldにします。
###TortoiseGitを利用してクローン作製
デスクトップ等適当な場所で右クリックし、表示されたメニューから[Gitクローン (複製)...]を選択します。
下記の設定画面が開きます
URLには以下の値を設定します。
"ssh://" + ユーザー名 + "@" + さくらVPSサーバーのアドレス + ":" + SSHポート番号 + "共有リポジトリディレクトリ"
ディレクトリは、クローンを作成するフォルダ名を設定します。
ここでは、「C:\Prj\HelloWorld」にしました。
フォルダは無ければ作成されます。
Putty鍵のロードにチェックを入れ、[...]をクリックし、秘密鍵を選択します。
ここで選択する秘密鍵は、「 7.sftp接続」の設定時に作成した秘密鍵ファイルです。
[OK]をクリックすると、秘密鍵のパスフレーズを聞いてきますので、「 7.sftp接続」で設定したパスフレーズを入力し[OK]をクリックします。
##動作確認
###サーバーを起動してみる
コマンドプロンプトを起動し、ディレクトリの移動。
> cd \Prj\HelloWorld
とりあえずサーバーを立ち上げてみたら、railsコマンドがみつからないので、「bundle install」しろと出ました。
>bundle exec rails s
bundler: command not found: rails
Install missing gem executables with `bundle install`
「bundle install」を実行すると、派手にエラーが出ました(T0T)
>bundle install
Fetching gem metadata from https://rubygems.org/.
Retrying fetcher due to error (2/4): Bundler::PermissionError There was an error while trying to read from `C:/Users/sugi/.bundle/cache/compact_index/rubygems.org.443.29b0360b937aa4d161703e6160654e47/info/mini_portile2`. It is likely that you need to grant read permissions for that path.
.
Retrying fetcher due to error (3/4): Bundler::PermissionError There was an error while trying to read from `C:/Users/sugi/.bundle/cache/compact_index/rubygems.org.443.29b0360b937aa4d161703e6160654e47/info/thread_safe`. It is likely that you need to grant read permissions for that path.
.
Retrying fetcher due to error (4/4): Bundler::PermissionError There was an error while trying to read from `C:/Users/sugi/.bundle/cache/compact_index/rubygems.org.443.29b0360b937aa4d161703e6160654e47/info/websocket-driver`. It is likely that you need to grant read permissions for that path.
.
There was an error while trying to read from
`C:/Users/sugi/.bundle/cache/compact_index/rubygems.org.443.29b0360b937aa4d161703e6160654e47/info/globalid`.
It is likely that you need to grant read permissions for that path.
どうもファイルの読み取り権限に問題があるようです。
調べてもよくわからなかったので、ちと乱暴ですが管理者としてコマンドプロンプトを実行してみました。
再度「bundle install」したら、無事動きました。
サーバー起動に再チャレンジ。
>bundle exec rails server -b 0.0.0.0
=> Booting Puma
=> Rails 5.2.4 application starting in development
=> Run `rails server -h` for more startup options
Please add the following to your Gemfile to avoid polling for changes:
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
Please add the following to your Gemfile to avoid polling for changes:
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.5-p114), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
###コントローラーを作成しプッシュしてみる
コントローラーを追加作成し、追加・変更した内容を共有リポジトリにプッシュしてみます。
####コントローラを作成
>bundle exec rails generate controller hello
Please add the following to your Gemfile to avoid polling for changes:
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
Please add the following to your Gemfile to avoid polling for changes:
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
create app/controllers/hello_controller.rb
invoke erb
create app/views/hello
invoke test_unit
create test/controllers/hello_controller_test.rb
invoke helper
create app/helpers/hello_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/hello.coffee
invoke scss
create app/assets/stylesheets/hello.scss
app/controllers/hello_controller.rbにアクションメソッドindexを追加
class HelloController < ApplicationController
def index
render plain: 'こんにちは、世界!'
end
end
config/routes.rbにルーティング設定
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
get 'hello/index', to: 'hello#index'
end
ローカルサーバーを起動し動作確認
> bundle exec rails s
####プッシュ
変更したファイルをさくらVPSサーバの共有リポジトリにプッシュします。
その前に、開発用ローカルマシンのローカルリポジトリに変更をコミットします。
HelloWorldフォルダの上で右クリックし、表示されたメニューより[Gitコミット(C)->"master"...]を選択。
下記のようにコミット画面が表示されますので、「メッセージ」を入力し、追加ファイルにチェックを入れ[コミット]ボタンをクリックします。
下記画面のようにコミットが実行され、成功と表示されるとコミットは成功です。
コミットが成功したら、さくらVPSサーバの共有リポジトリへプッシュします。
上記画面の[プッシュ]ボタンをクリックすると下記のプッシュ画面が開きます。
[OK]をクリックし、サーバーの共有リポジトリにプッシュします。
###さくらVPSサーバーでの動作確認
####Git確認
共有リポジトリへのプッシュを確認するために、ログを見てみます。
$ cd /opt/helloworld.git
$ git log
commit 941e28b8e44d6dfcbe2ba2bdf5189cba76b92b38
Author: Kouichi Sugimoto <sugi@kougeisya.com>
Date: Tue Dec 3 18:06:20 2019 +0900
Windowsからのプッシュテスト
commit d3f7327c74c7175b75ca7d78f4a1cd576f5b6d9a
Author: sugi <sugi@kougeisya.com>
Date: Mon Dec 2 15:49:37 2019 +0900
Initialize repository
開発用ローカルマシンのリポジトリから、さくらVPSサーバの共有リポジトリへのプッシュはうまくいっているようです。
開発リポジトリから共有リポジトリにプッシュがあると、自動的に本番サーバーがプルするように設定していました。
これが動いているか、本番ソースのログをチェックしてみます。
$ cd /var/www/app/HelloWorld
$ git log
commit 941e28b8e44d6dfcbe2ba2bdf5189cba76b92b38
Author: Kouichi Sugimoto <sugi@kougeisya.com>
Date: Tue Dec 3 18:06:20 2019 +0900
Windowsからのプッシュテスト
commit d3f7327c74c7175b75ca7d78f4a1cd576f5b6d9a
Author: sugi <sugi@kougeisya.com>
Date: Mon Dec 2 15:49:37 2019 +0900
Initialize repository
hello_controller.rbが出来ているかチェック
$ cd /var/www/app/HelloWorld/app/controllers
$ ls
application_controller.rb concerns hello_controller.rb
無事、本番ソースへ反映されていました。
####動作確認
本番ソースのサーバーを起動します。
$cd /var/www/app/HelloWorld
$ rails server -b 0.0.0.0
=> Booting Puma
=> Rails 5.2.4 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.5-p114), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
ブラウザで確認
無事動きました。
これでGitを使った共同開発の環境が出来ました。
##補足
###Windows環境に追加
sqlite3のテーブル作成時にWindows環境に足りないものがありましので、これをインストールします。
####sqlite3のインストール
コマンドプロンプトでsqlite3を実行してみたら、
> sqlite3
C:\Prj\railbook>sqlite4
'sqlite3' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
sqlte3をインストールしていなかったので入れます。
下記サイトから2つのファイルをダウンロードします。
・sqlite-dll-win64-x64-3300100.zip
・sqlite-tools-win32-x86-3300100.zip
https://www.sqlite.org/download.html
ダウンロードしたファイルを適当な場所で解凍し、出来たファイルの中から「sqlite3.exe」と「sqlite3.dll」をルビーをインストールしたフォルダの中の「bin」フォルダにコピーします。
私の環境では「C:\Ryby26-x64\bin」にコピーしました。
####Gemfileに追加
モデルクラスを作成した時、以下のメッセージが表示されました。
> bundle exec rails generate model book isbn:string title:string price:integer publish:strng published:date dl:boolean
Please add the following to your Gemfile to avoid polling for changes:
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
Please add the following to your Gemfile to avoid polling for changes:
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
invoke active_record
create db/migrate/20191205074742_create_books.rb
create app/models/book.rb
invoke test_unit
create test/models/book_test.rb
create test/fixtures/books.yml
Gemfileに追加しろとのことなので、以下をGemfileファイルの最後に追加しました。
platformsの設定は、Windowsのみに反映する為です。
gem 'wdm', '>= 0.1.0', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
追加を反映
> bundle update
一度modelを削除し、再度generateしたところ、エラーメッセージは消えました。
> bundle exec rails destory model book
invoke active_record
remove db/migrate/20191205074742_create_books.rb
remove app/models/book.rb
invoke test_unit
remove test/models/book_test.rb
remove test/fixtures/books.yml
> bundle exec rails generate model book isbn:string title:string price:integer publish:strng published:date dl:boolean
invoke active_record
create db/migrate/20191205083936_create_books.rb
create app/models/book.rb
invoke test_unit
create test/models/book_test.rb
create test/fixtures/books.yml
####マイグレーションファイルによるテーブルの作成
> bundle exec rails db:migrate
== 20191205083936 CreateBooks: migrating =======================
-- create_table(:books)
-> 0.0022s
== 20191205083936 CreateBooks: migrated (0.0040s) ==============
sqlite3で確認
>sqlite3 db/development.sqlite3
SQLite version 3.30.1 2019-10-10 20:19:45
Enter ".help" for usage hints.
sqlite> .tables
ar_internal_metadata books schema_migrations
sqlite> .exit
sqlite3も無事動作していることが確認できました。
#次回
次回は、Pythonのインストールの予定です。