在使用AWS – Capistrano进行部署时的错误解决记录

你好。

我是渴望成为一名优秀的初出茅庐的工程师的@iloveomelette。

正如标题所示,我在使用Capistrano进行部署时遇到了一些困难,所以我想和大家分享一下。
就像打Pokemon的道馆战一样,每次解决一个错误,又会遇到另一个错误。我将介绍一些无关紧要的错误,并写出解决过程。
希望对某人有所帮助。

如果您能够提出改进的地方,我将非常感激您的指教。

接下来,我们将在以下目录中为您提供内容。

ラウンドエラー項目1VS 『supports platforms』 問題2VS 『An error occurred while installing mysql2 (0.5.3)』 問題3VS 『Mysql2::Error: Unknown database ‘アプリ名_production’』 問題

前提

只需要一个选项

那么,让我们从环境等前提条件开始吧。

    • macOS Monterey 12.3.1 (M1)

 

    • Ruby 3.1.1

 

    • Rails 6.1.5

 

    • nginx

 

    • puma

 

    MariaDB 10.6.7

我们使用的AWS服务是EC2和RDS,选择了“Amazon Linux 2 AMI”的“t2.micro”实例。这就是目前的情况了。如果有其他需要,我们会继续添加。

* 连接到EC2上的服务器环境终端状态
* 本地环境的普通终端

以下是执行该命令后的讨论内容。

$ bundle exec cap production deploy BRANCH=HEAD

第一回合 “支持的平台” 问题

那么,接下来就是第一场比赛了。

结论

如果先前述結論,可通过执行以下命令来解决这个问题。

$ bundle lock --add-platform x86_64-linux
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Writing lockfile to ~~~/アプリ名/Gemfile.lock

错误部分和解谜

