Docker+Odoo+VSCodeでOdooのAddOn開発をする準備
Dockerで動いているOdooでAddOn開発環境を整えてみました。
まず、Docker-composeを使ってOdooが動作するようにする必要があります。以下の記事を参考にDcoker-composeでOdooが動くようにしてください。
DockerでのOdoo開発環境を整える
まずDockerで開発できるように開発環境を整えます。
VSCodeを動かすためのボリューム作成
docker-compose.ymlを編集して、VSCode用のボリュームを作成しました。
odoo-vscodeとodoo-home を追加しています。
docker-composeでコンテナをリスタートします。
エラーなくVolumeが追加されたようです。
VSCodeでリモート開発できるようにする
VSCodeから別のサーバーやDockerコンテナ、仮想マシンに接続して,
あたかもローカルマシンで開発しているかのように操作できる機能がVSCodeにはあります。
拡張機能"Remote-Containers"をVSCodeにインストールしておきます。
"Remote-Containers"をインストールすると、リモートエクスプローラーがVSCodeの画面に追加されます。
リモートエクスプローラ上部のドロップダウンから”Containers”を選ぶと、Dockerのコンテナ一覧が表示されます。
Odooのコンテナに接続します。
コンテナ一覧からodoo14-docker-compose の右に表示される"Attach to Container"のアイコンをクリックします。
コンテナに接続すると任意のコードが実行される可能性があります。信頼できるコンテナのみに接続しましょう。というメッセージが表示されます。
VSCodeの新しいウィンドウが開いてコンテナに接続し、必要なユーティリティ類のインストールを自動的に開始します。
ユーティリティのインストールが完了したら、/opt/odooを開きます。
このディレクトリ内の.vscodeは、Docker-composeでボリュームodoo-vscodeに割り当てられています。
"/opt/odoo/custom-addons"をOdooのaddonディレクトリに追加
カスタムAddOnを保存するディレクトリをAddOnフォルダとしてOdooに知らせるために、odoo.confを書き換えます。
Dockerイメージ内のodoo.confとは違う独自のodoo.confを使用したい場合は、ホスト側ディレクトリをマウントするようにdocker-compose.ymlを変更します。(Odoo公式Dockerイメージのページ参照: Run odoo with a custom configurationの部分)
Odooコンテナの/etc/odoo/odoo.conf をホスト側の任意のディレクトリにコピーして、そのディレクトリをマウントしました。
- ~/Documents/odoo/config:/etc/odoo # for odoo.conf
ローカルのodoo.confに"/opt/odoo/custom-addons"を追加します。
addons_path = /mnt/extra-addons,/opt/odoo/custom-addons
Docker のログで起動時にAddOnのパスが追加されている事を確認します。
2022-04-18 18:20:03,124 1 INFO ? odoo: Odoo version 14.0-20220401
2022-04-18 18:20:03,127 1 INFO ? odoo: Using configuration file at /etc/odoo/odoo.conf
2022-04-18 18:20:03,128 1 INFO ? odoo: addons paths: ['/usr/lib/python3/dist-packages/odoo/addons', '/var/lib/odoo/addons/14.0', '/mnt/extra-addons', '/opt/odoo/custom-addons']
中身が空のモジュールを作ってOdooにインストール
odooの実行ファイルにはモジュールの雛形を作る機能があります。この機能を使ってモジュールを作ってみます。
$ cd /opt/odoo/custom-addons
$ odoo scaffold my_module
このコマンドでmy_moduleというディレクトリ内にモジュールの雛形が作られます。
Odooのアプリで空のモジュールをインストール
開発者モードを有効にしてOdooのアプリ管理へ行き、"アプリリストを更新"します。
アプリのインストールについて、詳しくはこちらの記事を参照してください。
未インストールで"my"を検索すると"my_module"が表示されます。
インストールを実行してみて、エラーがなくディスカスアプリの画面に切り替わったら成功です。
アンインストールもできるか確認しておきましょう。
コンテナでPythonデバッグができるようにする
OdooコンテナにVSCodeのPython拡張機能をインストールして、VSCodeからOdooを起動できるようにします。
まず、Odooのコンテナに接続しているVSCodeのExtensionでPython Extension Packを検索し、インストールします。
そのほかお勧めされるPython関連のExtensionもインストールしておきます。
これらのファイルは/rootにインストールされます。
VSCodeのデバッガからOdooを起動できるようにする
Docker hubにあるOdoo公式のイメージでは、Odooが自動的に立ち上がるようになっています。このままだとOdooのプロセスにデバッガを接続できず、VSCodeのリモート開発ではデバッグできません。VSCodeからOdooを起動してデバッガが使えるようにします。
デバッグをしたいときは、VSCodeからdevcontainerを使ってデバッグ用にOdooのコンテナを起動します。
docker-compose.ymlのフォルダに.devcontainerを追加する
VSCodeのdevcontainerを使うことで、元のdocker-compose.ymlファイルを生かしたまま、VSCodeのリモートデバッグ用のdocker-compose.ymlを自動生成できます。
docker-compose.ymlのフォルダでコマンドパレットを開き"Add Development Container Configuration Files…"を選びます。
From 'docker-compose.yml'を選んで、docker-compose.ymlファイルを参照する形でdevcontainerを追加します。
VSCodeで開けるようにするコンテナを選択します。ここは"odoo"を選択。
devcontainerの設定ファイルができると、VSCodeがコンテナを開くか聞いてきます。
以上の設定でVSCodeからOdooのコンテナを起動した時にはデバッグが可能となりました。
devcontainerでOdooコンテナの起動時にPythonのモジュールやgitをインストール
VSCodeでリモート開発する際には、Pythonの追加のパッケージを追加する必要がある場合が多いです。また、OdooのDockerイメージに入っていないGitなどのユーティリティもインストールできるようにします。
devcontainer.jsonファイル内の"postCreateCommand"で必要なPythonモジュールやユーティリティをインストールします。
"postCreateCommand": "python3 -m pip install pip --upgrade && python3 -m pip install -r /etc/odoo/requirements.txt && apt-get update && apt-get install -y git",
VSCodeからOdooコンテナへ接続
VSCodeで.devcontainerがあるディレクトリを開くと、コンテナを開いてリモートで接続するか聞かれます。
"Reopen in Container"を選ぶと、コンテナを自動的に起動して接続してくれます。
VSCodeでlaunch.jsonを追加
VSCodeからOdooコンテナに接続し、/opt/odooを開きます。
ここにlaunch.jsonを追加してodooを起動できるようにします。
実行とデバッグ(Launch & Debug)からlaunch.jsonを追加します。
launch.jsonは以下のようにしました。programの部分にはodooの実行ファイルを指定します。
環境変数名は、Dockerイメージのドキュメントを参照して設定しました。
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Odoo",
"type": "python",
"request": "launch",
"cwd": "${workspaceRoot}",
"program": "/usr/bin/odoo",
"args": [
"--db_host=${env:HOST}",
"--db_port=${env:PORT}",
"--db_user=${env:USER}",
"--db_password=${env:PASSWORD}",
"--database=Odoo14",
"--limit-time-real=100000"
],
"console": "integratedTerminal"
}
]
}
launch.jsonを保存すると、実行とデバッグ(Launch & Debug)上部に"Odoo"という構成が表示されるので実行します。
ターミナルにエラーが表示されずodooが立ち上がったら成功です。
ブラウザからOdooにアクセスできることも確認します。
Odooコンテナからgitでssh接続できるようにする
ローカルではSSHの設定が終わってgit push/pullができるようになっていることとします。
確認方法:
$ ssh -T git@github.com
Hi tkuratty! You've successfully authenticated, but GitHub does not provide shell access.
sshの設定ファイルにgithub.comの設定を追加し、AddKeysToAgentでssh-agentにキーを渡すように設定します。
Host github.com
User [your user name]
Hostname github.com
Port 22
UseKeychain yes
AddKeysToAgent yes
IdentityFile "/Users/[your home]/.ssh/id_rsa"
VSCodeからOdooのコンテナに接続して、ターミナルで接続確認をしてみます。
root@xxxxxxxx:/opt/odoo# ssh -T git@github.com
Hi tkuratty! You've successfully authenticated, but GitHub does not provide shell access.
中身が空のモジュールをgithubにpushできるか確認
VSCodeで、先ほど作った空のモジュールのフォルダへ移動します。
Python用の.gitignoreを追加して、ソース管理を開きます。
GitHubに公開を選択します。
リポジトリの名前とPublic/Privateの公開範囲を決めれば、GitHubで公開和ることができます。簡単。
これで、Dockerを使ってOdooの自作モジュールやOCAで公開されているモジュールを開発することができそうです。
docker-compose.ymlと参考資料
docker-compose.ymlとサンプルの設定ファイルは、こちらのリポジトリからダウンロードできます。
今回の作業を行うにあたって、以下の記事を参考にしました。