💬

Pleasanter をバージョンアップしようとしたら思わぬところでエラーになった

2023/12/12に公開

これは2023 個人アドベントカレンダーの 1 日目の記事です。

tl;dr

  • 去年作ったアップグレードツールは引き続き使えた
  • macOS で特に手当てなく圧縮して、展開した ._* のリソースファイルで docker の dotnet を起動すると NullReference エラーが発生する

今回の目的

アドベントカレンダーに向けて、手元のプリザンターをアップグレードしようと思いました。

手元環境は Synology の NAS 内の Docker コンテナで動かしているのですが、同じアプリケーションのソースがローカルにあるため、ローカルでアップグレードしてから NAS 環境をアップグレードする流れで作業しました。

ローカルでアップグレード

https://github.com/papinianus/PleasanterUpgradeAssistance

ここからダウンロードして ↓ を実行

deno run --unstable --allow-all main.ts --path /some_directory/web/pleasanter --target 1.3.49.0

これでアプリが更新できた状態になるので DB を更新します。
Docker コンテナで動作させているので、コンテナを起動して ↓ を実行。

docker exec -it 'pleasanter のコンテナ' /bin/bash
cd ./Implem.CodeDefiner
dotnet Implem.Codedefiner.dll _rds

ブラウザで動作確認して問題ないことを確認

NAS 環境のアップグレード

流れとしては、↑ でアップグレード済みのソースを NAS にコピーして、CodeDefiner でデータベースを更新するだけで済む、はずでした。

docker を起動するとエラーになる

ところが、もってきたソースを起動すると ↓ のようなエラーとなりました。[1]

docker-compose up
web               | Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
web               |    at Implem.DefinitionAccessor.Initializer.ExtendedAutoTestScenarios() in C:\Implem\Pleasanter.NetCore\Implem.DefinitionAccessor\Initializer.cs:line 257
web               |    at Implem.DefinitionAccessor.Initializer.SetParameters() in C:\Implem\Pleasanter.NetCore\Implem.DefinitionAccessor\Initializer.cs:line 97
web               |    at Implem.DefinitionAccessor.Initializer.Initialize(String path, String assemblyVersion, Boolean codeDefiner, Boolean pleasanterTest, Boolean setSaPassword, Boolean setRandomPassword) in C:\Implem\Pleasanter.NetCore\Implem.DefinitionAccessor\Initializer.cs:line 38
web               |    at Implem.Pleasanter.NetCore.Startup..ctor(IConfiguration configuration, IWebHostEnvironment env) in C:\Implem\Pleasanter.NetCore\Implem.Pleasanter\Startup.cs:line 47
web               |    at System.RuntimeMethodHandle.InvokeMethod(Object target, Span`1& arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
web               |    at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
web               |    at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
web               |    at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
web               |    at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services, Object instance)
web               |    at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__0(HostBuilderContext context, IServiceCollection services)
web               |    at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
web               |    at Microsoft.Extensions.Hosting.HostBuilder.Build()
web               |    at Implem.Pleasanter.NetCore.Program.Main(String[] args) in C:\Implem\Pleasanter.NetCore\Implem.Pleasanter\Program.cs:line 9
web exited with code 139

この原因がわからず、コピーを scp ではなく NAS の GUI から実行したり、ファイルのオーナー、グループやパーミッションをいじったりしましたが、最終的に macOS のリソースファイルが原因であることがわかり ↓ のようにすると正常に起動できるようになりました。[2]

find . -name '._*' | xargs rm

あとは、CodeDefiner をかければ、あっさり起動しました。

バージョン表記のキャプチャ

対策

ここでは、リソースファイルを後から消すということをやりましたが、事象が分かっていれば次のような方法をローカルで対応することで動作する環境上で余計な作業をしなくてすみます。

  • リソースファイルを含めずに圧縮する
    • COPYFILE_DISABLE=1 tar -zcf pleasanter.tar.gz --exclude ".DS_Store" pleasanter
  • gnutar を使う
    • brew install gnu-tar
    • gtar -zvcf pleasanter.tar.gz pleasanter

まとめ

  • 去年作ったツールが動いて満足
    • 本家のサイトがダウンロードページを隠蔽してるので、ツール作っといてホントよかった
  • 意味不明なエラーになったときも色々と探ってみると案外なんとかなる
    • あんまり mac で環境構築して本番に持っていく人はいないと思うが、もしかして誰か同じ問題をかかえた人にヒントになれば幸いです。
docker --version
Docker version 20.10.3, build 55f0773
脚注
  1. NAS の docker のバージョンが古いため docker-compose を使っています。 ↩︎

  2. 実際には"SentAcceptanceMail .json"というスペースを含むファイルがそのままではうまく消せなかったので、個別に削除コマンドを実行しました。 ↩︎

GitHubで編集を提案

Discussion