Pleasanter をバージョンアップしようとしたら思わぬところでエラーになった
これは2023 個人アドベントカレンダーの 1 日目の記事です。
tl;dr
- 去年作ったアップグレードツールは引き続き使えた
- macOS で特に手当てなく圧縮して、展開した
._*
のリソースファイルで docker の dotnet を起動すると NullReference エラーが発生する
今回の目的
アドベントカレンダーに向けて、手元のプリザンターをアップグレードしようと思いました。
手元環境は Synology の NAS 内の Docker コンテナで動かしているのですが、同じアプリケーションのソースがローカルにあるため、ローカルでアップグレードしてから NAS 環境をアップグレードする流れで作業しました。
ローカルでアップグレード
ここからダウンロードして ↓ を実行
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
-
NAS の docker のバージョンが古いため
docker-compose
を使っています。 ↩︎ -
実際には"SentAcceptanceMail .json"というスペースを含むファイルがそのままではうまく消せなかったので、個別に削除コマンドを実行しました。 ↩︎
Discussion