プログラミング学習日記

エンジニア転職への道

既存のRailsアプリにReactを導入する③

既存のRailsアプリにReactを導入しようとreact-rails gemのドキュメントにしたがって進めていたのですが、途中でエラーに詰まって断念しました。

一連の手順を始める前の状態のdevelopブランチに戻り、そこから新たにブランチを切ってやり直そうと思いました。

しかし、node_modulesディレクトリ内にはnpmパッケージと見られるファイル群があり、public/pack/jsディレクトリにはmanifest.jsやapplication.jsが残っていました。

さらにmanifest.jsの中身を確認してみると、例外処理が書いてあります。
これらがいつどのタイミングで作られたのでしょうか?

(self["webpackChunkapp"] = self["webpackChunkapp"] || []).push([["manifest"],{

/***/ "./app/javascript/packs/manifest.js":
/*!******************************************!*\
  !*** ./app/javascript/packs/manifest.js ***!
  \******************************************/
/***/ (function() {

throw new Error("Module build failed (from ./node_modules/babel-loader/lib/index.js):\nError: Cannot find package '@babel/plugin-syntax-dynamic-import' imported from /Users/naota7118/ocr_check_app/babel-virtual-resolve-base.js\n    

省略

/***/ })

},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ var __webpack_exports__ = (__webpack_exec__("./app/javascript/packs/manifest.js"));
/******/ }
]);
  • node_modulesが作られたのはyarn addを実行したとき
  • public/pack/jsに新しくファイルが作られたのはbin/shakapacker --watchを実行したとき

bin/shakapacker --watchを実行すると、ソースコードに変更があったときにpublic/pack/js配下にファイルを生成・更新する

既存のRailsアプリにReactを導入する②

こちらのドキュメントを見ながら、既存のRailsアプリにReactの導入を試みています。 https://github.com/reactjs/react-rails/blob/master/docs/get-started.md

  • Railsにshakapackerをインストール
  • yarnでReactをインストール

まで完了したのですが、ビューでコンポーネントを表示するところでつまずきました。

ActionView::Template::Error (Shakapacker can't find application.js in /Users/username/sample_app/public/packs/manifest.json. Possible causes:
1. You forgot to install javascript packages or are running an incompatible javascript runtime version
2. Your app has code with a non-standard extension (like a `.jsx` file) but the extension is not in the `extensions` config in `config/shakapacker.yml`
3. You have set compile: false (see `config/shakapacker.yml`) for this environment
   (unless you are using the `bin/shakapacker -w` or the `bin/shakapacker-dev-server`, in which case maybe you aren't running the dev server in the background?)
4. webpack has not yet FINISHED running to reflect updates.
5. You have misconfigured Shakapacker's `config/shakapacker.yml` file.
6. Your webpack configuration is not creating a manifest.

Shakapackerがmanifest.jsonファイルを見つけられていないと出ています。
manifest.jsonファイルとは、Webブラウザ拡張機能を使うのに必要なファイルのようです。

Shakapackerはpublic/packsディレクトリを探しに行っていますが、そもそもpacksファイルが作られていません。

ドキュメントを遡ってみると、package.json"@babel/preset-react"を追加したのですが、それを反映していないのではないかと考えました。 →package-lock.jsonに追加されていたので、そうではないようです。

今回のエラーと関係があるのかわかりませんが、現在package-lock.jsonyarn.lockがどちらもある状態になっています。
どっちを読みに行っているのかが気になりました。
どちらにも@babel/preset-reactがあるので、両方読み込まれているのでしょうか?

コンパイルを実行した時にnpmが使われているので、yarn.lockを削除してみることにしました。
コンパイルは本番環境でやるべきことで、開発環境ではやらなくていいと後でわかりました。。)

$ rails shakapacker:compile
using npm@8.19.2 to manage dependencies and scripts in package.json
Shakapacker::Compiler - Slow setup for development

エラーの最後に「あなたのwebpack構成はmanifestを作っていませんね」と指摘されていますね。
いや、原因の1つとして挙げられているだけでした。。

2, 3, 5を見ると、どうやらconfig/shakapacker.ymlに原因がありそうな気がしてきました。

shakapacker.ymlを見てみると、以下のようになっていたので、それで/Users/username/sample_app/public/packs/manifest.jsonを探しに行っているのだとわかりました。

default: &default
  source_path: app/javascript
  source_entry_path: packs
  public_root_path: public
  public_output_path: packs

manifest.jsonは存在するのですが、場所が違っていて、app/assets/config/manifest.jsにありました。

shakapacker.ymlの設定を変えようかなと思ったのですが、ちょっと待てよとためらいました。

manifest.jsonを通してapplication.jsを探しに行っているわけですが、application.jsが2つ存在することに気づいたからです。

いつ作られたんだっけ?と思い返してみると、

$ bundle add 'react-rails' --strict
$ rails generate react:install

react-railsgemを追加してReactをインストールしたときに作られていました。

found 0 vulnerabilities
      create  app/javascript/packs/application.js
      create  app/javascript/packs/server_rendering.js

application.jsの中身を見てみると、Reactを呼び出しているっぽい記述があります。
Reactを使う時に呼び出すのはおそらくこっちのapplication.jsでしょう。

// Support component names relative to this directory:
var componentRequireContext = require.context("components", true);
var ReactRailsUJS = require("react_ujs");
ReactRailsUJS.useContext(componentRequireContext);

考えたこと: 探しに行っている場所にmanifest.jsを作って、その中でapplication.jsを読み込めばいい?

//= link_tree ./application.js

エラーが変わりました。書き方の問題なので、新しく作ったファイルを読みに行ってくれています。

ディレクトリを指定しなさいよ」と言われました。

//= link_tree ../packs js

あれ?また元のエラーに戻ってしまいました。。

webpacker.ymlもあったので消しました。

この出力結果を見ると、manifest.jsが読み込まれていないですね。

Your manifest contains:
{
}
):

