---
# System prepended metadata

title: 升級 Ruby

---

升級 Ruby

## (目前專案)3.2.2->3.3.1
[官網的 3.3.1 release log](https://www.ruby-lang.org/en/news/2024/04/23/ruby-3-3-1-released/) 只有提到關於 security 的更新，且上次官方release 的版本為 3.3.0，所以應該去看的是 [3.3.0 release](https://www.ruby-lang.org/en/news/2023/12/25/ruby-3-3-0-released/)
(3.3.0 有新增許多不論是 gem 或是底層新增套件優化效能，所以大致上要看過)
接著在 local 端實作驗證專案
（開啟專案時，需打開 rails console，有時升級會在此 log 問題）

這次升級若使用 rvm 則會遇到 ssl 版本 3 的問題，
```
$rvm install 3.3.1 --with-openssl-dir=$(brew --prefix openssl)
#這是在網路上查到的解法
```
但是從這個例子來說，雖然錯誤顯示是關於 openssl 的版本，實際上真的是 openssl 3的問題嗎？可能的原因還有可能是哪些？例如：1. rvm 2. 作業系統（macOS 太新，或者是 windows 跟 mac的不同） 
=>假設是 rvm 的問題，**那是否用rbenv 安裝就沒有問題？**
應該要延伸去探究問題點。

確定沒有問題後，我們使用的是 [ansible](https://hackmd.io/@blueskyson/learn-ansible) 作為方便管理 sevices 的環境設定自動化引擎

## ansible
參考 [ansible wiki](https://github.com/minkabu/kabutan_modish_ansible/wiki/Bump-Ruby-version-guide)
(需要先 clone 專案到本地端)
### 首先新增 branch 
接著按照 wiki 指示，進到專案(ktus, main, oboe)
修改 `group_vars/all.yml`，升級順序為 ktus->main->oboe

```ruby:
  version:
    full:  '3.3.1'
    minor: '3.3'
  location: /opt/ruby-3.3.1
  gem_path: /opt/ruby-3.3.1/lib/ruby/gems/3.3
```
修改之後傳至遠端 
```
$git push origin #branch(e.g. issue#ruby_upgrade_to_3.3.1)
```
（通常會先在 stg 確認升級沒問題後，才會是全專案的升級）
## 修改 capistrono 的 `config/deploy.rb` 
(一樣需要先 clone 專案到本地端)

```
set :default_env, { path: "/opt/ruby-3.3.1/bin:$PATH" }
```
* （check the file in kabutan_capistrano under kabutan or oboe /config/deploy.rb with target Ruby env setting
```
# config valid for current version and patch releases of Capistrano
lock "~> 3.14.0"

set :application, "kabutan_us"
set :repo_url, "git@github.com:minkabu/kabutan_usa.git"
ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

set :deploy_to, "/srv/app"
set :format, :airbrussh
set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto
set :pty, true
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/sockets', 'vendor/bundle', 'public/system')
set :default_env, { path: "/opt/ruby-3.3.1/bin:$PATH" }
#注意這行有沒有更新
set :keep_releases, 10
set :ssh_options, user: 'app-user'

...）

```
commit 之後
```
$git push origin main
```
* execute ansible-playbook to deploy branch with target Ruby version

```
$ssh kt-us-bastion
```
```
$sudo su - ec2-user
```
```
$cd kabutan_modish_ansible
```
```
$cd ktus/
```
```
$git pull origin #branch
```
```
$./ansible.sh staging
#執行 ansible.sh 檔案，playbook 指向 ktus的 playbook.yml
#"Usage: ansible [environment]"
```
```
ansible.sh
if [ $# -ne 1 ]; then
  echo "Usage: ansible [environment]" 1>&2
  echo "ex) ansible.sh staging" 1>&2
  exit 1
fi

APP=$(basename `pwd`)

MSG="Ansibleを実行します。 \n  app: *$APP*\n  env: *$1*"
JSON="{ \"text\": \"$MSG\" }"
RES=`curl -s -X POST -H 'Content-Type: application/json' -d "$JSON" $SLACK_WEBHOOK_URL`

ansible-playbook -i inventories/$1 playbook.yml
```
* after ansible-playbook has done, enter web-server and use systemctl status puma to check Puma instance alive. enter rails console and use RUBY_VERSION to check runtime Ruby version
```
$ssh kt-us-bastion
``` 
```
$ssh stg-ktus-par01
```
```
$sudo systemctl status puma
#取得 puma 狀態
```
### 確認 datadog 、EC2-RDS 狀況，效能需提升不能降低
進入 ec2>執行個體>xxxxxxx 監控 
跟 ruby gem 升級驗證流程一樣，會需要放在 stg 幾天觀察，確認資料進出都沒有問題

### 打開 stg 環境中的 rails console，確認 ruby version
```
$ssh kt-us-bastion
```

``` 
$ssh stg-ktus-par01
```

```
$cd /srv/app/current/
```
```
$bundle exec rails c
```
```
$RUBY_VERSION
#應要印出 "3.3.1"
```
## 確認過後，開另一個 terminal 作業 capistrano 的 deploy
```
$ssh kt-us-bastion
```
```
$cd kabutan_capistrano/ktus/
```
```
$git checkout #brach
```
```
$bundle exec cap staging deploy
```

* deploy kabutan or kabutan_oboe upgrade ruby branch with Travis CI and .ruby-version settings