在使用AWS – Capistrano进行部署时的错误解决记录
你好。
我是渴望成为一名优秀的初出茅庐的工程师的@iloveomelette。
正如标题所示,我在使用Capistrano进行部署时遇到了一些困难,所以我想和大家分享一下。
就像打Pokemon的道馆战一样,每次解决一个错误,又会遇到另一个错误。我将介绍一些无关紧要的错误,并写出解决过程。
希望对某人有所帮助。
如果您能够提出改进的地方,我将非常感激您的指教。
接下来,我们将在以下目录中为您提供内容。
前提
只需要一个选项
那么,让我们从环境等前提条件开始吧。
-
- 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