3.で挙がっていた開発環境でのコンパイルを試してみました。

.browserslistrcは何のファイルでしょう?
ブラウザ設定の齟齬を解消するような役割を果たすみたいです。 要は重複しているのだろうから、.browserslistrcを削除しました。

$ bin/shakapacker --watch
[webpack-cli] Error [BrowserslistError]: /Users/naota7118/ocr_check_app contains both .browserslistrc and package.json with browsers
    at /Users/naota7118/ocr_check_app/node_modules/browserslist/node.js:369:15
    at eachParent (/Users/naota7118/ocr_check_app/node_modules/browserslist/node.js:53:18)
    at Object.findConfigFile (/Users/naota7118/ocr_check_app/node_modules/browserslist/node.js:347:20)
    at Object.findConfig (/Users/naota7118/ocr_check_app/node_modules/browserslist/node.js:397:27)
    at Function.loadConfig (/Users/naota7118/ocr_check_app/node_modules/browserslist/node.js:259:37)
    at Object.load (/Users/naota7118/ocr_check_app/node_modules/webpack/lib/config/browserslistTargetHandler.js:67:19)
    at getDefaultTarget (/Users/naota7118/ocr_check_app/node_modules/webpack/lib/config/target.js:19:50)
    at /Users/naota7118/ocr_check_app/node_modules/webpack/lib/config/defaults.js:165:3
    at F (/Users/naota7118/ocr_check_app/node_modules/webpack/lib/config/defaults.js:105:15)
    at applyWebpackOptionsDefaults (/Users/naota7118/ocr_check_app/node_modules/webpack/lib/config/defaults.js:164:2) {
  browserslist: true

再度コンパイルを実行すると、

ERROR in ./app/javascript/packs/server_rendering.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: Cannot find package 'babel-plugin-macros' imported from /Users/naota7118/ocr_check_app/babel-virtual-resolve-base.js
webpack 5.95.0 compiled with 3 errors in 229 ms

babel-plugin-macrosというパッケージが見つからないと言われたので、npmでインストールしました。 ...つもりでしたが、インストールできていないのでしょうか?

$ npm install babel-plugin-macros

added 13 packages, and audited 606 packages in 2s

78 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

この状態でRailsを再起動したら、エラーは出ずに立ち上がりました。(解決はしていませんが。。) コンポーネントを呼び出せるようになっているかconsole.logで確認してみると、検証画面にエラーが出ていました。

Uncaught Error: Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: Cannot find package '@babel/plugin-syntax-dynamic-import' imported from /Users/username/sample_app/babel-virtual-resolve-base.js

bable.config.jsプラグインとして '@babel/plugin-syntax-dynamic-import'があるのですが、なぜbabel-virtual-resolve-base.jsを見に行っているのでしょう?

もしかして、 "@babel/preset-react"を追加した最新のpackage.jsonが読み込まれていない? package.jsonを更新するため、npm updateを実行。 結果は変わらず。。

いったんここまでとします。

既存のRailsアプリにReactを導入する

こちらの2つの記事を参考にやってみます。

既存Railsアプリに後からReactとTypeScriptを導入する - もふもふ技術部

qiita.com

$ rails webpacker:install:react
Unrecognized command "webpacker:install:react" (Rails::Command::UnrecognizedCommandError)

Webpackerをインストールしていないのが原因だと予想しました。

Webpackerをインストールして再度実行しましたが、これらのメッセージが出ました。

$ bundle exec rails webpacker:install:react
webpack binstubs not found.
Have you run rails webpacker:install ?
Make sure the bin directory or binstubs are not included in .gitignore
Exiting!

Webpackerというツールを使ってreactをインストールしようとして失敗したので、そもそもWebpackerのインストールが必要ですね。

$ bundle exec rails webpacker:install
bin/rails aborted!
Psych::AliasesNotEnabled: Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`. (Psych::AliasesNotEnabled)

Webpackerをインストールしようとしましたが、エイリアスの解析が不可と言われ、その原因はPsychというツールにあるようです。 いくつか記事を見ましたが、それらを読んでも理解できなかったので、Webpackerを使う以外の方法はないか?と考え公式ドキュメントを見に行きました。

https://github.com/reactjs/react-rails/blob/master/docs/get-started.md

WebpackerではなくShakapackerを使ってインストールしていたので、それを試してみました。

$ rails shakapacker:install
bin/rails aborted!
Psych::AliasesNotEnabled: Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`. (Psych::AliasesNotEnabled)

またさっきと同じ問題が出ました。どうやらReactを導入するにはPsychの問題を避けては通れなそうです。

そもそもPsychとは何でしょうか?Rubyのライブラリでした。YAMLの内容を読み取ったりするために用いるようです。

library psych (Ruby 3.3 リファレンスマニュアル)

Psychのエイリアスが使用不可です。エイリアスの解析が不可となっています。と言われました。

shakapackerの設定ファイルはconfig/shakapacker.ymlというYAMLファイルです。
PsychでこのYAMLファイルが読み込めないのが問題なのかと推測しました。
しかし、Psychライブラリによる解析は自動で行われているため、Psych::loadをどこで設定すればいいのかわかりません。

何か試してみようと思い、 GemfileからWebpackerを削除してからshakapackerインストールを再実行してみるとエラーが変わりました。

$ ./bin/rails shakapacker:install
bin/rails aborted!
Shakapacker::Utils::Manager::Error: You don't have "packageManager" set in your package.json (Shakapacker::Utils::Manager::Error)
meaning that Shakapacker will use npm but you've got a yarn.lock
file meaning you probably want to be using yarn instead.

あなたはpackage.jsonの中で"packageManager" を持っていません。 package.jsonはnpmを使おうとしていますが、あなたはyarn.lockを持っていません。 あなたは代わりにyarnを使うことになるでしょう。

ローカルにnpmやyarnがインストールされているかを確認したところ、どっちも入っていました。

$ npm -v
8.19.2
[~]$ yarn -v
1.22.5

ローカルマシンには入っているけど、Railsアプリケーションに入っていないのが問題ということでしょうか?

Railsアプリ内のルートディレクトリにpackage.jsonファイルが存在し、中身はこのようになっていました。

{
  "dependencies": {}
}

この記事によって、package.jsonはGemfileのようなものだと知りました。
第 17 章 Rails フロントエンド環境セットアップ | frontend-training

Rubyのライブラリをインストールする場合、Gemfileに追加してからbundle installを実行しますよね?
そしてその結果、追加されたライブラリがGemfile.lockに出力されますよね。

それと同じ仕組みなら、package.jsonに書いておいて、インストールが実行されたらyarn.lockに出力されるのだろうと想像しました。

この記事によって、package.jsonが存在するディレクトリでnpm installを実行すると、dependenciesに書かれたパッケージがnode_modulesディレクトリにインストールされると知りました。
【いまさらですが】package.jsonのdependenciesとdevDependencies #JavaScript - Qiita

同記事に、package.jsonのdependenciesにパッケージマネージャーを追加するコマンドも載っていたので実行してみました。

$ npm install --save yarn@1.22.5

added 1 package, and audited 2 packages in 595ms

1 high severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

実行した結果、packege.jsonにyarnが追加されました。

{
  "dependencies": {
    "yarn": "^1.22.5"
  }
}

1件重大な脆弱性があると言われました。 この問題に対処するには、npm auditを実行しなさいとも。

この記事によれば、npm audit脆弱性を治すわけではなく、どんな脆弱性なのか、どのレベルの脆弱性なのかを調べてその結果を表示してくれるコマンドだと知りました。
【npm audit】npm package の脆弱性対応してますか?

$ npm audit
# npm audit report

yarn  <1.22.13
Severity: high
Yarn untrusted search path vulnerability - https://github.com/advisories/GHSA-mpwj-fcr6-x34c
fix available via `npm audit fix`
node_modules/yarn

1 high severity vulnerability

To address all issues, run:
  npm audit fix

Yarn の信頼できない検索パスの脆弱性と出てきました。 言われたとおりにnpm audit fixを実行してみます。 脆弱性を修正してくれたようです。

$ npm audit fix

changed 1 package, and audited 2 packages in 1s

found 0 vulnerabilities

これで脆弱性の問題も解消し、Railsにyarnをインストールしたので、今度こそ./bin/rails shakapacker:installが成功するでしょうか? おおお、成功しました!!!

$ ./bin/rails shakapacker:install
       apply  /Users/naota7118/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/shakapacker-8.0.0/lib/install/template.rb
      create    config/shakapacker.yml
  Copying webpack core config
       exist    config/webpack
      create    config/webpack/webpack.config.js
  The packs app source directory already exists
       apply    /Users/naota7118/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/shakapacker-8.0.0/lib/install/binstubs.rb
    Copying binstubs
       exist      bin
      create      bin/shakapacker
      create      bin/shakapacker-dev-server
      create      bin/yarn
      append    .gitignore
  Add JavaScript include tag in application layout
      insert    app/views/layouts/application.html.erb
  Run npm install during bin/setup
      insert    bin/setup
  Installing shakapacker@8.0.0

added 462 packages, and audited 464 packages in 16s
続きを読む

【バグ修正】得点が1つズレて出力される

見つかったバグ

結果表示画面を見ると、1つズレて出力されてしまっています。
本来2つの4は、1つ前の人の最後の行に入るべきところが、次の人の最初の行に入ってしまっています。

現状の確認

全員分の得点を1つの配列に格納したあと、11ずつ区切って1人ごとに分けていました。
11ずつ区切る理由は、1人分のデータが11項目を持つためです。
現在、11ずつ区切ると1つ余りが出てしまっています。

よく見るとという得点以外のデータが入っています。
本来、数値または読みとり不可しか許可していないので、これらはバグです。

convert_one_into_slashメソッドの処理を通した後は、

各行が要素にスラッシュ/を持つ配列またはnilのいずれかを返します。

そもそもnilだったら返さないようにしました。

なぜ「題」「い」が入ったのか?

紙には0/1と書かれているところが、0が読み取られず/1となり、他の文字列と結合する形で出力されていました。

この場合は得点を読み取れていないので、読みとり不可と出力させるようにしました。

正規表現で「0〜6の数値以外+スラッシュ+0〜6の数値」に該当した場合は読みとり不可と出力させるようにしました。

"調べる文字列".match?(/^[0-9]\/[0-6])

関数名の変更によるバグの修正

はじめに

実務未経験からWebエンジニアを目指して転職活動中です。
企業からサイト経由でコードの可読性が悪いとフィードバックいただいたので、ポートフォリオリファクタリングを行っています。

問題

変数名が適切ではなかったので変更したところ、バグが生じました。
具体的には、pdf_datapdf_scores, excel_dataexcel_scoresに変数名を変更しました。
理由としては、そもそも変数がデータを示すのは当たり前なので、〇〇_dataは変数名としてふさわしくないと考えたからです。

その結果、ビューに結果が表示されなくなりました。

試したこと①

何が起きているかわからなかったので、照合処理を行う関数でデバッグを行いました。 具体的には、照合処理を行うverify_suject_id関数の最後にbinding.pryを挿入し、@result_dataの中身を確認しました。

verify_suject_idという関数名も挙動と一致していないので修正すべきだと気づきました。

原因

pry(#<MocaDataController>)> @result_data
=> []

@result_dataというインスタンス変数でコントローラからビューにデータの受け渡しをしているのですが、照合処理した結果が@result_dataに入っていませんでした。
つまり、変数名を変更したら、今まで正常に動いていた関数で異常な動きをするようになりました。

試したこと②

verify_suject_idは2つの引数を取っているのですが、この引数でデータを受け取れているか確認しました。

def verify_suject_id(pdf_scores, excel_scores)
end
[1] pry(#<MocaDataController>)> pdf_scores
=> []
[2] pry(#<MocaDataController>)> excel_scores
=> []

確認したところ、どちらもデータを受け取れていませんでした。

ということは、verify_suject_id関数が実行される前に、どこかでデータの受け渡しができていないということになります。

コントローラでは、結果を返すresult関数の中で順番に関数を呼び出して処理を行っています。

def result
    pass_authentication
    return if performed?

    convert(@drive)
    get_scores_from_text
    export_to_excel(@pdf_scores)
    get_scores_from_excel

    verify_suject_id(@pdf_scores, @excel_scores)
    delete_files
  end

現時点でわかっているのは、verify_suject_id(@pdf_scores, @excel_scores)を呼び出した時点で、@pdf_scores@excel_scoresにはデータが受け渡せていないということです。

@pdf_scores がどこから渡ってきているかというと、get_scores_from_text関数です。 get_scores_from_text関数の最後にbinding.pryを挿入してデバッグしたところ、ここでも空でした。

get_scores_from_text関数は、指定したパスに保存したテキストファイルから得点を取得する処理を行います。
フォームから送信したPDFから得点が抽出されテキストファイルに保存されていることを確認しました。

ここまでのことから、テキストファイルから@pdf_scoresに得点を格納する処理でバグが発生していると推測しました。 しかし、その処理結果は正しく返ってきていました。

今回のバグの原因

関数名を変更する前のコードと見比べたところ、今回新たな関数名として使ったpdf_scoresはすでに使っていたことがわかりました。

def get_scores_from_text
    @pdf_scores = []
    
    # ここでテキストファイルから得点を抽出する処理が行われる

    @pdf_data = []
    @pdf_scores.each_slice(11) { |subject| @pdf_data << subject }
end

@pdf_scores配列を用意しておいて、そこに全員分の得点を格納し、
その後決まった数ごとに分割しているのでした。

変更前は@pdf_dataに全員分の得点が入っていました。 今回@pdf_data@pdf_scoresと変更してしまったことで、
得点を抽出する処理を行なったあとで@pdf_scores = []を実行し、@pdf_scores配列を初期化してしまっていました。

もともと@pdf_scoresとしていた箇所を別の変数名にすればよさそうです。 全員分の得点を格納する変数なので@all_pdf_scoresとしました。

これで無事バグを修正できました。

転職活動をしていて気づいた自分の課題

10月からエンジニアになるための転職活動を開始しています。

6社カジュアル面談と2社1次面接を受けて、自分の課題に気づきました。

それは、「技術に関した質問に対して十分な説明ができない」です。

たとえば以下のようなものです。

  • webサービスが動く一連の仕組みを説明できますか?
  • データベースは作りましたか?どのような設計で作りましたか?
  • 最近使っているクラウドサービスは?
  • テストは書きましたか?どのようなテストを書きましたか?

説明できない原因はどこにある?

説明できない原因は以下の3つに集約されると思っています。

  1. 用語や概念の理解が足りない
  2. やったことがないのでわからない
  3. やったけど思い出せない

3つの中でも特に1.「理解が足りない」が最大の原因であると感じています。 たとえば「webサーバーとは何か説明してください」と言われて、「ええっと...」と詰まってしまう感じです。

これでは現場に入って関わる方々も困ってしまいます。

説明できるとはどういう状態か

「どうすれば説明できるようになるか?」を考えたときに、
そもそも説明できるとはどういう状態かというと、 「頭の中の情報をすぐに取り出して取得し操作できる」だと思います。

アプレンティスのメンターさんはこれを"再現性"と言っていました。

先ほどの「webサーバーとは何ですか?」と聞かれて、
「ちょっと待ってくださいね。今調べます」と言ってググるのは、
そもそも頭の中のメモ帳に「webサーバー」がない状態です。

例えばこれが「Rubyとはなんですか?」だったら、
何も見なくても「プログラミング言語の1つです。書き方がメソッド名がシンプルでわかりやすいです」と答えられます。

では、説明できるようになるにはどうすればいいのでしょうか?

説明できるようになるためにやっていること

僕がやっているのは、お題だけ用意して何も見ないで話す、です。 たとえば、「webサーバー」というお題で、真っ白な状態で話す、です。
コワーキングスペースで学習しているので、実際に話すというよりは、頭の中で話すあるいは書き出したりすることが多いです。

何も見ないで話すと、自分がどこまで理解していて、何が理解できていないのかがわかります。
たとえば、「webサーバーは、ユーザーからインターネット経由でhttpリクエストが送られると、それに対してhttpレスポンスを返します」とします。
そしてその後、この回答が正しいのか、ググって調べます。
それで間違っているところを修正したり、足りないところを補います。

今までの学習法の反省および改善点

今まで、用語や概念でわからないことがあると、すぐ検索して調べたり、ChatGPTに聞いたりしていました。
その解説を見てわかった気になっていました。
しかし、その瞬間はわかった気になっても、次の日同じ質問をされたらまた調べないと答えられません。
つまり、理解していない=知識が自分のものになってないですね。

知識や情報を自分のものとして扱えるようになるには、ノーヒントあるいはキーワードのみでどこまで説明できるか?
を繰り返しやったほうがいいと思いました。

まだ始めて3日ぐらいなので、効果とか確認するには早すぎると思っています。 エンジニアとして生きていくために、ずっとやっていこうと思っています。

最後に

面接で「落選」の通知を見た瞬間は少し凹みますが、どの面接も必ず学びがあるので、とてもありがたいなと感じます。 エンジニアとして働き始める前に「説明できない」という課題に気づけたことで、「いつ質問されても答えられるように準備しよう」というつもりで記事やドキュメントを読むようになったので、プラスに捉えています。
現状は意識と少しの行動しか変わってないので、これを習慣にして、結果につなげたいと思います。

credential問題を理解する

なぜEC2のなかで
EDITOR="vim" rails credentials:edit --environment production を実行して

google:
  redirect_uri: 'https://sample.com/sample'

を編集してからデプロイすると、変更がリセットされてしまうのか?

ローカルで同じことをすると変更がリセットされないのか?

ログを見てみると、config/credentials/production.yml.encファイルが編集されている。

[sample_app]$ EDITOR="vim" rails credentials:edit --environment production
Editing config/credentials/production.yml.enc...

なぜデプロイすると、変更がリセットされてしまうのか? →デプロイフローに原因があると推測する

deploy.ymlのなかで、EC2にssh接続して、コマンドを渡して、その中で、

git fetch --all &&
git reset --hard origin/develop &&

という部分がある。

EC2だけ編集しても、origin/developのconfig/credentials/production.yml.encが変わっていないのであれば、取得してきたときに上書きされてしまっているのかもしれない。

ではorigin/developのconfig/credentials/production.yml.encはどこで決定されるかというと、ローカル上でのEDITOR="vim" rails credentials:edit --environment productionの実行。

EDITOR="vim" rails credentials:edit --environment productionを実行するにはマスターキーが必要。

まとめ

  • EC2でEDITOR="vim" rails credentials:edit --environment productionを実行して編集しても、その後デプロイするとリセットされる原因は、デプロイフローの一部にgit reset --hard origin/developがあり、リモートのdevelopブランチから最新の状態を取得してきたときに元に戻るから。
  • リモートのdevelopブランチのconfig/credentials/production.yml.encがどこで決まるかというと、ローカルでEDITOR="vim" rails credentials:edit --environment productionなどを実行してcredentialsを編集したとき。