「Ruby on Rails チュートリアル」でローカル環境を構築して「git push」まで実施する方法・後編

## はじめに

こんにちは、@kosei-matsubaraです。

Web系エンジニアの転職を目指して「Ruby on Rails チュートリアル」の学習を始めました。

「Ruby on Rails チュートリアル」の第一章を後半まで進んだところ「GitHub Codespaces」の自動ログアウトおよび再接続が手間だと感じるようになりました。

今後ポートフォリオを作り、Web系開発企業ではローカル環境での開発が前提になると想定しています。

したがって最初からローカル環境で開発を行い、早々に今後の作業環境に慣れた方がいいと考えローカルで開発構築することにしました。

ローカル環境構築までの手順を公開することで、同じく「Ruby on Rails チュートリアル」をローカル環境を構築する方のご参考になればと思い記事を投稿しました。

なお、[前回記事](https://qiita.com/kosei-matsubara/items/977a322ffbd1369f1924)は環境構築開始からRailsインストールまで、当該記事でRailsインストール以降から「git push」までを投稿します。

https://qiita.com/kosei-matsubara/items/977a322ffbd1369f1924

## ローカル環境構築

ローカル環境構築のため、必要となる各ソフトウェアをインストールします。

### 【前提・構築環境】

- MacBook Pro 16インチ 2021
- Apple M1 Pro
- macOS Sonoma 14.3.1
- Homebrew 4.2.10
- rbenv 1.2.0
- Ruby 3.2.3
- Ruby on Rails 「7.0.4.3」※1
- Bundler ※環境構築のためバージョン記載対象外

※1　YassLab社.　“Ruby on Rails チュートリアル”.
https://railstutorial.jp/chapters/beginning?version=7.0#sec-bundler,
(参照 2024/3/12).

### アンインストール・再インストール

[前回記事](https://qiita.com/kosei-matsubara/items/977a322ffbd1369f1924)の通り、`sudo`を付与してRailsのインストールコマンドを実行したため、インストールした各ソフトウェアの関係性や下記記事を参考にアンインストールを実施します。
 
https://qiita.com/jnchito/items/e4872ff5c70a4c2219f1

https://qiita.com/AKI3/items/e89d86889a34794a0d5f

参考記事を掲載頂きました@jnchito氏、@AKI3氏に感謝いたします。

アンインストール後、[前回記事](https://qiita.com/kosei-matsubara/items/977a322ffbd1369f1924)と同様の手順で再インストールを実施しました。

### 【Bundlerのインストール】

「Ruby on Rails チュートリアル」指定のバージョンでBundlerのインストールコマンドを実行します。

```
% gem install bundler -v 2.5.6


*** LOCAL GEMS ***

bundler (default: 2.5.3)
```

事後確認としてBundlerのバージョン確認コマンドを実行します。

```
% gem list bundler            


*** LOCAL GEMS ***

bundler (2.5.6, default: 2.5.3)
```

```
% bundle -v

Bundler version 2.5.6
```

特に問題なくバージョンを確認できました。

### 【Bundleのインストール・エラーで失敗】

Bundlerのインストール後、「Ruby on Rails チュートリアル」の手順に則り下記手順を実施しました。

- 開発用のディレクトリ作成
- Railsアプリケーションの作成（`rails new`の実行）
- Gemfileを「Ruby on Rails チュートリアル」指定の内容に更新

その後、Bundleのインストールコマンドを実行した結果、Rubyバージョンについて構築環境のバージョンとGemfile指定のバージョンが一致していないため、インストールが出来ませんでした。

```
% bundle install
Your Ruby version is 3.3.0, but your Gemfile specified 3.2.3
```

そのため「Ruby 3.2.3」をインストールします。

### 【Ruby 3.2.3をインストール】

Rubyバージョーンを指定して、インストールコマンドを実行します。

```
==> Downloading ruby-3.2.3.tar.gz...
-> curl -q -fL -o ruby-3.2.3.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.3.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19.6M  100 19.6M    0     0  4345k      0  0:00:04  0:00:04 --:--:-- 4345k
==> Installing ruby-3.2.3...
ruby-build: using readline from homebrew
ruby-build: using libyaml from homebrew
-> ./configure "--prefix=$HOME/.rbenv/versions/3.2.3" --with-openssl-dir=/usr/local/opt/openssl@3 --enable-shared --with-readline-dir=/usr/local/opt/readline --with-libyaml-dir=/usr/local/opt/libyaml --with-ext=openssl,psych,+
-> make -j 10
-> make install
==> Installed ruby-3.2.3 to /Users/matsubarakyousei/.rbenv/versions/3.2.3
```

特に問題なくインストールが終了しました。

Rubyのバージョン設定を現在の「3.3.0」から先ほどインストールした「3.2.3」に変更します。

```
rbenv global 3.2.3
```

rbenvコマンドでバージョン設定結果を確認します。

```
% rbenv versions
  system
  3.2.3
* 3.3.0 (set by /Users/matsubarakyousei/environment/hello_app/.ruby-version)
```

Rubyのバージョンが「3.2.3」に切り替わりませんでした。

下記記事などを参考に調べた結果、ruby-versionの制御によってバージョンが切り替わりませんでした。

https://qiita.com/makoto_kw/items/cc73b628c9ef039f6e6f

参考記事を掲載頂きました@makoto_kw氏に感謝いたします。

【バージョンが切り替わらなかった経緯】
1. 「Ruby 3.2.3」をインストール時、local領域にバージョン指定「3.3.0」のruby-versionファイルを生成
2. `rbenv global 3.2.3`を実行したがruby-versionのバージョン制御によって、local領域のRuby適用バージョンは「3.3.0」から変更されなかった。

※　local領域（/Users/matsubarakyousei/environment/hello_app/.ruby-version）

ruby-versionのバージョン制御は現時点では不要なため、下記コマンドを実行します。

```
% rbenv local --unset
```

改めてRubyのバージョン確認コマンドを実行します。

```
% ruby -v            
ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-darwin23]
```

```
% rbenv versions     
  system
* 3.2.3 (set by /Users/matsubarakyousei/.rbenv/version)
  3.3.0
```

```
% cat ~/.rbenv/version
3.2.3
```

ruby-versionファイルによるlocal領域のバージョン制御が解除され、Rubyのバージョン切り替えを確認できました。

### 【Bundleのインストール】

再度、Bundleのインストールコマンドを実行します。

```
% bundle install
Bundler 2.4.19 is running, but your lockfile was generated with 2.5.6. Installing Bundler 2.5.6 and restarting using that version.
.
.
.
in rubygems repository https://rubygems.org/ or installed locally.

The source contains the following gems matching 'rails (= 7.0.8.1)':
  * rails-7.0.8.1
```

特に問題なくインストールが終了しました。

以降は「Ruby on Rails チュートリアル」を参考にローカル環境で開発を行いました。

## GitHubの各種設定およびgit pushの実行

「Ruby on Rails チュートリアル」を参考に開発作業を実施後、プログラムをリモートリポジトリに移行するため、GitHubの各種設定を行います。

### 【SSH Keyの生成・設定】

GitHubにpushで認証に使用する、SSH Keyの生成コマンドを実行します。

```
% ssh-keygen -t ed25519 -C "自身のメールアドレス" 
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/matsubarakyousei/.ssh/id_ed25519): 
Created directory '/Users/matsubarakyousei/.ssh'
.
.
.
Enter passphrase for key '/Users/matsubarakyousei/.ssh/id_ed25519': 
Hi kosei-matsubara! You've successfully authenticated, but GitHub does not provide shell access.
```

特に問題なくKey生成が終了しました。

次にGitHubの設定画面に生成Keyをペーストします。

具体的な手順はGitHubのホームページを参考にしました。

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account

### 【GitHub設定画面における各種設定】

個人用アクセストークン設定やリモートリポジトリのアクセス許可など各種設定をGitHubアカウントの設定画面にて行います。

具体的な手順はGitHubのホームページを参考にしました。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

### 【リモートリポジトリ・URLをコマンドで追加】

GitHubのリモートリポジトリ・URLをコマンドで追加します。

```
% git remote add hello_app https://github.com/自身のGitHubアカウント/hello_app.git
```

※リモートリポジトリ・URLはGitHubリモートリポジトリ画面の「HTTPS」に明記されています。

追加したリモートリポジトリ・URLを下記コマンドで確認します。

```
% git remote -v
hello_app       https://github.com/自身のGitHubアカウント/hello_app.git (fetch)
hello_app       https://github.com/自身のGitHubアカウント/hello_app.git (push)
```

コマンドで指定したURLがGitの設定情報に追加されていることを確認できました。

### 【git pushの実行】

「Ruby on Rails チュートリアル」に則り開発したプログラムの`git add`や`git commit`を実施しました。

前段の作業が終了したため`git push`を実施します。

```
% git push hello_app main:main
To https://github.com/自身のGitHubアカウント/hello_app.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/自身のGitHubアカウント/hello_app.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

「error」を出力しております。

原因は当初「Ruby on Rails チュートリアル」を「GitHub Codespaces」を使用して作業を進め、同一名称のリモートリポジトリを作成しておりました。

そのため、ローカル環境で開発したプログラムを`git push`した際にエラーになりました。

通常では実施しない手段ですが今回はチーム開発を行っておらず、他の開発者との構成管理に留意する点が特にないため、フォースオプションを付与して強制的にリモートリポジトリに`git push`を実行します。

※どのチーム開発でどの機能を本番環境に移行するのか企業内協議で決定します。
※各機能やサービスの移行タイミングは企業におけるサービス開始予定日に連動しているはずです。

```
% git push -f hello_app main:main
Enumerating objects: 89, done.
Counting objects: 100% (89/89), done.
Delta compression using up to 10 threads
Compressing objects: 100% (72/72), done.
Writing objects: 100% (89/89), 22.55 KiB | 2.25 MiB/s, done.
Total 89 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), done.
To https://github.com/自身のGitHubアカウント/hello_app.git
 + xxxxxx...xxxxxxx main -> main (forced update)
```

特にエラーメッセージを出力せず`git push`が終了しました。

## まとめ

紆余曲折はありましたが「Ruby on Rails チュートリアル」でローカル環境を構築して、ローカル環境から`git push`まで辿り着きました。

ローカル環境で開発するため、標準的に使用するであろうVSCodeのプラグインインストールやDockerの導入など、残作業は多々ありますが段階的に開発環境を整えていきたいと思います。

同じく「Ruby on Rails チュートリアル」を学習する際、ローカル環境で開発する方のご参考になれば幸いです。

最後までお読み頂きありがとうございます。