在一开始的时候一切都很顺利,但是后来出现了以下错误(以下简称为”###”)。

###
00:35 bundler:install
      01 Your bundle only supports platforms ["x86_64-darwin-21"] but your local platform
      01 is x86_64-linux. Add the current platform to the lockfile with
      01 `bundle lock --add-platform x86_64-linux` and try again.
###
status: 16 (SSHKit::Runner::ExecuteError)
bundle stdout: Nothing written
bundle stderr: Your bundle only supports platforms ["x86_64-darwin-21"] but your local platform
is x86_64-linux. Add the current platform to the lockfile with
`bundle lock --add-platform x86_64-linux` and try again.
###

** DEPLOY FAILED
** Refer to log/capistrano.log for details. Here are the last 20 lines:
###
 DEBUG [5d094cc5] 	Your bundle only supports platforms ["x86_64-darwin-21"] but your local platform

is x86_64-linux. Add the current platform to the lockfile with

`bundle lock --add-platform x86_64-linux` and try again.

这实际上意味着“您的bundle只支持’x86_64-darwin-21’,而您的本地环境是’x86_64-linux’,所以请添加它”。

亲切地告诉我要使用bundle lock –add-platform x86_64-linux。

bundle lock是什么?根据官方参考资料,bundle lock是指

在不安装的情况下创建/更新锁定文件

这是一个即生成又更新lockfile的命令,也就是说可以在没有安装的情况下进行操作。
那么–add-platform是用来做什么的呢?我想你能猜到。

向锁定文件添加一个新平台,重新解析以添加该平台。

确切地说,这是“向锁文件中添加新平台并重新解析”的命令。

执行此命令后,再次提交、推送,然后进行部署即可解决此问题。

第二轮安装mysql2 (0.5.3)时出现了一个错误的问题。

我原本以为解决了之前的错误就可以正常部署了,但在此时战斗却立即开始了。

總結

如果按照以下命令执行MariaDB相关的安装,问题将得到解决。

$ sudo yum install -y MariaDB-devel MariaDB-shared

由于这里的情况很大程度上取决于您自己的环境,所以强烈建议您仔细阅读错误信息。

错误部分和解谜

错误内容如下

00:31 bundler:install
      01 Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
###
      01 Could not create Makefile due to some reason, probably lack of necessary
      01 libraries and/or headers.  Check the mkmf.log file for more details.  You may
      01 need configuration options.
###
      01 /home/****/.rbenv/versions/3.1.1/lib/ruby/3.1.0/mkmf.rb:1086:in `block
      01 in find_library': undefined method `split' for nil:NilClass (NoMethodError)
      01
      01     paths = paths.flat_map {|path| path.split(File::PATH_SEPARATOR)}
      01                                        ^^^^^^
      01 from 
###
Caused by:
SSHKit::Command::Failed: bundle exit status: 5
bundle stdout: Nothing written
bundle stderr: Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
###
** DEPLOY FAILED
** Refer to log/capistrano.log for details. Here are the last 20 lines:
###
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.

In Gemfile:

  mysql2

读取错误消息后,内容类似于”在安装mysql2 (0.5.3)期间发生错误,无法继续进行”。

从根本上说,MySQL2是什么呢?
根据MySQL2的README,它是什么呢?

Mysql2 是一个用于 Ruby 的现代化、简单且非常快速的 MySQL 库,与 libmysql 绑定。

他们说的是一个适用于Ruby的现代、简单而非常快速的MySQL库。换句话说,可以说它是在Rails中使用MySQL所必需的

有点离题了,但是在第四行左右这样说着。

Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.
You may need configuration options.

换句话说,他(她)是在说“如果想了解详细信息,请查看mkmf.log”,那么我们来看一下这个日志文件。
我认为在其中会有这样的消息,我们就使用该路径。

To see why this extension failed to compile, please check the mkmf.log which can
be found here:
# 下記のパスを使用します
~~~/shared/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/mysql2-0.5.3/mkmf.log

说实话,我想通过使用cat命令来查看日志的内容,但由于我的学习不足,我并没有完全理解这个日志。为了确保,我建议您先自己查看一下。

$ cat ~~~/shared/bundle/ruby/3.1.0/extensions/x86_64-linux/3.1.0/mysql2-0.5.3/mkmf.log

假设我们查看前一条信息的前一句话,那么要解决这个问题。

Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers.

这个code提到了无法创建Makefile的原因可能是缺少所需的库文件和头文件。在错误信息中进行了多种调查后,找到了一个GitHub Issues页面。在这里建议尝试使用yum install -y Mariadb-devel Mariadb-shared命令。在其他文章中也看到了这个命令,所以我去查了一下这两个是什么。根据官方的MariaDB(虽然版本有点旧),它是

MariaDB-devel – 开发头文件和静态库。
MariaDB-shared – 动态客户端库。

哦,這個感覺有點像…
是的,安裝MariaDB時,我參考了官方的AWS並導入了它,所以我忘了安裝Rails所需的組件。
雖然是事後補充,但mysql2的README也記載了以下內容。

您可能需要安装一些软件包,例如libmariadb-dev、libmysqlclient-dev、mysql-devel或其他适合您系统的软件包。

由于使用Rails操作MariaDB,所以至少需要安装Mariadb-devel。
因此,进行了与MariaDB相关的安装,成功解决了此错误。

$ sudo yum install -y MariaDB-devel MariaDB-shared

# 以下を実行してRDSのMariaDBにログイン
$ mysql -h エンドポイント -u root -p

# 以下を実行してデータベースを確認
MariaDB [(none)]> show databases;
# 表示されたデータベース一覧に「アプリ名_production」があるか確認

第三轮出现了一个问题,错误信息是Mysql2::Error: 未知数据库 ‘应用名称_production’。

好了,我终于以为可以部署了,结果一下子又遇到了错误。
让我们快速解决它。

總結

这是个非常无聊的错误。

production:
  <<: *default
- database: AB_app_production
+ database: A_B_app_production
  username: -
  password: <%= Rails.application.credentials.db[:password] %>
  host: <%= Rails.application.credentials.db[:hostname] %>

错误部分和谜题解答

现在,我们来看看是什么错误。

01:52 deploy:migrating
      01 $HOME/.rbenv/bin/rbenv exec bundle exec rake db:migrate
      01 rake aborted!
      01 ActiveRecord::NoDatabaseError: Unknown database 'AB_app_production'
###
Caused by:
Mysql2::Error: Unknown database 'AB_app_production'

这次有人告诉我有个搞不清楚的数据库。
我当时很累,于是尝试重新启动MariaDB之类的操作。

在这里想要表达的是要仔细看错误信息的意思对吧。
例如,我的应用程序是”A_B_app_production”,但在这里显示的是”AB_app_production”对吧。区分这两者确实有点困难呢,哈哈。
首先要确认是否有输入错误是很重要的感觉到了。

顺便说一下,在最初启动应用时,可能是在命名时忘记输入”_(下划线)”了。

然后,我们将在修正之后进行提交、推送,并再次进行部署。

production:
  <<: *default
- database: AB_app_production
+ database: A_B_app_production
  username: -
  password: <%= Rails.application.credentials.db[:password] %>
  host: <%= Rails.application.credentials.db[:hostname] %>

终于成功部署了!!
然而,真正的地狱从这里开始。
下一次,我将告诉你我在实际访问弹性IP并确认应用程序是否显示时的努力。

请参考下列文献

    • Unable to install mysql2 gem with MariaDB 10.2.7 on CentOS 7: “cannot find -lmariadb”

 

    • About the MariaDB RPM Files

 

    • Bundler公式リファレンス

 

    mysql2のREADME
广告
将在 10 秒后关闭
bannerAds