[Salesforce]迷った!困った!Apexクラスの削除のお話

2021.01.04

Hola〜Salesforceのシステム管理者の清水です。

今日は業務上でApexクラスを削除することになり、そのプロセスが大変だったので備忘録として書き残しておきたいと思います。

開発業者様(弊社は株式会社匠BusinessPlace様に、普段からお願いしています)へ「Apexクラスって普段から削除するはありますか?」と確認したところ、「リリースしてそのままの企業さんも結構いますよ」ということだったので、あまり行うことがない作業ということでした。ただもう使用しないApexクラスがあるのは管理者的には気持ちが悪かったのと、Apexクラスも無制限に作成できるわけではないので、学習の意味合いも込めて、削除してみました。

株式会社匠BusinessPlace

なぜ削除することになったのか?

今回Apexクラス・Visualforceページを削除することになったきっかけは、請求レコードの作成時にトラブルが起きたのがきっかけでした。

弊社の請求周りのお話については、植木のブログに色々記載しているので興味のある方は読んでみてください。

Developers.IO 2017セッション「A1. クラメソの請求を支える技術 〜40歳中年エンジニアの生存戦略〜」#cmdevio2017

  1. 元々Classic用に、「請求締処理」タブを作成、「BillCloseController」というApexクラス・Visualforceページを開発
  2. その後LEX用に、新たに「請求締処理(LEX)」タブを作成、「BillCloseComponetController」というApexクラス・Visualforceページを開発
  3. 営業より上記のApexクラスにより自動作成された、請求明細レコードが意図しないレコードになっていると報告が上がる
  4. 調査の結果、一部の請求締処理担当者の作業が、新たに作成した「請求締処理(LEX)」タブで行わず「請求締処理」タブで行っていたことが判明
  5. Classic用の古いApexクラスには、営業から新たに上がっていた業務上の要件が含まれていなかった
  6. 取り急ぎ「請求締処理」タブは、Classicユーザーであってももう利用できないように、該当ユーザーの「プロファイル」⇒「オブジェクト設定」⇒「請求締処理」をクリックして、タブの設定を「タブを隠す」に変更

6番の作業を行えば、ユーザー側に使われたくないタブは表示されなくなるので、以下のような画面は表示されなくなります。

このままでも、上記の問題は発生しなくなるのでケースクローズしても良かったのですが、以下のようにApexクラスは2つあるのが気になったので削除することにしました。以下のように本番環境ではApexクラスを簡単に削除できないようになっています。

削除手順

Visualforceページの削除

先にVisualforce は参照しているタブを削除すれば削除できるので、そちらからやってみることにしました。

以下のタブの設定画面から、該当のタブを削除します。

その後、Visualforceページを削除します。VisualforceページはApexクラスとは違って削除ボタンがあります。

そしたら以下のように怒られました。対になっているApexクラスを先に削除してくださいとのことです。

Apexクラスの削除

はじめに公式の以下の記事を参考に削除を試してみたのですが、うまく作動しませんでした。

Workbench を使用して本番組織から Apex クラス、または、トリガを無効化または削除する方法

そのため、他にWorkbenchを使って削除を行った方のブログを参考に、以下のようにやってみました。

フォルダを作成

まずはWorkbenchで操作する前に準備作業を行います。

一つフォルダを作成し、その中にpackage.xmldestructiveChanges.xmlを作成。フォルダ名はここではremovecodepkgとしてますが、半角英数であれば任意名でOKです。

package.xmlは必須のため、コンポーネントを空にして作成。

次にメインとなる、destructiveChanges.xmlに、削除したいApexクラスを記載します。「BillCloseController」クラスを削除したいのでそちらを記載。

こちらの2つのファイルを作成したら、フォルダをZipで固めます。Mac用だと余計なフォルダが作成され、デプロイに失敗するとのことだったので、手っ取り早くWindowsユーザーにZipをお願いしました。後ほどTerminalからコマンドを叩いてZipしましたが、それであればMacでも問題は起きないようです。なお「.DS_Store」ファイルは、デプロイには影響しませんでした。

workbenchでDeployする

フォルダの準備ができたら、以下URLより workbench にログインして下さい。

https://workbench.developerforce.com/login.php

ログインして、「migration」タブからDeployをクリックします。

「ファイル選択」で先ほどZipしたファイルを選択し、「Rollback On Error」 にチェックを入れ、Test Levelに「RunLocalTests」を選択します。本番組織では Apex テストの実行が必要とのことです。

「Next」をクリックすると、Warningが表示されます。「Deploy」をクリックします。

結果が以下のように表示されます。このように削除するプロセスは動いてくれたものの、なんとステータスが「Failed」になってしまったので、エラーメッセージを「Expand All」から確認してみました。

 

Visualforceページを参照しているので、削除できませんと表示されてました。最初にVisualforceページを削除しようとしたら、Apexクラスを削除してくれと怒られたので、どうすればいいのか。。と思い該当のApexクラス、Visualforceページを開発してくれた匠BusinessPlace様へ相談することにしました。

Apexクラスのコードを修正

基本的には上記の手順で削除できるのですが、残念ながら弊社の今回のケースではさらに以下の手順を踏まないと、Apexクラス、Visualforceページの削除ができません。

  1. Apexクラス「BillCloseController」 のコードを修正し、Visualforceページ「BillClose」 への参照箇所を削除
  2.  本番組織では直接 Apex クラスは編集できないので、Sandboxからのリリースが必要

以下のように、Sandbox上で修正して本番へリリースします。

ここまでいったので、最初に怒られたVisualforceページを削除していきます。

今度は削除できました!

次に、先ほど紹介したworkbenchの手順に沿って、再度該当のApexクラスを削除してみます。

最初に失敗したときには、すぐにステータスが「Failed」になって結果が返されたのですが、今回はテストを実行してくれています。

うまく行きました。

Expand Allすると詳細が確認できました。

Apexクラス「BillCloseController」が消えていることを確認できました!

おわりに

実はApexクラスの削除は上記のように終了したのですが、その後業務で利用しているLEX版の画面でこのようなエラーが発生してしまいました。確認するとApexクラス「BillCloseController」を削除したことによるものだったので、このようにLightningComponentに依存があっても削除できてしまいます。

業務に支障がでないかよく確認するのと、エラーが起きたらすぐに差し戻しできるようにしておくなど準備が必要だと感じました。

 

また今回Apexクラスを削除するにあたって、実際に完了までにかかった日数は二週間ほどでした。(Apexクラスを開発してくれた匠BusinessPlace様とのやりとりもあったため)

workbenchでの作業自体は、複雑ではないのですが、エラーが発生した時に参照しているVisualforceのページの削除や、Apexクラスのコードの修正を行う方が大変でした。

Apexクラスの文字制限に引っかかる心配がなければ、この工数を考えるとリリースしてそのままにしていてもいいのかなと個人的には思いました。