Webserver スタックのアップグレード時のプロセスと学び - Django のアップグレード (1.11 から 3.1)

Published on 09 March 2021 in Version 4.10 / Development - 5 minutes read - Last modified on 19 April 2021 - Read in en

Hue プロジェクトは約10年前 に開始されました。その間にいくつかの技術が古くなったり、非推奨になったりしたため、HUE の明るい未来のためにそれらをアップグレードする必要がありました。その中でも Django のアップグレードは最も重要な者の一つでした。アップグレード前は Django 1.11 を使用していましたが、2020年4月に延長サポートが終了しました。 Djangoのロードマップ

ゴール

  • 1.11 のコンパイル/事項が可能ななま Django 3.1 (最新) で Hue が動作すること。

アップグレードの理由

  • 古いバージョンである Django 1.11 は非推奨です。(例: セキュリティアップグレードや改善が受けられなくなります)。
  • Django 1.11 には Python 2 が必要ですが、これも非推奨です。
  • 新しい機能、バグフィックス、改善が追加されています。
  • 新しい Django のリリースが利用可能になるたびにアップグレードすると、コードベースを最新に保つことができ、将来のアップグレードの負担が軽減されます。
  • 古いバージョンの Django をサポートしていない機能やライブラリもあります。(例: DjangoRest framework)。

課題

  • 下位互換性を壊さないようにする。すなわち、同じコードベースで両方のバージョンをサポートする(選択肢がない場合は sys.version_info[0] < 3 スイッチを使用する)。
  • 私たちの製品の依存関係の中には Django の新しいバージョンをまだサポートしていなものがあります。このような場合は、依存関係がある製品の新しいバージョンがリリースされるまで待たなければならないかもしれません。

計画

  • 大きなトレードオフ:
    • Hue の Python 3 のビルドは Django 3 に移行する
    • Python 2 は Django 1.11 のまま (Django 1.11 は Python 2 をサポートする最新バージョンなので)
  • ゆっくりではあるがしかし完璧に、後戻りしないように、私たちは Django を 1.11から 2.0、2.0から2.1、2.1から2.2、2.2から3.0、3.0から3.1へと段階的にアップグレードすることにしました。
  • 次のバージョンにアップグレードする前に、現在の Django のバージョンで発生した deprecation の警告を解決し、google sheet に保存します。
  • 警告を解決したら、計画通りに Django を次のバージョンへとアップグレードします。
  • 両方のバージョン(最後のバージョンとアップグレードしたバージョン)について、全てのユニットテストを実行します。テストが失敗した場合は、ユニットテストかアップグレードした関連部分の何かを修正する必要があります。
  • ビルド、パッケージ化、テストを行うための一貫した自動化の方法として CircleCI を使用しています。
    • Passed CircleCi
    • 各コミットは CircleCI をパスしており、上のスクリーンショットでは CircleCI が両方のバージョン(build-py3.6 -> Django 3 and build -> Django 1.11)のコードをチェックしていることがわかります。
    • Failed CircleCi
    • そして、このスクリーンショットでは、Django 1.11 (build) でコミットが失敗していることがわかります。これは、私たちのコードが Django 1.11 で失敗していることを示しているので、それに応じてコードを変更する必要があります。
  • 以上の手順を毎回行えば、新しいバージョンに対応することができます。
  • Rinse and repeat (訳注: リンスは2度をお勧めします) :)

主な変更と学んだこと

  • Django 1.11 から 2.0

    • この移行では、主に2種類のアップグレードの修正が必要です
      • 機能的な引数の追加や非推奨
      • 古い依存関係が新しいバージョンの Django をサポートしていない
    • しかし、“settings.MIDDLEWARE_CLASSES を使った古い形式のミドルウェアは非推奨” という大きな変更点があったので、2つの方法がありました。
      • 自分でミドルウェアを書く。
      • Django 1.10 形式のミドルウェアをアップグレードする。
    • 私たちは後方互換性を求めているので後者の方法をとり、instructionsに注意深く従いました。
  • Django 2.0 から 2.1

    • このアップグレードでは、“desktop.auth.backend.AllowFirstUserDjangoBackend.authenticate() が位置的な request 引数 を受け入れる必要がある“ という大きな変更があり、Python 2 + Django 1.11 と Python 3 + Django 2.1 の両方でコンパイルできるようにすることが課題となったので、sys.version_info[0] フラグ (つまり Python のバージョン) を使ってこの問題を解決しました。
      • しかし、上記のアップグレードの際、LDAP 認証機能を見落としていたため、Django 3 になってからこの問題が発生しました。この問題は解決できましたが、本当の教訓は、可能な限り全てのものにユニットテストを追加することで、LDAP 認証用のモックユニットテストを追加しました。
  • Django 2.1 から 2.2

    • 大きな問題は Django の admin アプリに関するものでした。基本的に Django 2.2 では admin アプリでエラーが発生していたので、mako テンプレートが原因ではないかと考えましたが、Django admin をそのようには使用しておらず、mako をVue.js に置き換えることもしていなかったので、これを無効化して、将来必要にあったら追加することを考えて進めました。
  • Django 2.2 から 3.0

    • この移行では、‘django-babel’ という名前のサードパーティの依存関係が Django 2.2 までしかサポートしていないというエラーが出ました。議論の結果、フォークして setup.py ファイルを適宜変更すれば Django 3.0 で動作するようになることがわかりました。
  • Django 3.0 から 3.1

    • 大きな変更はなく、‘STATICFILES_STORAGE’ が CachedStaticFilesStorage からManifestStaticFilesStorage に変わっただけでした。

それでは Hue with Django 3 を試してみましょう!

git clone https://github.com/cloudera/hue.git   # Clone the Hue repository
export PYTHON_VER=python3.8                     # Before build set the Pyhton_VER like
make apps                                       # build the apps
./build/env/bin/hue runserver

注: 問題が発生した場合はこちらのリンクを参照して下さい。



ご意見や質問がありましたらお気軽にこちら、あるいは Discussions までコメントして下さい。quick start で SQL をクエリして下さい!

どうぞよろしくお願いします!

Ayush from the Hue Team


comments powered by Disqus

More recent stories

23 April 2021
ユーザーに資格情報キーを与えずにS3ファイルへの適切なアクセスを提供する
Read More
19 April 2021
コンテナーアプリをパッケージとして配布する
Read More
09 April 2021
SQL クエリと結果を Slack で直接コラボレートしましょう!
Read More